Added basic unit test for llvm-cov.

This test compares the output of llvm-cov against a coverage file
generated by gcov. Currently, llvm-cov does not work on certain
platforms (namely big-endian architectures such as PowerPC, among
others). These platforms are marked as XFAIL for now, but will be fixed
later.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194616 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yuchen Wu 2013-11-13 22:50:15 +00:00
parent f44941d81d
commit 86e37f567b
7 changed files with 171 additions and 0 deletions

View File

@ -0,0 +1,7 @@
These inputs were pre-generated to allow for easier testing of llvm-cov.
test.gcno and test.gcda were create by running clang:
clang++ -g -ftest-coverage -fprofile-arcs test.cpp
test.cpp.gcov was created by running gcov 4.2.1:
gcov test.cpp

View File

@ -0,0 +1,77 @@
#include <cstdlib>
bool on = false;
int len = 42;
double grid[10][10] = {0};
const char * hello = "world";
const char * world = "hello";
struct A {
virtual void B();
};
void A::B() {}
void useless() {}
double more_useless() {
return 0;
}
int foo() {
on = true;
return 3;
}
int bar() {
len--;
return foo() + 45;
}
void assign(int ii, int jj) {
grid[ii][jj] = (ii+1) * (jj+1);
}
void initialize_grid() {
for (int ii = 0; ii < 2; ii++)
for (int jj = 0; jj < 2; jj++)
assign(ii, jj);
}
int main() {
initialize_grid();
int a = 2;
on = rand() % 2;
if (on) {
foo();
++a;
} else {
bar();
a += rand();
}
for (int ii = 0; ii < 10; ++ii) {
switch (rand() % 5) {
case 0:
a += rand();
break;
case 1:
case 2:
a += rand() / rand();
break;
case 3:
a -= rand();
break;
default:
a = -1;
}
}
A thing;
for (uint64_t ii = 0; ii < 4294967296; ++ii)
thing.B();
return a + 8 + grid[2][3] + len;
return more_useless();
}

View File

@ -0,0 +1,82 @@
-: 0:Source:test.cpp
-: 0:Graph:test.gcno
-: 0:Data:test.gcda
-: 0:Runs:2
-: 0:Programs:1
-: 1:#include <cstdlib>
-: 2:
-: 3:bool on = false;
-: 4:int len = 42;
-: 5:double grid[10][10] = {0};
-: 6:const char * hello = "world";
-: 7:const char * world = "hello";
-: 8:
4: 9:struct A {
-: 10: virtual void B();
-: 11:};
-: 12:
8589934592: 13:void A::B() {}
-: 14:
#####: 15:void useless() {}
-: 16:
-: 17:double more_useless() {
#####: 18: return 0;
-: 19:}
-: 20:
-: 21:int foo() {
2: 22: on = true;
2: 23: return 3;
-: 24:}
-: 25:
-: 26:int bar() {
#####: 27: len--;
#####: 28: return foo() + 45;
-: 29:}
-: 30:
8: 31:void assign(int ii, int jj) {
8: 32: grid[ii][jj] = (ii+1) * (jj+1);
8: 33:}
-: 34:
-: 35:void initialize_grid() {
12: 36: for (int ii = 0; ii < 2; ii++)
24: 37: for (int jj = 0; jj < 2; jj++)
12: 38: assign(ii, jj);
2: 39:}
-: 40:
-: 41:int main() {
2: 42: initialize_grid();
-: 43:
2: 44: int a = 2;
2: 45: on = rand() % 2;
2: 46: if (on) {
2: 47: foo();
2: 48: ++a;
2: 49: } else {
#####: 50: bar();
#####: 51: a += rand();
-: 52: }
-: 53:
44: 54: for (int ii = 0; ii < 10; ++ii) {
20: 55: switch (rand() % 5) {
-: 56: case 0:
4: 57: a += rand();
4: 58: break;
-: 59: case 1:
-: 60: case 2:
2: 61: a += rand() / rand();
2: 62: break;
-: 63: case 3:
6: 64: a -= rand();
6: 65: break;
-: 66: default:
8: 67: a = -1;
8: 68: }
20: 69: }
-: 70:
2: 71: A thing;
17179869188: 72: for (uint64_t ii = 0; ii < 4294967296; ++ii)
8589934592: 73: thing.B();
-: 74:
2: 75: return a + 8 + grid[2][3] + len;
-: 76: return more_useless();
-: 77:}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
config.suffixes = ['.test']

View File

@ -0,0 +1,4 @@
RUN: cd %p/Inputs && llvm-cov -gcno=test.gcno -gcda=test.gcda \
RUN: | diff test.cpp.gcov -
XFAIL: ppc64-linux-gnu, s390x-linux-gnu, arm