void test2() { assert(get_blocked_count() == 0); int status; char *argva[] = {A_NAME, 0}; char *argvb[] = {B_NAME, 0}; if (!fork()) { assert(get_blocked_count() == 0); execv(PROG_A, argva); exit(1); // shouldn't happen } wait(&status); assert(WEXITSTATUS(status) == 0); // assuming a.out exits with 0 assert(block_program(PROG_A, strlen(PROG_A)) == 0); assert(block_program(PROG_B, strlen(PROG_B)) == 0); assert(block_program(PROG_A, strlen(PROG_A)) == 1); assert(block_program(PROG_B, strlen(PROG_B)) == 1); if (!fork()) { assert(get_blocked_count() == 2); execv(PROG_B, argvb); execv(PROG_A, argva); execv(PROG_B, argvb); int cpid = fork(); if (!cpid) { char log[20][256]; int n = get_forbidden_tries(getppid(), log, 2); assert(n == 2); assert(strncmp(log[0], PROG_B, strlen(PROG_B)) == 0); assert(strncmp(log[1], PROG_A, strlen(PROG_A)) == 0); exit(1); } int status2; waitpid(cpid, &status2, 0); assert(WEXITSTATUS(status2) == 1); exit(1); } wait(&status); assert(WEXITSTATUS(status) == 1); assert(unblock_program(PROG_A, strlen(PROG_A)) == 0); assert(unblock_program(PROG_B, strlen(PROG_B)) == 0); assert(get_blocked_count() == 0); }
bool log_test() { const char* name1 = "/root/hw1_tests/prog1"; const char* name2 = "/root/hw1_tests/prog2"; const char* name3 = "/root/hw1_tests/prog3"; const char* name4 = "/root/hw1_tests/prog4"; const char* test_str = "test"; int len = strlen(name1); block_program(name1, len); block_program(name2, len); char *argva[] = {"/root/hw1_tests/prog1", 0}; char *argvb[] = {"/root/hw1_tests/prog2", 0}; char *argvc[] = {"/root/hw1_tests/prog3", 0}; char *argvd[] = {"/root/hw1_tests/prog4", 0}; // should all fail execv(name1, argva); execv(name2, argvb); //this fails just because the programs don't exist execv(name3, argvc); execv(name4, argvd); //a few more times (logged fails) execv(name1, argva); execv(name2, argvb); execv(name2, argva); execv(name1, argvb); //final result: 1, 2, 1, 2, 2, 1 int log_len = 6; char log[log_len][256]; init_log(log, log_len); ASSERT_TEST(get_forbidden_tries(-2, log, 3) == -1); ASSERT_TEST(errno == ESRCH); ASSERT_TEST(get_forbidden_tries(getpid(), log, 0) == -1); ASSERT_TEST(errno == EINVAL); ASSERT_TEST(get_forbidden_tries(getpid(), log, 1) == 1); for(int i = 0; i < log_len; i++) { switch(i) { case 0 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; default: ASSERT_TEST(strcmp(log[i], test_str) == 0); } } init_log(log, log_len); ASSERT_TEST(get_forbidden_tries(getpid(), log, 40) == log_len); for(int i = 0; i < log_len; i++) { switch(i) { case 0 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; case 1 : ASSERT_TEST(strcmp(log[i], name2) == 0); break; case 2 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; case 3 : ASSERT_TEST(strcmp(log[i], name2) == 0); break; case 4 : ASSERT_TEST(strcmp(log[i], name2) == 0); break; case 5 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; default: ASSERT_TEST(strcmp(log[i], test_str) == 0); } } init_log(log, log_len); ASSERT_TEST(get_forbidden_tries(getpid(), log, 3) == 3); for(int i = 0; i < log_len; i++) { switch(i) { case 0 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; case 1 : ASSERT_TEST(strcmp(log[i], name2) == 0); break; case 2 : ASSERT_TEST(strcmp(log[i], name1) == 0); break; default: ASSERT_TEST(strcmp(log[i], test_str) == 0); } } int status; if(fork() == 0) { init_log(log, log_len); ASSERT_TEST(get_forbidden_tries(getpid(), log, log_len) == 0); for(int i = 0; i < log_len; i++) { ASSERT_TEST(strcmp(log[i], test_str) == 0); } _exit(EXIT_SUCCESS); } wait(&status); assert(WEXITSTATUS(status) == EXIT_SUCCESS); unblock_program(name1, len); unblock_program(name2, len); return true; }
void test1() { /* Assuming no blocked programs before the test runs. If that's not * the case, you should unblock any programs before */ assert(get_blocked_count() == 0); assert(block_program(0, strlen(PROG_A)) == -1); assert(errno == EINVAL); assert(is_program_blocked(PROG_A, strlen(PROG_A)) == 0); assert(block_program(PROG_A, strlen(PROG_A)) == 0); assert(is_program_blocked(PROG_A, strlen(PROG_A)) == 1); assert(block_program(PROG_A, strlen(PROG_A)) == 1); assert(get_blocked_count() == 1); assert(block_program(PROG_B, strlen(PROG_B)) == 0); assert(block_program(PROG_B, strlen(PROG_B)) == 1); assert(get_blocked_count() == 2); char *argva[] = {A_NAME, 0}; char *argvb[] = {B_NAME, 0}; char log[20][256]; // should all fail execv(PROG_A, argva); assert(get_forbidden_tries(getpid(), log, 20)==1); execv(PROG_B, argvb); assert(get_forbidden_tries(getpid(), log, 20)==2); execv(PROG_A, argva); assert(get_forbidden_tries(getpid(), log, 20)==3); execv(PROG_A, argva); assert(get_forbidden_tries(getpid(), log, 20)==4); execv(PROG_B, argvb); assert(get_forbidden_tries(getpid(), log, 20)==5); execv(PROG_B, argvb); assert(get_forbidden_tries(getpid(), log, 20)==6); assert(get_forbidden_tries(getpid(), log, 0) == -1); assert(errno == EINVAL); assert(get_forbidden_tries(-5, log, 20) == -1); assert(errno == ESRCH); assert(get_forbidden_tries(getpid(), (void*)5, 20) == -1); assert(errno == EFAULT); int n = get_forbidden_tries(getpid(), log, 20); assert(n == 6); assert(strncmp(log[0], PROG_A, strlen(PROG_A)) == 0); assert(strncmp(log[1], PROG_B, strlen(PROG_B)) == 0); assert(strncmp(log[2], PROG_A, strlen(PROG_A)) == 0); assert(strncmp(log[3], PROG_A, strlen(PROG_A)) == 0); assert(strncmp(log[4], PROG_B, strlen(PROG_B)) == 0); assert(strncmp(log[5], PROG_B, strlen(PROG_B)) == 0); assert(unblock_program(0, 11) == -1); assert(errno == EINVAL); assert(unblock_program(PROG_A, strlen(PROG_A)) == 0); assert(unblock_program(PROG_A, strlen(PROG_A)) == 1); assert(is_program_blocked(PROG_B, strlen(PROG_B)) == 1); assert(get_blocked_count() == 1); assert(unblock_program(PROG_B, strlen(PROG_B)) == 0); assert(is_program_blocked(PROG_A, strlen(PROG_A)) == 0); assert(is_program_blocked(PROG_B, strlen(PROG_B)) == 0); assert(unblock_program(PROG_B, strlen(PROG_B)) == 1); assert(is_program_blocked(PROG_A, strlen(PROG_A)) == 0); assert(get_blocked_count() == 0); }