diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 115 |
1 files changed, 115 insertions, 0 deletions
@@ -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; +} |