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