/* * It is the responsibility of the invoking environment to delete the * file passed as command-line argument. See the build.scons file. */ int main(int ac, char **av) { char const *test_dir_name = "/tmp/nacl_host_desc_test"; struct NaClHostDesc hd; struct NaClHostDesc hd_ro; size_t error_count; size_t ix; int test_passed; int opt; int num_runs = 1; int test_run; while (EOF != (opt = getopt(ac, av, "c:t:"))) { switch (opt) { case 'c': num_runs = atoi(optarg); break; case 't': test_dir_name = optarg; break; default: fprintf(stderr, "Usage: nacl_host_desc_mmap_test [-c run_count]\n" " [-t test_temp_dir]\n"); exit(1); } } NaClPlatformInit(); error_count = 0; for (test_run = 0; test_run < num_runs; ++test_run) { printf("Test run %d\n\n", test_run); for (ix = 0; ix < NACL_ARRAY_SIZE(tests); ++ix) { char test_file_name[PATH_MAX]; SNPRINTF(test_file_name, sizeof test_file_name, "%s/f%d.%"NACL_PRIuS, test_dir_name, test_run, ix); printf("%s\n", tests[ix].test_name); CreateTestFile(&hd, &hd_ro, test_file_name, &tests[ix]); test_passed = (*tests[ix].test_func)(&hd, &hd_ro, tests[ix].test_params); CloseTestFile(&hd); error_count += !test_passed; printf("%s\n", test_passed ? "PASSED" : "FAILED"); } } NaClPlatformFini(); /* we ignore the 2^32 or 2^64 total errors case */ return (error_count > 255) ? 255 : error_count; }
/* * This test is a NaCl module that writes a file containing * instructions -- a simple function, f(x) = x+1 -- that is then * mmapped in and executed. Since we write the file at runtime rather * than check in architecture-specific test data files, this code must * run sel_ldr with -a option. * * This test was adapted from the trusted code test in * src/shared/platform/nacl_host_desc_mmap_test.c * * It is the responsibility of the invoking environment to delete the * file passed as command-line argument. See the nacl.scons file. */ int main(int ac, char **av) { char const *test_file_dir = "/tmp/nacl_host_desc_test"; int fd; size_t err_count; size_t test_errors; size_t ix; int opt; int num_runs = 1; int test_run; while (EOF != (opt = getopt(ac, av, "c:dmt:"))) { switch (opt) { case 'c': num_runs = atoi(optarg); break; case 'd': g_prot_exec_disabled = 1; break; case 'm': g_mach_copy_on_write_behavior = 1; break; case 't': test_file_dir = optarg; break; default: fprintf(stderr, "Usage: nacl_host_desc_mmap_test [-c run_count]\n" " [-t test_temporary_dir]\n" " [-dm]\n"); exit(1); } } /* * This print helps to ensure that the function address escapes, so * that a whole program optimizer is less likely to optimize it out * and remove the x_plus_1 code completely. */ printf("x_plus_1 addr is %p\n", (void *) (uintptr_t) x_plus_1); err_count = 0; for (test_run = 0; test_run < num_runs; ++test_run) { printf("Test run %d\n\n", test_run); for (ix = 0; ix < NACL_ARRAY_SIZE(tests); ++ix) { char test_file_name[PATH_MAX]; printf("%s\n", tests[ix].test_name); snprintf(test_file_name, sizeof test_file_name, "%s/f%d.%u", test_file_dir, test_run, ix); fd = CreateTestFile(test_file_name, &tests[ix]); test_errors = (*tests[ix].test_func)(fd, tests[ix].map_size, tests[ix].test_specifics); printf("%s\n", (0 == test_errors) ? "PASS" : "FAIL"); err_count += test_errors; CloseTestFile(fd); } } /* we ignore the 2^32 or 2^64 total errors case */ return (err_count > 255) ? 255 : err_count; }