llvm/compiler-rt/test/fuzzer/set_cover_merge.test

RUN: %cpp_compiler %S/FullCoverageSetTest.cpp -o %t-FullCoverageSetTest

RUN: rm -rf %t/T1 %t/T2
RUN: mkdir -p %t/T1 %t/T2
RUN: echo F..... > %t/T1/1
RUN: echo .U.... > %t/T1/2
RUN: echo ..Z... > %t/T1/3

# T1 has 3 elements, T2 is empty.
RUN: %run %t-FullCoverageSetTest         -set_cover_merge=1 %t/T1 %t/T2 2>&1 | FileCheck %s --check-prefix=CHECK1
CHECK1: MERGE-OUTER: 3 files, 3 in the initial corpus
CHECK1: MERGE-OUTER: 0 new files with 0 new features added

RUN: echo ...Z.. > %t/T2/1
RUN: echo ....E. > %t/T2/2
RUN: echo .....R > %t/T2/3
RUN: echo F..... > %t/T2/a
RUN: echo .U.... > %t/T2/b
RUN: echo ..Z... > %t/T2/c

# T1 has 3 elements, T2 has 6 elements, only 3 are new.
RUN: %run %t-FullCoverageSetTest         -set_cover_merge=1 %t/T1 %t/T2 2>&1 | FileCheck %s --check-prefix=CHECK2
CHECK2: MERGE-OUTER: 9 files, 3 in the initial corpus
CHECK2: MERGE-OUTER: 3 new files with 3 new features added

# Now, T1 has 6 units and T2 has no new interesting units.
RUN: %run %t-FullCoverageSetTest         -set_cover_merge=1 %t/T1 %t/T2 2>&1 | FileCheck %s --check-prefix=CHECK3
CHECK3: MERGE-OUTER: 12 files, 6 in the initial corpus
CHECK3: MERGE-OUTER: 0 new files with 0 new features added

RUN: rm -rf %t/T1/* %t/T2/*
RUN: mkdir -p %t/T3
RUN: echo ...... > %t/T1/1
RUN: echo F..... > %t/T2/a
RUN: echo .U.... > %t/T2/b
RUN: echo ..Z... > %t/T2/c
RUN: echo ...Z.. > %t/T3/1
RUN: echo ....E. > %t/T3/2
RUN: echo .....R > %t/T3/3
RUN: echo .UZZER. > %t/T3/a
RUN: echo .UZZER.. > %t/T3/b
RUN: echo ...... > %t/T3/c

# T1 is empty, T2 and T3 have overlapping features. The optimal solution
# consists of 2 files: T2/a, T3/a. These files cover 6 new features.
# Although T3/a is larger in size (1 more byte) we prefer it because
# it covers more features than any other file.
RUN: %run %t-FullCoverageSetTest         -set_cover_merge=1 %t/T1 %t/T2 %t/T3 2>&1 | FileCheck %s --check-prefix=CHECK_OVERLAP
CHECK_OVERLAP: MERGE-OUTER: 10 files, 1 in the initial corpus
CHECK_OVERLAP: MERGE-OUTER: 2 new files with 6 new features added
# Make sure that we are prefering smaller files (T3/a over T3/b).
RUN: diff %t/T1/1b2301992a0266982b135fee5164937d7f7abca3 %t/T3/a

RUN: rm -rf %t/T1/* %t/T2/* %t/T3/*
RUN: echo ...... > %t/T1/1
RUN: echo F..... > %t/T2/a
RUN: echo .U.... > %t/T2/b
RUN: echo ..Z... > %t/T2/c
RUN: echo ...Z.. > %t/T3/1
RUN: echo ....E. > %t/T3/2
RUN: echo .....R > %t/T3/3
RUN: echo .UZZER. > %t/T3/a
RUN: echo .UZZER.. > %t/T3/b
RUN: echo ...... > %t/T3/c

# Test the previous scenario with the '-merge=1' flag.
# Expect more files to be added to the first corpus, since '-merge=1'
# is going to prefer smaller files and ignore the fact that
# T3/a covers almost all of the available features.
RUN: %run %t-FullCoverageSetTest         -merge=1 %t/T1 %t/T2 %t/T3 2>&1 | FileCheck %s --check-prefix=CHECK_OVERLAP2
CHECK_OVERLAP2: MERGE-OUTER: 10 files, 1 in the initial corpus
CHECK_OVERLAP2: MERGE-OUTER: 6 new files with 6 new features added