SampleProfTest.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //===- unittest/ProfileData/SampleProfTest.cpp -------------------*- C++
  2. //-*-===//
  3. //
  4. // The LLVM Compiler Infrastructure
  5. //
  6. // This file is distributed under the University of Illinois Open Source
  7. // License. See LICENSE.TXT for details.
  8. //
  9. //===----------------------------------------------------------------------===//
  10. #include "llvm/ProfileData/SampleProfReader.h"
  11. #include "llvm/ProfileData/SampleProfWriter.h"
  12. #include "gtest/gtest.h"
  13. #include <cstdarg>
  14. using namespace llvm;
  15. using namespace sampleprof;
  16. static ::testing::AssertionResult NoError(std::error_code EC) {
  17. if (!EC)
  18. return ::testing::AssertionSuccess();
  19. return ::testing::AssertionFailure() << "error " << EC.value() << ": "
  20. << EC.message();
  21. }
  22. namespace {
  23. struct SampleProfTest : ::testing::Test {
  24. std::string Data;
  25. std::unique_ptr<raw_ostream> OS;
  26. std::unique_ptr<SampleProfileWriter> Writer;
  27. std::unique_ptr<SampleProfileReader> Reader;
  28. SampleProfTest()
  29. : Data(), OS(new raw_string_ostream(Data)), Writer(), Reader() {}
  30. void createWriter(SampleProfileFormat Format) {
  31. auto WriterOrErr = SampleProfileWriter::create(OS, Format);
  32. ASSERT_TRUE(NoError(WriterOrErr.getError()));
  33. Writer = std::move(WriterOrErr.get());
  34. }
  35. void readProfile(std::unique_ptr<MemoryBuffer> &Profile) {
  36. auto ReaderOrErr = SampleProfileReader::create(Profile, getGlobalContext());
  37. ASSERT_TRUE(NoError(ReaderOrErr.getError()));
  38. Reader = std::move(ReaderOrErr.get());
  39. }
  40. void testRoundTrip(SampleProfileFormat Format) {
  41. createWriter(Format);
  42. StringRef FooName("_Z3fooi");
  43. FunctionSamples FooSamples;
  44. FooSamples.addTotalSamples(7711);
  45. FooSamples.addHeadSamples(610);
  46. FooSamples.addBodySamples(1, 0, 610);
  47. StringRef BarName("_Z3bari");
  48. FunctionSamples BarSamples;
  49. BarSamples.addTotalSamples(20301);
  50. BarSamples.addHeadSamples(1437);
  51. BarSamples.addBodySamples(1, 0, 1437);
  52. StringMap<FunctionSamples> Profiles;
  53. Profiles[FooName] = std::move(FooSamples);
  54. Profiles[BarName] = std::move(BarSamples);
  55. std::error_code EC;
  56. EC = Writer->write(Profiles);
  57. ASSERT_TRUE(NoError(EC));
  58. Writer->getOutputStream().flush();
  59. auto Profile = MemoryBuffer::getMemBufferCopy(Data);
  60. readProfile(Profile);
  61. EC = Reader->read();
  62. ASSERT_TRUE(NoError(EC));
  63. StringMap<FunctionSamples> &ReadProfiles = Reader->getProfiles();
  64. ASSERT_EQ(2u, ReadProfiles.size());
  65. FunctionSamples &ReadFooSamples = ReadProfiles[FooName];
  66. ASSERT_EQ(7711u, ReadFooSamples.getTotalSamples());
  67. ASSERT_EQ(610u, ReadFooSamples.getHeadSamples());
  68. FunctionSamples &ReadBarSamples = ReadProfiles[BarName];
  69. ASSERT_EQ(20301u, ReadBarSamples.getTotalSamples());
  70. ASSERT_EQ(1437u, ReadBarSamples.getHeadSamples());
  71. }
  72. };
  73. TEST_F(SampleProfTest, roundtrip_text_profile) {
  74. testRoundTrip(SampleProfileFormat::SPF_Text);
  75. }
  76. TEST_F(SampleProfTest, roundtrip_binary_profile) {
  77. testRoundTrip(SampleProfileFormat::SPF_Binary);
  78. }
  79. } // end anonymous namespace