InstrProf: Add some unit tests for CoverageMapping
authorJustin Bogner <mail@justinbogner.com>
Wed, 4 Feb 2015 00:15:12 +0000 (00:15 +0000)
committerJustin Bogner <mail@justinbogner.com>
Wed, 4 Feb 2015 00:15:12 +0000 (00:15 +0000)
The llvm-level tests for coverage mapping need a binary input file,
which means they're hard to understand, hard to update, and it's
difficult to add new ones. By adding some unit tests that build up the
coverage data structures in C++, we can write more meaningful and
targeted tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228084 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/CMakeLists.txt
unittests/Makefile
unittests/ProfileData/CMakeLists.txt [new file with mode: 0644]
unittests/ProfileData/CoverageMappingTest.cpp [new file with mode: 0644]
unittests/ProfileData/Makefile [new file with mode: 0644]

index 19c2d24534b20bd0388299adece0a71e51c47e21..a1272edcc97899a5d0577277b40bf851bee8242b 100644 (file)
@@ -22,5 +22,6 @@ add_subdirectory(LineEditor)
 add_subdirectory(Linker)
 add_subdirectory(MC)
 add_subdirectory(Option)
+add_subdirectory(ProfileData)
 add_subdirectory(Support)
 add_subdirectory(Transforms)
index 603e7d58f8c704909bbf0c81513db1e496d20e4e..fefef0748b961b05d44ed4c7398e079b2c7f8efa 100644 (file)
@@ -10,7 +10,7 @@
 LEVEL = ..
 
 PARALLEL_DIRS = ADT Analysis Bitcode CodeGen DebugInfo ExecutionEngine IR \
-               LineEditor Linker MC Option Support Transforms
+               LineEditor Linker MC Option ProfileData Support Transforms
 
 include $(LEVEL)/Makefile.config
 include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
