blob: a6e0a8cd38883e9f42ddedcce3e1e334cc0b3769 [file] [log] [blame]
Dean Michael Berris229ad4c2018-09-10 02:35:25 +00001//===- llvm/unittest/XRay/FDRBlockVerifierTest.cpp --------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "llvm/Testing/Support/Error.h"
10#include "llvm/XRay/BlockIndexer.h"
11#include "llvm/XRay/BlockVerifier.h"
12#include "llvm/XRay/FDRLogBuilder.h"
13#include "llvm/XRay/FDRRecords.h"
14#include "gmock/gmock.h"
15#include "gtest/gtest.h"
16
17namespace llvm {
18namespace xray {
19namespace {
20
21using ::testing::ElementsAre;
22using ::testing::Not;
23using ::testing::SizeIs;
24
25TEST(FDRBlockVerifierTest, ValidBlocksV3) {
26 auto Block0 = LogBuilder()
27 .add<BufferExtents>(80)
28 .add<NewBufferRecord>(1)
29 .add<WallclockRecord>(1, 2)
30 .add<PIDRecord>(1)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +000031 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +000032 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
33 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
34 .consume();
35 auto Block1 = LogBuilder()
36 .add<BufferExtents>(80)
37 .add<NewBufferRecord>(1)
38 .add<WallclockRecord>(1, 2)
39 .add<PIDRecord>(1)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +000040 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +000041 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
42 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
43 .consume();
44 auto Block2 = LogBuilder()
45 .add<BufferExtents>(80)
46 .add<NewBufferRecord>(2)
47 .add<WallclockRecord>(1, 2)
48 .add<PIDRecord>(1)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +000049 .add<NewCPUIDRecord>(2, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +000050 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
51 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
52 .consume();
53 BlockIndexer::Index Index;
54 BlockIndexer Indexer(Index);
55 for (auto B : {std::ref(Block0), std::ref(Block1), std::ref(Block2)}) {
56 for (auto &R : B.get())
57 ASSERT_FALSE(errorToBool(R->apply(Indexer)));
58 ASSERT_FALSE(errorToBool(Indexer.flush()));
59 }
60
61 BlockVerifier Verifier;
62 for (auto &ProcessThreadBlocks : Index) {
63 auto &Blocks = ProcessThreadBlocks.second;
64 for (auto &B : Blocks) {
65 for (auto *R : B.Records)
66 ASSERT_FALSE(errorToBool(R->apply(Verifier)));
67 ASSERT_FALSE(errorToBool(Verifier.verify()));
68 Verifier.reset();
69 }
70 }
71}
72
73TEST(FDRBlockVerifierTest, MissingPIDRecord) {
74 auto Block = LogBuilder()
75 .add<BufferExtents>(20)
76 .add<NewBufferRecord>(1)
77 .add<WallclockRecord>(1, 2)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +000078 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +000079 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
80 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
81 .consume();
82 BlockVerifier Verifier;
83 for (auto &R : Block)
84 ASSERT_FALSE(errorToBool(R->apply(Verifier)));
85 ASSERT_FALSE(errorToBool(Verifier.verify()));
86}
87
88TEST(FDRBlockVerifierTest, MissingBufferExtents) {
89 auto Block = LogBuilder()
90 .add<NewBufferRecord>(1)
91 .add<WallclockRecord>(1, 2)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +000092 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +000093 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
94 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
95 .consume();
96 BlockVerifier Verifier;
97 for (auto &R : Block)
98 ASSERT_FALSE(errorToBool(R->apply(Verifier)));
99 ASSERT_FALSE(errorToBool(Verifier.verify()));
100}
101
102TEST(FDRBlockVerifierTest, IgnoreRecordsAfterEOB) {
103 auto Block = LogBuilder()
104 .add<NewBufferRecord>(1)
105 .add<WallclockRecord>(1, 2)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +0000106 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +0000107 .add<EndBufferRecord>()
108 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
109 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
110 .consume();
111 BlockVerifier Verifier;
112 for (auto &R : Block)
113 ASSERT_FALSE(errorToBool(R->apply(Verifier)));
114 ASSERT_FALSE(errorToBool(Verifier.verify()));
115}
116
117TEST(FDRBlockVerifierTest, MalformedV2) {
118 auto Block = LogBuilder()
119 .add<NewBufferRecord>(1)
120 .add<WallclockRecord>(1, 2)
Dean Michael Berris2b5cea52018-09-11 06:36:51 +0000121 .add<NewCPUIDRecord>(1, 2)
Dean Michael Berris229ad4c2018-09-10 02:35:25 +0000122 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
123 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
124 .add<NewBufferRecord>(2)
125 .consume();
126 BlockVerifier Verifier;
127
128 ASSERT_THAT(Block, SizeIs(6u));
129 EXPECT_THAT_ERROR(Block[0]->apply(Verifier), Succeeded());
130 EXPECT_THAT_ERROR(Block[1]->apply(Verifier), Succeeded());
131 EXPECT_THAT_ERROR(Block[2]->apply(Verifier), Succeeded());
132 EXPECT_THAT_ERROR(Block[3]->apply(Verifier), Succeeded());
133 EXPECT_THAT_ERROR(Block[4]->apply(Verifier), Succeeded());
134 EXPECT_THAT_ERROR(Block[5]->apply(Verifier), Failed());
135}
136
137} // namespace
138} // namespace xray
139} // namespace llvm