You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
4.1 KiB
101 lines
4.1 KiB
/****************************************************************************** |
|
* |
|
* Copyright (C) 2014 Google, Inc. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at: |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
******************************************************************************/ |
|
|
|
#pragma once |
|
|
|
// Helper macros for stubbing out functions and modules for testing. |
|
|
|
// Stub out a function, with call counting and mode awareness |
|
#define STUB_FUNCTION(ret, name, params) \ |
|
UNUSED_ATTR static int name##_callcount; \ |
|
static ret name params { \ |
|
UNUSED_ATTR int _local_callcount = name##_callcount; \ |
|
name##_callcount++; |
|
|
|
// Expect a certain number of calls to the specified stub function |
|
#define EXPECT_CALL_COUNT(name, count) \ |
|
EXPECT_EQ((count), (name##_callcount)) \ |
|
<< "expected " #name " to be called " #count " times" |
|
|
|
// Reset the call count for the specificed stub function |
|
#define RESET_CALL_COUNT(name) ((name##_callcount) = 0) |
|
|
|
// Use this in a stub function to catch unexpected calls. |
|
// Prints out a nice message including the call count, the |
|
// stub function name, and the mode index (sadly no mode name) |
|
#define UNEXPECTED_CALL \ |
|
EXPECT_TRUE(false) << "unexpected call " << _local_callcount << " to " \ |
|
<< __func__ << " during mode " << (int)_current_mode |
|
|
|
#define MODE_IS(mode) (_current_mode == (mode)) |
|
|
|
// Macro selection helpers |
|
#define OVERLOAD_CAT(A, B) A##B |
|
#define OVERLOAD_SELECT(NAME, NUM) OVERLOAD_CAT(NAME##_, NUM) |
|
#define OVERLOAD_GET_COUNT(_1, _2, _3, _4, _5, _6, COUNT, ...) COUNT |
|
#define OVERLOAD_VA_SIZE(...) OVERLOAD_GET_COUNT(__VA_ARGS__, 6, 5, 4, 3, 2, 1) |
|
#define OVERLOAD_OF(NAME, ...) \ |
|
OVERLOAD_SELECT(NAME, OVERLOAD_VA_SIZE(__VA_ARGS__))(__VA_ARGS__) |
|
|
|
// Use this to branch stub function execution to a specific mode or modes. |
|
// Treat it like an if statement. For example: |
|
// |
|
// DURING(dinner) EXPECT_EQ(bread_pudding, food); |
|
// DURING(midday_snack, midnight_snack) EXPECT_EQ(chocolate, food); |
|
#define DURING(...) OVERLOAD_OF(DURING, __VA_ARGS__) |
|
|
|
#define DURING_1(mode0) if (MODE_IS(mode0)) |
|
#define DURING_2(mode0, mode1) if (MODE_IS(mode0) || MODE_IS(mode1)) |
|
#define DURING_3(mode0, mode1, mode2) \ |
|
if (MODE_IS(mode0) || MODE_IS(mode1) || MODE_IS(mode2)) |
|
#define DURING_4(mode0, mode1, mode2, mode3) \ |
|
if (MODE_IS(mode0) || MODE_IS(mode1) || MODE_IS(mode2) || MODE_IS(mode3)) |
|
#define DURING_5(mode0, mode1, mode2, mode3, mode4) \ |
|
if (MODE_IS(mode0) || MODE_IS(mode1) || MODE_IS(mode2) || MODE_IS(mode3) || \ |
|
MODE_IS(mode4)) |
|
#define DURING_6(mode0, mode1, mode2, mode3, mode4, mode5) \ |
|
if (MODE_IS(mode0) || MODE_IS(mode1) || MODE_IS(mode2) || MODE_IS(mode3) || \ |
|
MODE_IS(mode4) || MODE_IS(mode5)) |
|
|
|
// Use this to branch stub function exeuction to a specific call |
|
// count index (zero based). Treat it like an if statement. |
|
// Usually most helpful following a DURING clause. For example: |
|
// |
|
// DURING (breakfast) AT_CALL(0) EXPECT_EQ(bacon, food); |
|
// |
|
// or |
|
// |
|
// DURING (three_course_meal) { |
|
// AT_CALL(0) EXPECT_EQ(shrimp_cocktail, food); |
|
// AT_CALL(1) EXPECT_EQ(bacon_wrapped_bacon, food); |
|
// AT_CALL(1) EXPECT_EQ(chocolate_covered_fake_blueberries, food); |
|
// } |
|
#define AT_CALL(index) if (_local_callcount == (index)) |
|
|
|
// Declare all the available test modes for the DURING clauses |
|
// For example: |
|
// |
|
// DECLARE_TEST_MODES(breakfast, lunch, dinner); |
|
#define DECLARE_TEST_MODES(...) \ |
|
typedef enum { __VA_ARGS__ } _test_modes_t; \ |
|
static _test_modes_t _current_mode; |
|
|
|
// Get the current test mode |
|
#define CURRENT_TEST_MODE _current_mode |
|
|
|
#define TEST_MODES_T _test_modes_t
|
|
|