aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..71850cf
--- /dev/null
+++ b/main.c
@@ -0,0 +1,115 @@
+// Copyright 2014, ARM Limited
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of ARM Limited nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "test.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+static void usage(char const * prog_name) {
+ printf("Usage: %s [options]\n", prog_name);
+ printf(" --help, -h\n");
+ printf(" Print this help text.\n");
+ printf(" --list, -l\n");
+ printf(" List available tests.\n");
+ printf(" --test=<test>\n");
+ printf(" -t <test>\n");
+ printf(" Run the specified test. Only one test may be specified\n");
+}
+
+int main(int argc, char** argv) {
+ // Keep stdio unbuffered so that assertion output is in the right order in
+ // relation to stdout.
+ setbuf(stdout, NULL);
+ setbuf(stderr, NULL);
+
+ char * test = NULL;
+ int test_count = 0;
+ int opt_help = 0;
+ int opt_list = 0;
+
+ char const * shortopts = "hlt:";
+ struct option longopts[] = {
+ {"help", no_argument, NULL, 'h'},
+ {"list", no_argument, NULL, 'l'},
+ {"test", required_argument, NULL, 't'},
+ {NULL, 0, NULL, 0}
+ };
+
+ test_init();
+
+ int index;
+ while (1) {
+ int c = getopt_long(argc, argv, shortopts, longopts, &index);
+
+ if (c == -1) {
+ // The end of the options.
+ break;
+ } else if (c == 0) {
+ // A longopt: Make it look like a shortopt so we can handle them together.
+ c = longopts[index].val;
+ }
+
+ // Treat everything else as a shortopt.
+ if (c == 'h') {
+ opt_help = 1;
+ } else if (c == 'l') {
+ opt_list = 1;
+ } else if (c == 't') { // --test, -t
+ test_count++;
+ test = optarg;
+ }
+ }
+
+ if (opt_help) {
+ usage(argv[0]);
+ return EXIT_SUCCESS;
+ }
+
+ if (opt_list) {
+ test_print_list();
+ return EXIT_SUCCESS;
+ }
+
+ if (test_count == 0) {
+ printf("Error: No test specified.\n");
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ } else if (test_count > 1) {
+ printf("Error: Multiple tests specified.\n");
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ if (test_run_by_name(test) == -1) {
+ printf("Test %s does not exist.\n", test);
+ return EXIT_FAILURE;
+ }
+
+ printf("Test '%s' PASSED.\n", test);
+ return EXIT_SUCCESS;
+}