blob: b378081539eb9abafbfd5f280c34391675d63f8f [file] [log] [blame] [edit]
/*
* Copyright 2010 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef TESTS_SYSCALLS_TEST_H_
#define TESTS_SYSCALLS_TEST_H_
// Some simple functions to help with testing. See below for some macros that
// make for a very simple test framework.
namespace test {
// Print a failure message and return false, including a file name and line
// number in the message that is printed.
bool Failed(const char *testname,
const char *msg,
const char* file,
int line);
// Print a failure message and return false.
bool Failed(const char *testname, const char *msg);
// Call this to print a message and return true. Note that this message
// should not contain data specific to an instance of a test run, so that
// golden output can be used if desired.
bool Passed(const char *testname, const char *msg);
}
// Simple test framework macros, as a poor man's gtest for untrusted NaCl code.
//
// A test program looks like this:
//
// int TestFoo() {
// START_TEST("Test Foo");
// EXPECT(Foo::ReturnTrue());
// EXPECT(Foo::ReturnFive == 5);
// END_TEST();
// }
//
// int TestBar() {
// START_TEST("Test Bar");
// EXPECT(!Bar::ReturnFalse());
// END_TEST();
// }
//
// int main() {
// int fail_count = 0;
// fail_count += TestFoo();
// fail_count += TestBar();
// std::exit(fail_count);
// }
#define START_TEST(TESTNAME) \
int _fail_count = 0; \
const char* const _test_name = TESTNAME;
#define EXPECT(COND) \
{\
if (COND) { \
::test::Passed(_test_name, #COND); \
} else { \
::test::Failed(_test_name, #COND, __FILE__, __LINE__); \
++_fail_count; \
} \
}
#define END_TEST() \
{ return _fail_count; }
#endif // TESTS_SYSCALLS_TEST_H_