102f097e1SDean Michael Berris //===- llvm/unittest/XRay/FDRTraceWriterTest.cpp ----------------*- C++ -*-===//
202f097e1SDean Michael Berris //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
602f097e1SDean Michael Berris //
702f097e1SDean Michael Berris //===----------------------------------------------------------------------===//
802f097e1SDean Michael Berris #include "llvm/XRay/BlockIndexer.h"
902f097e1SDean Michael Berris #include "llvm/XRay/FDRLogBuilder.h"
1002f097e1SDean Michael Berris #include "llvm/XRay/FDRRecords.h"
1102f097e1SDean Michael Berris #include "gmock/gmock.h"
1202f097e1SDean Michael Berris #include "gtest/gtest.h"
1302f097e1SDean Michael Berris
1402f097e1SDean Michael Berris namespace llvm {
1502f097e1SDean Michael Berris namespace xray {
1602f097e1SDean Michael Berris namespace {
1702f097e1SDean Michael Berris
1802f097e1SDean Michael Berris using ::testing::ElementsAre;
1902f097e1SDean Michael Berris using ::testing::Eq;
2002f097e1SDean Michael Berris using ::testing::Field;
2102f097e1SDean Michael Berris using ::testing::Not;
2202f097e1SDean Michael Berris using ::testing::SizeIs;
2302f097e1SDean Michael Berris
2402f097e1SDean Michael Berris // This test ensures that we can index blocks that follow version 3 of the log
2502f097e1SDean Michael Berris // format.
TEST(FDRBlockIndexerTest,IndexBlocksV3)2602f097e1SDean Michael Berris TEST(FDRBlockIndexerTest, IndexBlocksV3) {
2702f097e1SDean Michael Berris auto Block0 = LogBuilder()
2802f097e1SDean Michael Berris .add<BufferExtents>(80)
2902f097e1SDean Michael Berris .add<NewBufferRecord>(1)
3002f097e1SDean Michael Berris .add<WallclockRecord>(1, 2)
3102f097e1SDean Michael Berris .add<PIDRecord>(1)
32d2c50408SDean Michael Berris .add<NewCPUIDRecord>(1, 2)
3302f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
3402f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
3502f097e1SDean Michael Berris .consume();
3602f097e1SDean Michael Berris auto Block1 = LogBuilder()
3702f097e1SDean Michael Berris .add<BufferExtents>(80)
3802f097e1SDean Michael Berris .add<NewBufferRecord>(1)
3902f097e1SDean Michael Berris .add<WallclockRecord>(1, 2)
4002f097e1SDean Michael Berris .add<PIDRecord>(1)
41d2c50408SDean Michael Berris .add<NewCPUIDRecord>(1, 2)
4202f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
4302f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
4402f097e1SDean Michael Berris .consume();
4502f097e1SDean Michael Berris auto Block2 = LogBuilder()
4602f097e1SDean Michael Berris .add<BufferExtents>(80)
4702f097e1SDean Michael Berris .add<NewBufferRecord>(2)
4802f097e1SDean Michael Berris .add<WallclockRecord>(1, 2)
4902f097e1SDean Michael Berris .add<PIDRecord>(1)
50d2c50408SDean Michael Berris .add<NewCPUIDRecord>(2, 2)
5102f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
5202f097e1SDean Michael Berris .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
5302f097e1SDean Michael Berris .consume();
5402f097e1SDean Michael Berris BlockIndexer::Index Index;
5502f097e1SDean Michael Berris BlockIndexer Indexer(Index);
5602f097e1SDean Michael Berris // Iterate through the contrived blocks we have created above.
5702f097e1SDean Michael Berris for (auto B : {std::ref(Block0), std::ref(Block1), std::ref(Block2)}) {
5802f097e1SDean Michael Berris // For each record in the block, we apply the indexer.
5902f097e1SDean Michael Berris for (auto &R : B.get())
6002f097e1SDean Michael Berris ASSERT_FALSE(errorToBool(R->apply(Indexer)));
6102f097e1SDean Michael Berris ASSERT_FALSE(errorToBool(Indexer.flush()));
6202f097e1SDean Michael Berris }
6302f097e1SDean Michael Berris
6402f097e1SDean Michael Berris ASSERT_THAT(Index.size(), Eq(2u));
6502f097e1SDean Michael Berris auto T1Blocks = Index.find({1, 1});
6602f097e1SDean Michael Berris ASSERT_THAT(T1Blocks, Not(Eq(Index.end())));
6702f097e1SDean Michael Berris
6802f097e1SDean Michael Berris // Expect only six records, because we're ignoring the BufferExtents record.
6902f097e1SDean Michael Berris EXPECT_THAT(T1Blocks->second,
7002f097e1SDean Michael Berris ElementsAre(Field(&BlockIndexer::Block::Records, SizeIs(6u)),
7102f097e1SDean Michael Berris Field(&BlockIndexer::Block::Records, SizeIs(6u))));
7202f097e1SDean Michael Berris auto T2Blocks = Index.find({1, 2});
7302f097e1SDean Michael Berris ASSERT_THAT(T2Blocks, Not(Eq(Index.end())));
7402f097e1SDean Michael Berris EXPECT_THAT(T2Blocks->second, ElementsAre(Field(&BlockIndexer::Block::Records,
7502f097e1SDean Michael Berris SizeIs(Eq(6u)))));
7602f097e1SDean Michael Berris }
7702f097e1SDean Michael Berris
7802f097e1SDean Michael Berris // FIXME: Support indexing V2 and V1 blocks.
7902f097e1SDean Michael Berris
8002f097e1SDean Michael Berris } // namespace
8102f097e1SDean Michael Berris } // namespace xray
8202f097e1SDean Michael Berris } // namespace llvm
83