131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu/*
2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne * Author: Karl MacMillan <kmacmillan@tresys.com>
3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *
4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne * Copyright (C) 2006 Tresys Technology, LLC
5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *
6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  This library is free software; you can redistribute it and/or
7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  modify it under the terms of the GNU Lesser General Public
8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  License as published by the Free Software Foundation; either
9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  version 2.1 of the License, or (at your option) any later version.
10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *
11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  This library is distributed in the hope that it will be useful,
12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *  Lesser General Public License for more details.
15b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne *
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *  You should have received a copy of the GNU Lesser General Public
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth *  License along with this library; if not, write to the Free Software
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth */
20b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "test-cond.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "test-linker.h"
23b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "test-expander.h"
24b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "test-deps.h"
25b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "test-downgrade.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include <CUnit/Basic.h>
28b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include <CUnit/Console.h>
29804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include <CUnit/TestDB.h>
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
31804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include <stdio.h>
32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include <getopt.h>
33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include <stdlib.h>
34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth
3573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Chengint mls;
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DECLARE_SUITE(name) \
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines	suite = CU_add_suite(#name, name##_test_init, name##_test_cleanup); \
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines	if (NULL == suite) { \
4073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng		CU_cleanup_registry(); \
41a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng		return CU_get_error(); } \
4273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng	if (name##_add_tests(suite)) { \
43e488b4ecdc6bf9a4a2d53f9311827f92c9044db1Bill Wendling		CU_cleanup_registry(); \
44e488b4ecdc6bf9a4a2d53f9311827f92c9044db1Bill Wendling		return CU_get_error(); }
45b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
46b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic void usage(char *progname)
47b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne{
48b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	printf("usage:  %s [options]\n", progname);
49b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	printf("options:\n");
50b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	printf("\t-v, --verbose\t\t\tverbose output\n");
51b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	printf("\t-i, --interactive\t\tinteractive console\n");
52b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
53b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
54b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic int do_tests(int interactive, int verbose)
55b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne{
56b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	CU_pSuite suite = NULL;
57b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
58b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne	if (CUE_SUCCESS != CU_initialize_registry())
59b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne		return CU_get_error();
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	DECLARE_SUITE(cond);
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	DECLARE_SUITE(linker);
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	DECLARE_SUITE(expander);
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	DECLARE_SUITE(deps);
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	DECLARE_SUITE(downgrade);
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	if (verbose)
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		CU_basic_set_mode(CU_BRM_VERBOSE);
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	else
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		CU_basic_set_mode(CU_BRM_NORMAL);
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	if (interactive)
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		CU_console_run_tests();
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	else
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		CU_basic_run_tests();
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	CU_cleanup_registry();
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	return CU_get_error();
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint main(int argc, char **argv)
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	int i, verbose = 1, interactive = 0;
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	struct option opts[] = {
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		{"verbose", 0, NULL, 'v'},
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		{"interactive", 0, NULL, 'i'},
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		{NULL, 0, NULL, 0}
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	};
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	while ((i = getopt_long(argc, argv, "vi", opts, NULL)) != -1) {
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		switch (i) {
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		case 'v':
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines			verbose = 1;
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines			break;
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		case 'i':
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines			interactive = 1;
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines			break;
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		case 'h':
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		default:{
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines				usage(argv[0]);
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines				exit(1);
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines			}
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		}
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	}
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	/* first do the non-mls tests */
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	mls = 0;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	if (do_tests(interactive, verbose))
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		return -1;
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	/* then with mls */
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	mls = 1;
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	if (do_tests(interactive, verbose))
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines		return -1;
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines	return 0;
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines