1# Copyright (C) 2012 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15# Definitions for the Android NDK build system's internal unit tests.
16#
17
18#
19# A function which names begin with -test- (e.g. -test-foo) is assumed
20# to be an internal unit test. It will be run automatically by ndk-build
21# if NDK_UNIT_TESTS is defined in your environment.
22#
23# Each test should call one of the following functions that will
24# register a failure:
25#
26#   $(call test-expect,<expected-value>,<actual-value>)
27#
28#      This will check that <actual-value> is equal to <expected-value>.
29#      If not, this will print an error message and increment the failure
30#      counter.
31#
32#   $(call test-assert,<expected-value>,<actual-value>)
33#
34#      This is similar to test-expect, though it will abort the program
35#      immediately after displaying an error message.
36#
37# Here's an example that checks that the 'filter' function works correctly:
38#
39#   -test-filter = \
40#     $(call test-expect,foo,$(filter bar,foo bar))
41#
42#
43
44-ndk-test-start = \
45  $(eval _test_name := $1)\
46  $(eval _test_list += $1)\
47  $(eval _test_failed :=)\
48  $(info [$1  RUN])
49
50# End current unit test.
51#
52-ndk-test-end = \
53  $(if $(_test_failed),\
54    $(info [$(_test_name) FAIL])$(error Aborting)\
55    $(eval _test_failures += $$(_test_name))\
56  ,\
57    $(info [$(_test_name)   OK])\
58  )
59
60# Define NDK_UNIT_TESTS to 2 to dump each test-expect/assert check.
61#
62ifeq (2,$(NDK_UNIT_TESTS))
63-ndk-test-log = $(info .  $(_test_name): $1)
64else
65-ndk-test-log = $(empty)
66endif
67
68test-expect = \
69  $(call -ndk-test-log,expect '$2' == '$1')\
70  $(if $(call sne,$1,$2),\
71    $(info ERROR <$(_test_name)>:$3)\
72    $(info .  expected value:'$1')\
73    $(info .  actual value:  '$2')\
74    $(eval _test_failed := true)\
75  )
76
77test-assert = \
78  $(call -ndk-test-log,assert '$2' == '$1')\
79  $(if $(call sne,$1,$2),\
80    $(info ASSERT <$(_test_name)>:$3)\
81    $(info .  expected value:'$1')\
82    $(info .  actual value:  '$2')\
83    $(eval _test_failed := true)\
84    $(error Aborting.)\
85  )
86
87# Run all the tests, i.e. all functions that are defined with a -test-
88# prefix will be called now in succession.
89ndk-run-all-tests = \
90  $(info ================= STARTING NDK-BUILD UNIT TESTS =================)\
91  $(eval _test_list :=)\
92  $(eval _test_failures :=)\
93  $(foreach _test,$(filter -test-%,$(.VARIABLES)),\
94    $(call -ndk-test-start,$(_test))\
95    $(call $(_test))\
96    $(call -ndk-test-end)\
97  )\
98  $(eval _test_count := $$(words $$(_test_list)))\
99  $(eval _test_fail_count := $$(words $$(_test_failures)))\
100  $(if $(_test_failures),\
101    $(info @@@@@@@@@@@ FAILED $(_test_fail_count) of $(_test_count) NDK-BUILD UNIT TESTS @@@@@@@)\
102    $(foreach _test_name,$(_test_failures),\
103      $(info .  $(_test_name)))\
104  ,\
105    $(info =================== PASSED $(_test_count) NDK-BUILD UNIT TESTS =================)\
106  )
107