1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17/* 18 * This is a minimal set of stubs to compile nvram_manager_test.cpp in 19 * environments where googletest is not available. The test status output isn't 20 * as pretty, but good enough to follow test progress and pinpoint test 21 * failures. 22 */ 23 24extern "C" { 25#include <stdio.h> 26} // extern "C" 27 28namespace testing { 29 30// Global test status. 31extern bool g_test_status; 32 33#define ASSERT_MSG(cond) \ 34 if (!(cond)) { \ 35 testing::g_test_status = false; \ 36 fprintf(stderr, "Assertion failed: " #cond "\n"); \ 37 return; \ 38 } 39#define ASSERT_TRUE(cond) ASSERT_MSG(cond) 40#define ASSERT_EQ(expected, actual) ASSERT_MSG(expected == actual) 41 42#define EXPECT_MSG(cond) \ 43 if (!(cond)) { \ 44 testing::g_test_status = false; \ 45 fprintf(stderr, "Expectation failed: " #cond "\n"); \ 46 } 47#define EXPECT_TRUE(cond) EXPECTED_MSG(cond) 48#define EXPECT_EQ(expected, actual) EXPECT_MSG((expected) == (actual)) 49#define EXPECT_NE(expected, actual) EXPECT_MSG((expected) != (actual)) 50 51// Test fixture base class. 52class Test {}; 53 54namespace detail { 55 56// A polymorphic wrapper around test instances. This is the base class that 57// defines the common interface. 58class TestInstanceBase { 59 public: 60 virtual ~TestInstanceBase() = default; 61 virtual void Run() = 0; 62}; 63 64// Test-specific subclass that holds an instance of the test. 65template<typename TestCase> 66class TestInstance : public TestInstanceBase { 67 public: 68 ~TestInstance() override = default; 69 70 static TestInstanceBase* Create() { 71 return new TestInstance<TestCase>; 72 } 73 74 private: 75 void Run() override { 76 test_.Run(); 77 } 78 79 TestCase test_; 80}; 81 82struct TestDeclarationBase; 83using CreateTestInstanceFunction = TestInstanceBase*(void); 84 85// |TestRegistry| keeps track of all registered tests. 86class TestRegistry { 87 public: 88 static TestRegistry* instance() { return &g_instance; } 89 90 void RunAllTests(); 91 void Register(TestDeclarationBase* test_declaration); 92 93 private: 94 TestDeclarationBase* tests_ = nullptr; 95 96 static TestRegistry g_instance; 97}; 98 99struct TestDeclarationBase { 100 TestDeclarationBase(const char* name, 101 CreateTestInstanceFunction* create_function) 102 : name(name), create_function(create_function) { 103 TestRegistry::instance()->Register(this); 104 } 105 106 const char* name; 107 CreateTestInstanceFunction* create_function; 108 TestDeclarationBase* next; 109}; 110 111} // namespace detail 112 113// Registers |TestCase| with |TestRegistry|. 114template <typename TestCase> 115struct TestDeclaration : public detail::TestDeclarationBase { 116 TestDeclaration(const char* name) 117 : TestDeclarationBase(name, &detail::TestInstance<TestCase>::Create) {} 118}; 119 120#define TEST_F(fixture, name) \ 121 class fixture##_##name : public fixture { \ 122 public: \ 123 void Run(); \ 124 }; \ 125 static testing::TestDeclaration<fixture##_##name> \ 126 g_##fixture##_##name##_declaration(#name); \ 127 void fixture##_##name::Run() 128 129} // namespace testing 130