diff --git a/unittests/ProfileData/CMakeLists.txt b/unittests/ProfileData/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3251ff4
--- /dev/null
@@ -0,0 +1,9 @@
+set(LLVM_LINK_COMPONENTS
+  Core
+  ProfileData
+  Support
+  )
+
+add_llvm_unittest(ProfileDataTests
+  CoverageMappingTest.cpp
+  )
diff --git a/unittests/ProfileData/CoverageMappingTest.cpp b/unittests/ProfileData/CoverageMappingTest.cpp
new file mode 100644 (file)
index 0000000..5477f81
--- /dev/null
@@ -0,0 +1,112 @@
+//===- unittest/ProfileData/CoverageMappingTest.cpp -------------------------=//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ProfileData/CoverageMapping.h"
+#include "llvm/ProfileData/CoverageMappingReader.h"
+#include "llvm/ProfileData/CoverageMappingWriter.h"
+#include "llvm/Support/raw_ostream.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace coverage;
+
+namespace llvm {
+namespace coverage {
+void PrintTo(const Counter &C, ::std::ostream *os) {
+  if (C.isZero())
+    *os << "Zero";
+  else if (C.isExpression())
+    *os << "Expression " << C.getExpressionID();
+  else
+    *os << "Counter " << C.getCounterID();
+}
+}
+}
+
+namespace {
+
+static std::string writeCoverage(MutableArrayRef<CounterMappingRegion> Regions,
+                                 int NumFiles) {
+  SmallVector<unsigned, 8> FileIDs;
+  for (int I = 0; I < NumFiles; ++I)
+    FileIDs.push_back(I);
+
+  std::string Coverage;
+  llvm::raw_string_ostream OS(Coverage);
+  CoverageMappingWriter(FileIDs, None, Regions).write(OS);
+  OS.flush();
+
+  return Coverage;
+}
+
+static std::vector<CounterMappingRegion>
+readCoverageRegions(std::string Coverage, int NumFiles) {
+  SmallVector<std::string, 8> Filenames;
+  SmallVector<StringRef, 8> FilenameRefs;
+  for (int I = 0; I < NumFiles; ++I) {
+    Filenames.push_back("file" + std::to_string(I));
+    FilenameRefs.push_back(Filenames.back());
+  }
+
+  std::vector<StringRef> FuncFiles;
+  std::vector<CounterExpression> Expressions;
+  std::vector<CounterMappingRegion> Regions;
+  RawCoverageMappingReader Reader(Coverage, FilenameRefs, FuncFiles,
+                                  Expressions, Regions);
+  if (Reader.read())
+    // ASSERT doesn't work here, we'll just return an empty vector.
+    Regions.clear();
+  return Regions;
+}
+
+TEST(CoverageMappingTest, basic_write_read) {
+  int NumFiles = 2;
+  CounterMappingRegion InputRegions[] = {
+      CounterMappingRegion::makeRegion(Counter::getCounter(0), 0, 1, 1, 1, 1),
+      CounterMappingRegion::makeRegion(Counter::getCounter(1), 0, 2, 1, 2, 2),
+      CounterMappingRegion::makeRegion(Counter::getZero(), 0, 3, 1, 3, 4),
+      CounterMappingRegion::makeRegion(Counter::getCounter(2), 0, 4, 1, 4, 8),
+      CounterMappingRegion::makeRegion(Counter::getCounter(3), 1, 1, 2, 3, 4),
+  };
+  std::string Coverage = writeCoverage(InputRegions, NumFiles);
+  std::vector<CounterMappingRegion> OutputRegions =
+      readCoverageRegions(Coverage, NumFiles);
+  ASSERT_FALSE(OutputRegions.empty());
+
+  size_t N = makeArrayRef(InputRegions).size();
+  ASSERT_EQ(N, OutputRegions.size());
+  for (size_t I = 0; I < N; ++I) {
+    ASSERT_EQ(InputRegions[I].Count, OutputRegions[I].Count);
+    ASSERT_EQ(InputRegions[I].FileID, OutputRegions[I].FileID);
+    ASSERT_EQ(InputRegions[I].startLoc(), OutputRegions[I].startLoc());
+    ASSERT_EQ(InputRegions[I].endLoc(), OutputRegions[I].endLoc());
+    ASSERT_EQ(InputRegions[I].Kind, OutputRegions[I].Kind);
+  }
+}
+
+TEST(CoverageMappingTest, expansion_gets_first_counter) {
+  int NumFiles = 2;
+  CounterMappingRegion InputRegions[] = {
+      CounterMappingRegion::makeRegion(Counter::getCounter(1), 0, 10, 1, 10, 2),
+      // This starts earlier in file 0, so the expansion should get its counter.
+      CounterMappingRegion::makeRegion(Counter::getCounter(2), 0, 1, 1, 20, 1),
+      CounterMappingRegion::makeExpansion(1, 0, 3, 3, 3, 3),
+  };
+  std::string Coverage = writeCoverage(InputRegions, NumFiles);
+  std::vector<CounterMappingRegion> OutputRegions =
+      readCoverageRegions(Coverage, NumFiles);
+  ASSERT_FALSE(OutputRegions.empty());
+
+  ASSERT_EQ(CounterMappingRegion::ExpansionRegion, OutputRegions[2].Kind);
+  ASSERT_EQ(Counter::getCounter(2), OutputRegions[2].Count);
+  ASSERT_EQ(3U, OutputRegions[2].LineStart);
+}
+
+
+} // end anonymous namespace
diff --git a/unittests/ProfileData/Makefile b/unittests/ProfileData/Makefile
new file mode 100644 (file)
index 0000000..d017c15
--- /dev/null
@@ -0,0 +1,15 @@
+##===- unittests/ProfileData/Makefile ----------------------*- Makefile -*-===##
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../..
+TESTNAME = ProfileData
+LINK_COMPONENTS := ProfileData Core Support
+
+include $(LEVEL)/Makefile.config
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest