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