/*
 * Author: Karl MacMillan <kmacmillan@tresys.com>
 *
 * Copyright (C) 2006 Tresys Technology, LLC
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "test-cond.h"
#include "test-linker.h"
#include "test-expander.h"
#include "test-deps.h"
#include "test-downgrade.h"

#include <CUnit/Basic.h>
#include <CUnit/Console.h>
#include <CUnit/TestDB.h>

#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>

int mls;

#define DECLARE_SUITE(name) \
	suite = CU_add_suite(#name, name##_test_init, name##_test_cleanup); \
	if (NULL == suite) { \
		CU_cleanup_registry(); \
		return CU_get_error(); } \
	if (name##_add_tests(suite)) { \
		CU_cleanup_registry(); \
		return CU_get_error(); }

static void usage(char *progname)
{
	printf("usage:  %s [options]\n", progname);
	printf("options:\n");
	printf("\t-v, --verbose\t\t\tverbose output\n");
	printf("\t-i, --interactive\t\tinteractive console\n");
}

static int do_tests(int interactive, int verbose)
{
	CU_pSuite suite = NULL;

	if (CUE_SUCCESS != CU_initialize_registry())
		return CU_get_error();

	DECLARE_SUITE(cond);
	DECLARE_SUITE(linker);
	DECLARE_SUITE(expander);
	DECLARE_SUITE(deps);
	DECLARE_SUITE(downgrade);

	if (verbose)
		CU_basic_set_mode(CU_BRM_VERBOSE);
	else
		CU_basic_set_mode(CU_BRM_NORMAL);

	if (interactive)
		CU_console_run_tests();
	else
		CU_basic_run_tests();
	CU_cleanup_registry();
	return CU_get_error();

}

int main(int argc, char **argv)
{
	int i, verbose = 1, interactive = 0;

	struct option opts[] = {
		{"verbose", 0, NULL, 'v'},
		{"interactive", 0, NULL, 'i'},
		{NULL, 0, NULL, 0}
	};

	while ((i = getopt_long(argc, argv, "vi", opts, NULL)) != -1) {
		switch (i) {
		case 'v':
			verbose = 1;
			break;
		case 'i':
			interactive = 1;
			break;
		case 'h':
		default:{
				usage(argv[0]);
				exit(1);
			}
		}
	}

	/* first do the non-mls tests */
	mls = 0;
	if (do_tests(interactive, verbose))
		return -1;

	/* then with mls */
	mls = 1;
	if (do_tests(interactive, verbose))
		return -1;

	return 0;
}
