xref: /llvm-project/lldb/unittests/Utility/SubsystemRAIITest.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- SubsystemRAIITest.cpp ---------------------------------------------===//
25dca0596SRaphael Isemann //
35dca0596SRaphael Isemann // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45dca0596SRaphael Isemann // See https://llvm.org/LICENSE.txt for license information.
55dca0596SRaphael Isemann // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65dca0596SRaphael Isemann //
75dca0596SRaphael Isemann //===----------------------------------------------------------------------===//
85dca0596SRaphael Isemann 
95dca0596SRaphael Isemann #include "gtest/gtest-spi.h"
105dca0596SRaphael Isemann #include "gtest/gtest.h"
115dca0596SRaphael Isemann 
125dca0596SRaphael Isemann #include "TestingSupport/SubsystemRAII.h"
135dca0596SRaphael Isemann 
145dca0596SRaphael Isemann using namespace lldb_private;
155dca0596SRaphael Isemann 
165dca0596SRaphael Isemann namespace {
175dca0596SRaphael Isemann 
185dca0596SRaphael Isemann enum class SystemState {
195dca0596SRaphael Isemann   /// Start state of the subsystem.
205dca0596SRaphael Isemann   Start,
215dca0596SRaphael Isemann   /// Initialize has been called but Terminate hasn't been called yet.
225dca0596SRaphael Isemann   Initialized,
235dca0596SRaphael Isemann   /// Terminate has been called.
245dca0596SRaphael Isemann   Terminated
255dca0596SRaphael Isemann };
265dca0596SRaphael Isemann 
275dca0596SRaphael Isemann struct TestSubsystem {
285dca0596SRaphael Isemann   static SystemState state;
Initialize__anond1cec6190111::TestSubsystem295dca0596SRaphael Isemann   static void Initialize() {
305dca0596SRaphael Isemann     assert(state == SystemState::Start);
315dca0596SRaphael Isemann     state = SystemState::Initialized;
325dca0596SRaphael Isemann   }
Terminate__anond1cec6190111::TestSubsystem335dca0596SRaphael Isemann   static void Terminate() {
345dca0596SRaphael Isemann     assert(state == SystemState::Initialized);
355dca0596SRaphael Isemann     state = SystemState::Terminated;
365dca0596SRaphael Isemann   }
375dca0596SRaphael Isemann };
385dca0596SRaphael Isemann } // namespace
395dca0596SRaphael Isemann 
405dca0596SRaphael Isemann SystemState TestSubsystem::state = SystemState::Start;
415dca0596SRaphael Isemann 
TEST(SubsystemRAIITest,NormalSubsystem)425dca0596SRaphael Isemann TEST(SubsystemRAIITest, NormalSubsystem) {
435dca0596SRaphael Isemann   // Tests that SubsystemRAII handles Initialize functions that return void.
445dca0596SRaphael Isemann   EXPECT_EQ(SystemState::Start, TestSubsystem::state);
455dca0596SRaphael Isemann   {
465dca0596SRaphael Isemann     SubsystemRAII<TestSubsystem> subsystem;
475dca0596SRaphael Isemann     EXPECT_EQ(SystemState::Initialized, TestSubsystem::state);
485dca0596SRaphael Isemann   }
495dca0596SRaphael Isemann   EXPECT_EQ(SystemState::Terminated, TestSubsystem::state);
505dca0596SRaphael Isemann }
515dca0596SRaphael Isemann 
525dca0596SRaphael Isemann static const char *SubsystemErrorString = "Initialize failed";
535dca0596SRaphael Isemann 
545dca0596SRaphael Isemann namespace {
555dca0596SRaphael Isemann struct TestSubsystemWithError {
565dca0596SRaphael Isemann   static SystemState state;
575dca0596SRaphael Isemann   static bool will_fail;
Initialize__anond1cec6190211::TestSubsystemWithError585dca0596SRaphael Isemann   static llvm::Error Initialize() {
595dca0596SRaphael Isemann     assert(state == SystemState::Start);
605dca0596SRaphael Isemann     state = SystemState::Initialized;
615dca0596SRaphael Isemann     if (will_fail)
625dca0596SRaphael Isemann       return llvm::make_error<llvm::StringError>(
635dca0596SRaphael Isemann           SubsystemErrorString, llvm::inconvertibleErrorCode());
645dca0596SRaphael Isemann     return llvm::Error::success();
655dca0596SRaphael Isemann   }
Terminate__anond1cec6190211::TestSubsystemWithError665dca0596SRaphael Isemann   static void Terminate() {
675dca0596SRaphael Isemann     assert(state == SystemState::Initialized);
685dca0596SRaphael Isemann     state = SystemState::Terminated;
695dca0596SRaphael Isemann   }
705dca0596SRaphael Isemann   /// Reset the subsystem to the default state for testing.
Reset__anond1cec6190211::TestSubsystemWithError715dca0596SRaphael Isemann   static void Reset() { state = SystemState::Start; }
725dca0596SRaphael Isemann };
735dca0596SRaphael Isemann } // namespace
745dca0596SRaphael Isemann 
755dca0596SRaphael Isemann SystemState TestSubsystemWithError::state = SystemState::Start;
765dca0596SRaphael Isemann bool TestSubsystemWithError::will_fail = false;
775dca0596SRaphael Isemann 
TEST(SubsystemRAIITest,SubsystemWithErrorSuccess)785dca0596SRaphael Isemann TEST(SubsystemRAIITest, SubsystemWithErrorSuccess) {
795dca0596SRaphael Isemann   // Tests that SubsystemRAII handles llvm::success() returned from
805dca0596SRaphael Isemann   // Initialize.
815dca0596SRaphael Isemann   TestSubsystemWithError::Reset();
825dca0596SRaphael Isemann   EXPECT_EQ(SystemState::Start, TestSubsystemWithError::state);
835dca0596SRaphael Isemann   {
845dca0596SRaphael Isemann     TestSubsystemWithError::will_fail = false;
855dca0596SRaphael Isemann     SubsystemRAII<TestSubsystemWithError> subsystem;
865dca0596SRaphael Isemann     EXPECT_EQ(SystemState::Initialized, TestSubsystemWithError::state);
875dca0596SRaphael Isemann   }
885dca0596SRaphael Isemann   EXPECT_EQ(SystemState::Terminated, TestSubsystemWithError::state);
895dca0596SRaphael Isemann }
905dca0596SRaphael Isemann 
TEST(SubsystemRAIITest,SubsystemWithErrorFailure)915dca0596SRaphael Isemann TEST(SubsystemRAIITest, SubsystemWithErrorFailure) {
925dca0596SRaphael Isemann   // Tests that SubsystemRAII handles any errors returned from
935dca0596SRaphael Isemann   // Initialize.
945dca0596SRaphael Isemann   TestSubsystemWithError::Reset();
955dca0596SRaphael Isemann   EXPECT_EQ(SystemState::Start, TestSubsystemWithError::state);
965dca0596SRaphael Isemann   TestSubsystemWithError::will_fail = true;
975dca0596SRaphael Isemann   EXPECT_FATAL_FAILURE(SubsystemRAII<TestSubsystemWithError> subsystem,
985dca0596SRaphael Isemann                        SubsystemErrorString);
995dca0596SRaphael Isemann }
100