summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/XRay/FDRBlockVerifierTest.cpp
diff options
context:
space:
mode:
authorDean Michael Berris <dberris@google.com>2018-09-07 02:25:06 +0000
committerDean Michael Berris <dberris@google.com>2018-09-07 02:25:06 +0000
commitb9dd61c13c7c8b353b7ba027f046062668125cd4 (patch)
treef327e256924cd756fc05905b4f33d4cf892fa601 /llvm/unittests/XRay/FDRBlockVerifierTest.cpp
parentd7acacab94f3eac228c7b66a0c76972c7930dc9e (diff)
downloadbcm5719-llvm-b9dd61c13c7c8b353b7ba027f046062668125cd4.tar.gz
bcm5719-llvm-b9dd61c13c7c8b353b7ba027f046062668125cd4.zip
[XRay] Add a BlockVerifier visitor for FDR Records
Summary: This patch implements a `BlockVerifier` type which enforces the invariants of the log structure of FDR mode logs on a per-block basis. This ensures that the data we encounter from an FDR mode log semantically correct (i.e. that records follow the documented "grammar" for FDR mode log records). This is another part of the refactoring of D50441. Reviewers: mboerger, eizan Subscribers: mgorny, hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D51723 llvm-svn: 341628
Diffstat (limited to 'llvm/unittests/XRay/FDRBlockVerifierTest.cpp')
-rw-r--r--llvm/unittests/XRay/FDRBlockVerifierTest.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/llvm/unittests/XRay/FDRBlockVerifierTest.cpp b/llvm/unittests/XRay/FDRBlockVerifierTest.cpp
new file mode 100644
index 00000000000..bc95d1b9ca1
--- /dev/null
+++ b/llvm/unittests/XRay/FDRBlockVerifierTest.cpp
@@ -0,0 +1,139 @@
+//===- llvm/unittest/XRay/FDRBlockVerifierTest.cpp --------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include "llvm/Testing/Support/Error.h"
+#include "llvm/XRay/BlockIndexer.h"
+#include "llvm/XRay/BlockVerifier.h"
+#include "llvm/XRay/FDRLogBuilder.h"
+#include "llvm/XRay/FDRRecords.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace llvm {
+namespace xray {
+namespace {
+
+using ::testing::ElementsAre;
+using ::testing::Not;
+using ::testing::SizeIs;
+
+TEST(FDRBlockVerifierTest, ValidBlocksV3) {
+ auto Block0 = LogBuilder()
+ .add<BufferExtents>(80)
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<PIDRecord>(1)
+ .add<NewCPUIDRecord>(1)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ auto Block1 = LogBuilder()
+ .add<BufferExtents>(80)
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<PIDRecord>(1)
+ .add<NewCPUIDRecord>(1)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ auto Block2 = LogBuilder()
+ .add<BufferExtents>(80)
+ .add<NewBufferRecord>(2)
+ .add<WallclockRecord>(1, 2)
+ .add<PIDRecord>(1)
+ .add<NewCPUIDRecord>(2)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ BlockIndexer::Index Index;
+ BlockIndexer Indexer(Index);
+ for (auto B : {std::ref(Block0), std::ref(Block1), std::ref(Block2)}) {
+ for (auto &R : B.get())
+ ASSERT_FALSE(errorToBool(R->apply(Indexer)));
+ ASSERT_FALSE(errorToBool(Indexer.flush()));
+ }
+
+ BlockVerifier Verifier;
+ for (auto &ProcessThreadBlocks : Index) {
+ auto &Blocks = ProcessThreadBlocks.second;
+ for (auto &B : Blocks) {
+ for (auto *R : B.Records)
+ ASSERT_FALSE(errorToBool(R->apply(Verifier)));
+ ASSERT_FALSE(errorToBool(Verifier.verify()));
+ Verifier.reset();
+ }
+ }
+}
+
+TEST(FDRBlockVerifierTest, MissingPIDRecord) {
+ auto Block = LogBuilder()
+ .add<BufferExtents>(20)
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<NewCPUIDRecord>(1)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ BlockVerifier Verifier;
+ for (auto &R : Block)
+ ASSERT_FALSE(errorToBool(R->apply(Verifier)));
+ ASSERT_FALSE(errorToBool(Verifier.verify()));
+}
+
+TEST(FDRBlockVerifierTest, MissingBufferExtents) {
+ auto Block = LogBuilder()
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<NewCPUIDRecord>(1)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ BlockVerifier Verifier;
+ for (auto &R : Block)
+ ASSERT_FALSE(errorToBool(R->apply(Verifier)));
+ ASSERT_FALSE(errorToBool(Verifier.verify()));
+}
+
+TEST(FDRBlockVerifierTest, IgnoreRecordsAfterEOB) {
+ auto Block = LogBuilder()
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<NewCPUIDRecord>(1)
+ .add<EndBufferRecord>()
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .consume();
+ BlockVerifier Verifier;
+ for (auto &R : Block)
+ ASSERT_FALSE(errorToBool(R->apply(Verifier)));
+ ASSERT_FALSE(errorToBool(Verifier.verify()));
+}
+
+TEST(FDRBlockVerifierTest, MalformedV2) {
+ auto Block = LogBuilder()
+ .add<NewBufferRecord>(1)
+ .add<WallclockRecord>(1, 2)
+ .add<NewCPUIDRecord>(1)
+ .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
+ .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
+ .add<NewBufferRecord>(2)
+ .consume();
+ BlockVerifier Verifier;
+
+ ASSERT_THAT(Block, SizeIs(6u));
+ EXPECT_THAT_ERROR(Block[0]->apply(Verifier), Succeeded());
+ EXPECT_THAT_ERROR(Block[1]->apply(Verifier), Succeeded());
+ EXPECT_THAT_ERROR(Block[2]->apply(Verifier), Succeeded());
+ EXPECT_THAT_ERROR(Block[3]->apply(Verifier), Succeeded());
+ EXPECT_THAT_ERROR(Block[4]->apply(Verifier), Succeeded());
+ EXPECT_THAT_ERROR(Block[5]->apply(Verifier), Failed());
+}
+
+} // namespace
+} // namespace xray
+} // namespace llvm
OpenPOWER on IntegriCloud