forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- SubsystemRAIITest.cpp ---------------------------------------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "gtest/gtest-spi.h"
 | 
						|
#include "gtest/gtest.h"
 | 
						|
 | 
						|
#include "TestingSupport/SubsystemRAII.h"
 | 
						|
 | 
						|
using namespace lldb_private;
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
enum class SystemState {
 | 
						|
  /// Start state of the subsystem.
 | 
						|
  Start,
 | 
						|
  /// Initialize has been called but Terminate hasn't been called yet.
 | 
						|
  Initialized,
 | 
						|
  /// Terminate has been called.
 | 
						|
  Terminated
 | 
						|
};
 | 
						|
 | 
						|
struct TestSubsystem {
 | 
						|
  static SystemState state;
 | 
						|
  static void Initialize() {
 | 
						|
    assert(state == SystemState::Start);
 | 
						|
    state = SystemState::Initialized;
 | 
						|
  }
 | 
						|
  static void Terminate() {
 | 
						|
    assert(state == SystemState::Initialized);
 | 
						|
    state = SystemState::Terminated;
 | 
						|
  }
 | 
						|
};
 | 
						|
} // namespace
 | 
						|
 | 
						|
SystemState TestSubsystem::state = SystemState::Start;
 | 
						|
 | 
						|
TEST(SubsystemRAIITest, NormalSubsystem) {
 | 
						|
  // Tests that SubsystemRAII handles Initialize functions that return void.
 | 
						|
  EXPECT_EQ(SystemState::Start, TestSubsystem::state);
 | 
						|
  {
 | 
						|
    SubsystemRAII<TestSubsystem> subsystem;
 | 
						|
    EXPECT_EQ(SystemState::Initialized, TestSubsystem::state);
 | 
						|
  }
 | 
						|
  EXPECT_EQ(SystemState::Terminated, TestSubsystem::state);
 | 
						|
}
 | 
						|
 | 
						|
static const char *SubsystemErrorString = "Initialize failed";
 | 
						|
 | 
						|
namespace {
 | 
						|
struct TestSubsystemWithError {
 | 
						|
  static SystemState state;
 | 
						|
  static bool will_fail;
 | 
						|
  static llvm::Error Initialize() {
 | 
						|
    assert(state == SystemState::Start);
 | 
						|
    state = SystemState::Initialized;
 | 
						|
    if (will_fail)
 | 
						|
      return llvm::make_error<llvm::StringError>(
 | 
						|
          SubsystemErrorString, llvm::inconvertibleErrorCode());
 | 
						|
    return llvm::Error::success();
 | 
						|
  }
 | 
						|
  static void Terminate() {
 | 
						|
    assert(state == SystemState::Initialized);
 | 
						|
    state = SystemState::Terminated;
 | 
						|
  }
 | 
						|
  /// Reset the subsystem to the default state for testing.
 | 
						|
  static void Reset() { state = SystemState::Start; }
 | 
						|
};
 | 
						|
} // namespace
 | 
						|
 | 
						|
SystemState TestSubsystemWithError::state = SystemState::Start;
 | 
						|
bool TestSubsystemWithError::will_fail = false;
 | 
						|
 | 
						|
TEST(SubsystemRAIITest, SubsystemWithErrorSuccess) {
 | 
						|
  // Tests that SubsystemRAII handles llvm::success() returned from
 | 
						|
  // Initialize.
 | 
						|
  TestSubsystemWithError::Reset();
 | 
						|
  EXPECT_EQ(SystemState::Start, TestSubsystemWithError::state);
 | 
						|
  {
 | 
						|
    TestSubsystemWithError::will_fail = false;
 | 
						|
    SubsystemRAII<TestSubsystemWithError> subsystem;
 | 
						|
    EXPECT_EQ(SystemState::Initialized, TestSubsystemWithError::state);
 | 
						|
  }
 | 
						|
  EXPECT_EQ(SystemState::Terminated, TestSubsystemWithError::state);
 | 
						|
}
 | 
						|
 | 
						|
TEST(SubsystemRAIITest, SubsystemWithErrorFailure) {
 | 
						|
  // Tests that SubsystemRAII handles any errors returned from
 | 
						|
  // Initialize.
 | 
						|
  TestSubsystemWithError::Reset();
 | 
						|
  EXPECT_EQ(SystemState::Start, TestSubsystemWithError::state);
 | 
						|
  TestSubsystemWithError::will_fail = true;
 | 
						|
  EXPECT_FATAL_FAILURE(SubsystemRAII<TestSubsystemWithError> subsystem,
 | 
						|
                       SubsystemErrorString);
 | 
						|
}
 |