1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/* 2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project 3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License"); 5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License. 6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at 7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * http://www.apache.org/licenses/LICENSE-2.0 9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software 11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS, 12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and 14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License. 15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#ifndef CHRE_PLATFORM_LINUX_ASSERT_H_ 18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#define CHRE_PLATFORM_LINUX_ASSERT_H_ 19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include <cassert> 21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 22ca4b8810708327f5bcee3d10ef5e57fe5db06281Mehdi Alizadeh#define CHRE_ASSERT_USES_STDLIB_ASSERT 23ca4b8810708327f5bcee3d10ef5e57fe5db06281Mehdi Alizadeh 24930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#ifdef GTEST 25930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 26930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#include "chre/platform/log.h" 27930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#include "gmock/gmock.h" 28930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 29930807177e49bdec5f3ac78942247a9ee2604639Brian Duddieclass MockAssert; 30930807177e49bdec5f3ac78942247a9ee2604639Brian Duddieextern MockAssert *gMockAssert; 31930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 32930807177e49bdec5f3ac78942247a9ee2604639Brian Duddieclass AssertInterface { 33930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie public: 34930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie virtual void doAssert() = 0; 35930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie}; 36930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 37930807177e49bdec5f3ac78942247a9ee2604639Brian Duddieclass MockAssert : public AssertInterface { 38930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie public: 39930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie MockAssert() { 40930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie gMockAssert = this; 41930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } 42930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie ~MockAssert() { 43930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie gMockAssert = nullptr; 44930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } 45930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 46930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie MOCK_METHOD0(doAssert, void()); 47930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie}; 48930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 49930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie/** 50930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * Helper macro that wraps a statement in a block that sets up the mock for 51930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * CHRE_ASSERT and expects it to be called at least once. This allows for 52930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * verification that the code to be tested throws an expected assertion failure, 53930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * and also handles the failure gracefully when assertions are compiled out. 54930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * Triggered assertions are logged using LOGI, so they can be manually checked 55930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * in the test output. 56930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * 57930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * Example: 58930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * @code{.cpp} 59930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * TEST(DynamicVector, InsertToSparseIndexFails) { 60930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * DynamicVector<int> vector; 61930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * EXPECT_CHRE_ASSERT(EXPECT_FALSE(vector.insert(5)); 62930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * } 63930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie * @endcode 64930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie */ 65930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#define EXPECT_CHRE_ASSERT(statement) \ 66930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie do { \ 67930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie ASSERT_EQ(gMockAssert, nullptr); \ 68930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie MockAssert chreMockAssert; \ 69930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie EXPECT_CALL(chreMockAssert, doAssert()).Times(::testing::AtLeast(1)); \ 70930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie statement; \ 71930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } while (0) 72930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 73930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#define CHRE_ASSERT(condition) \ 74930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie do { \ 75930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie if (gMockAssert != nullptr && !(condition)) { \ 76930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie LOGI("Mocked assertion " #condition " triggered"); \ 77930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie gMockAssert->doAssert(); \ 78930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } else { \ 79930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie assert(condition); \ 80930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } \ 81930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie } while (0) 82930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 83930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#else // if !defined(GTEST) 84930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 85926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol#define CHRE_ASSERT(condition) assert(condition) 86e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 87930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie#endif // GTEST 88930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie 89e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif // CHRE_PLATFORM_LINUX_ASSERT_H_ 90