summaryrefslogtreecommitdiff
path: root/unittests/Utility/ReproducerTest.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-01-19 10:06:29 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-01-19 10:06:29 +0000
commit94994d372d014ce4c8758b9605d63fae651bd8aa (patch)
tree51c0b708bd59f205d6b35cb2a8c24d62f0c33d77 /unittests/Utility/ReproducerTest.cpp
parent39be7ce23363d12ae3e49aeb1fdb2bfeb892e836 (diff)
Notes
Diffstat (limited to 'unittests/Utility/ReproducerTest.cpp')
-rw-r--r--unittests/Utility/ReproducerTest.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/unittests/Utility/ReproducerTest.cpp b/unittests/Utility/ReproducerTest.cpp
new file mode 100644
index 000000000000..aadb92b21843
--- /dev/null
+++ b/unittests/Utility/ReproducerTest.cpp
@@ -0,0 +1,134 @@
+//===-- ReproducerTest.cpp --------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "llvm/Support/Error.h"
+#include "llvm/Testing/Support/Error.h"
+
+#include "lldb/Utility/FileSpec.h"
+#include "lldb/Utility/Reproducer.h"
+
+using namespace llvm;
+using namespace lldb_private;
+using namespace lldb_private::repro;
+
+class DummyProvider : public repro::Provider<DummyProvider> {
+public:
+ static constexpr const char *NAME = "dummy";
+
+ DummyProvider(const FileSpec &directory) : Provider(directory) {
+ m_info.name = "dummy";
+ m_info.files.push_back("dummy.yaml");
+ }
+
+ static char ID;
+};
+
+class DummyReproducer : public Reproducer {
+public:
+ DummyReproducer() : Reproducer(){};
+
+ using Reproducer::SetCapture;
+ using Reproducer::SetReplay;
+};
+
+char DummyProvider::ID = 0;
+
+TEST(ReproducerTest, SetCapture) {
+ DummyReproducer reproducer;
+
+ // Initially both generator and loader are unset.
+ EXPECT_EQ(nullptr, reproducer.GetGenerator());
+ EXPECT_EQ(nullptr, reproducer.GetLoader());
+
+ // Enable capture and check that means we have a generator.
+ EXPECT_THAT_ERROR(reproducer.SetCapture(FileSpec("/bogus/path")),
+ Succeeded());
+ EXPECT_NE(nullptr, reproducer.GetGenerator());
+ EXPECT_EQ(FileSpec("/bogus/path"), reproducer.GetGenerator()->GetRoot());
+ EXPECT_EQ(FileSpec("/bogus/path"), reproducer.GetReproducerPath());
+
+ // Ensure that we cannot enable replay.
+ EXPECT_THAT_ERROR(reproducer.SetReplay(FileSpec("/bogus/path")), Failed());
+ EXPECT_EQ(nullptr, reproducer.GetLoader());
+
+ // Ensure we can disable the generator again.
+ EXPECT_THAT_ERROR(reproducer.SetCapture(llvm::None), Succeeded());
+ EXPECT_EQ(nullptr, reproducer.GetGenerator());
+ EXPECT_EQ(nullptr, reproducer.GetLoader());
+}
+
+TEST(ReproducerTest, SetReplay) {
+ DummyReproducer reproducer;
+
+ // Initially both generator and loader are unset.
+ EXPECT_EQ(nullptr, reproducer.GetGenerator());
+ EXPECT_EQ(nullptr, reproducer.GetLoader());
+
+ // Expected to fail because we can't load the index.
+ EXPECT_THAT_ERROR(reproducer.SetReplay(FileSpec("/bogus/path")), Failed());
+ // However the loader should still be set, which we check here.
+ EXPECT_NE(nullptr, reproducer.GetLoader());
+
+ // Make sure the bogus path is correctly set.
+ EXPECT_EQ(FileSpec("/bogus/path"), reproducer.GetLoader()->GetRoot());
+ EXPECT_EQ(FileSpec("/bogus/path"), reproducer.GetReproducerPath());
+
+ // Ensure that we cannot enable replay.
+ EXPECT_THAT_ERROR(reproducer.SetCapture(FileSpec("/bogus/path")), Failed());
+ EXPECT_EQ(nullptr, reproducer.GetGenerator());
+}
+
+TEST(GeneratorTest, Create) {
+ DummyReproducer reproducer;
+
+ EXPECT_THAT_ERROR(reproducer.SetCapture(FileSpec("/bogus/path")),
+ Succeeded());
+ auto &generator = *reproducer.GetGenerator();
+
+ auto *provider = generator.Create<DummyProvider>();
+ EXPECT_NE(nullptr, provider);
+ EXPECT_EQ(FileSpec("/bogus/path"), provider->GetRoot());
+ EXPECT_EQ(std::string("dummy"), provider->GetInfo().name);
+ EXPECT_EQ((size_t)1, provider->GetInfo().files.size());
+ EXPECT_EQ(std::string("dummy.yaml"), provider->GetInfo().files.front());
+}
+
+TEST(GeneratorTest, Get) {
+ DummyReproducer reproducer;
+
+ EXPECT_THAT_ERROR(reproducer.SetCapture(FileSpec("/bogus/path")),
+ Succeeded());
+ auto &generator = *reproducer.GetGenerator();
+
+ auto *provider = generator.Create<DummyProvider>();
+ EXPECT_NE(nullptr, provider);
+
+ auto *provider_alt = generator.Get<DummyProvider>();
+ EXPECT_EQ(provider, provider_alt);
+}
+
+TEST(GeneratorTest, GetOrCreate) {
+ DummyReproducer reproducer;
+
+ EXPECT_THAT_ERROR(reproducer.SetCapture(FileSpec("/bogus/path")),
+ Succeeded());
+ auto &generator = *reproducer.GetGenerator();
+
+ auto &provider = generator.GetOrCreate<DummyProvider>();
+ EXPECT_EQ(FileSpec("/bogus/path"), provider.GetRoot());
+ EXPECT_EQ(std::string("dummy"), provider.GetInfo().name);
+ EXPECT_EQ((size_t)1, provider.GetInfo().files.size());
+ EXPECT_EQ(std::string("dummy.yaml"), provider.GetInfo().files.front());
+
+ auto &provider_alt = generator.GetOrCreate<DummyProvider>();
+ EXPECT_EQ(&provider, &provider_alt);
+}