1 //===- unittest/ProfileData/SampleProfTest.cpp -------------------*- C++
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #include "llvm/ProfileData/SampleProfReader.h"
12 #include "llvm/ProfileData/SampleProfWriter.h"
13 #include "gtest/gtest.h"
18 using namespace sampleprof;
20 static ::testing::AssertionResult NoError(std::error_code EC) {
22 return ::testing::AssertionSuccess();
23 return ::testing::AssertionFailure() << "error " << EC.value() << ": "
29 struct SampleProfTest : ::testing::Test {
31 std::unique_ptr<raw_ostream> OS;
32 std::unique_ptr<SampleProfileWriter> Writer;
33 std::unique_ptr<SampleProfileReader> Reader;
36 : Data(), OS(new raw_string_ostream(Data)), Writer(), Reader() {}
38 void createWriter(SampleProfileFormat Format) {
39 auto WriterOrErr = SampleProfileWriter::create(OS, Format);
40 ASSERT_TRUE(NoError(WriterOrErr.getError()));
41 Writer = std::move(WriterOrErr.get());
44 void readProfile(std::unique_ptr<MemoryBuffer> &Profile) {
45 auto ReaderOrErr = SampleProfileReader::create(Profile, getGlobalContext());
46 ASSERT_TRUE(NoError(ReaderOrErr.getError()));
47 Reader = std::move(ReaderOrErr.get());
50 void testRoundTrip(SampleProfileFormat Format) {
53 StringRef FooName("_Z3fooi");
54 FunctionSamples FooSamples;
55 FooSamples.addTotalSamples(7711);
56 FooSamples.addHeadSamples(610);
57 FooSamples.addBodySamples(1, 0, 610);
59 StringRef BarName("_Z3bari");
60 FunctionSamples BarSamples;
61 BarSamples.addTotalSamples(20301);
62 BarSamples.addHeadSamples(1437);
63 BarSamples.addBodySamples(1, 0, 1437);
65 StringMap<FunctionSamples> Profiles;
66 Profiles[FooName] = std::move(FooSamples);
67 Profiles[BarName] = std::move(BarSamples);
70 EC = Writer->write(Profiles);
71 ASSERT_TRUE(NoError(EC));
73 Writer->getOutputStream().flush();
75 auto Profile = MemoryBuffer::getMemBufferCopy(Data);
79 ASSERT_TRUE(NoError(EC));
81 StringMap<FunctionSamples> &ReadProfiles = Reader->getProfiles();
82 ASSERT_EQ(2u, ReadProfiles.size());
84 FunctionSamples &ReadFooSamples = ReadProfiles[FooName];
85 ASSERT_EQ(7711u, ReadFooSamples.getTotalSamples());
86 ASSERT_EQ(610u, ReadFooSamples.getHeadSamples());
88 FunctionSamples &ReadBarSamples = ReadProfiles[BarName];
89 ASSERT_EQ(20301u, ReadBarSamples.getTotalSamples());
90 ASSERT_EQ(1437u, ReadBarSamples.getHeadSamples());
94 TEST_F(SampleProfTest, roundtrip_text_profile) {
95 testRoundTrip(SampleProfileFormat::SPF_Text);
98 TEST_F(SampleProfTest, roundtrip_binary_profile) {
99 testRoundTrip(SampleProfileFormat::SPF_Binary);
102 TEST_F(SampleProfTest, sample_overflow_saturation) {
103 const uint64_t Max = std::numeric_limits<uint64_t>::max();
104 sampleprof_error Result;
106 StringRef FooName("_Z3fooi");
107 FunctionSamples FooSamples;
108 Result = FooSamples.addTotalSamples(1);
109 ASSERT_EQ(Result, sampleprof_error::success);
111 Result = FooSamples.addHeadSamples(1);
112 ASSERT_EQ(Result, sampleprof_error::success);
114 Result = FooSamples.addBodySamples(10, 0, 1);
115 ASSERT_EQ(Result, sampleprof_error::success);
117 Result = FooSamples.addTotalSamples(Max);
118 ASSERT_EQ(Result, sampleprof_error::counter_overflow);
119 ASSERT_EQ(FooSamples.getTotalSamples(), Max);
121 Result = FooSamples.addHeadSamples(Max);
122 ASSERT_EQ(Result, sampleprof_error::counter_overflow);
123 ASSERT_EQ(FooSamples.getHeadSamples(), Max);
125 Result = FooSamples.addBodySamples(10, 0, Max);
126 ASSERT_EQ(Result, sampleprof_error::counter_overflow);
127 ErrorOr<uint64_t> BodySamples = FooSamples.findSamplesAt(10, 0);
128 ASSERT_FALSE(BodySamples.getError());
129 ASSERT_EQ(BodySamples.get(), Max);
132 } // end anonymous namespace