Exemple #1
0
bool block_program_test() {
  	const char* name1 = "/root/hw1_tests/prog1";
	const char* name2 = "/root/hw1_tests/prog2";
  	const char* name3 = "";
  	int len = strlen(name1);
  	ASSERT_TEST(block_program(NULL, 5) == -1);
  	ASSERT_TEST(errno == EINVAL);
  	ASSERT_TEST(block_program(name3, 0) == -1);
    ASSERT_TEST(errno == EINVAL);
 	ASSERT_TEST(block_program(name1, 0) == -1);
    ASSERT_TEST(errno == EINVAL);
  	ASSERT_TEST(block_program(name2, len) == 0);
  	ASSERT_TEST(block_program(name1, len) == 0);
    ASSERT_TEST(block_program(name2, len) == 1);
    ASSERT_TEST(block_program(name1, len) == 1);
    char *argva[] = {"/root/hw1_tests/prog1", 0};
    char *argvb[] = {"/root/hw1_tests/prog2", 0};
    
    //fails
	execv(name1, argva);
	execv(name2, argvb);

    unblock_program (name1, len);
    unblock_program (name2, len);
	return true;
}
Exemple #2
0
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);
}
Exemple #3
0
bool get_blocked_count_test() {
	ASSERT_TEST(get_blocked_count() == 0);
	const char* name1 = "prog1";
	const char* name2 = "prog2";
    const char* name3 = "prog3";
	block_program(name1, 5);
	ASSERT_TEST(get_blocked_count() == 1);
	block_program(name1, 5);
	ASSERT_TEST(get_blocked_count() == 1);
	block_program(name2, 5);
	ASSERT_TEST(get_blocked_count() == 2);
	unblock_program(name1, 5);
	ASSERT_TEST(get_blocked_count() == 1);
    block_program(NULL, 5);
    ASSERT_TEST(get_blocked_count() == 1);
    block_program(name3, 0);
    ASSERT_TEST(get_blocked_count() == 1);
	unblock_program(name2, 5);
	ASSERT_TEST(get_blocked_count() == 0);
	return true;
}
Exemple #4
0
bool unblock_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";
	int name_len = strlen(name1);
	block_program(name1, name_len);
	block_program(name2, name_len);
	block_program(name3, name_len);
	block_program(name4, name_len);
	ASSERT_TEST(unblock_program(NULL, 3) == -1);
	ASSERT_TEST(errno == EINVAL);
	ASSERT_TEST(unblock_program("d", 0) == -1);
	ASSERT_TEST(errno == EINVAL);
	//wasn't blocked
	ASSERT_TEST(unblock_program("d", 1) == 1);
	char *argva[] = {"/root/hw1_tests/prog1", 0};
    char *argvb[] = {"/root/hw1_tests/prog2", 0};
    
	ASSERT_TEST(unblock_program(name1, name_len) == 0);
	int status;
	if(fork() == 0) {	//should succeed
		execv(name1, argva);
	}
	//new addition
	wait(&status);
    assert(WEXITSTATUS(status) == 0); 

	//already unblocked, should fail
	ASSERT_TEST(unblock_program(name1, name_len) == 1);
	//unblocking the rest
	ASSERT_TEST(unblock_program(name2, name_len) == 0);
	ASSERT_TEST(unblock_program(name3, name_len) == 0);
	ASSERT_TEST(unblock_program(name4, name_len) == 0);

	return true;
}
Exemple #5
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;
}
Exemple #6
0
bool is_program_blocked_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";
	int len = strlen(name1);

	//checking errors
	ASSERT_TEST(is_program_blocked(NULL, len));
	ASSERT_TEST(errno == EINVAL);
	ASSERT_TEST(is_program_blocked("da", 0));
	ASSERT_TEST(errno == EINVAL);
	ASSERT_TEST(is_program_blocked(NULL, 0));
	ASSERT_TEST(errno == EINVAL);

	block_program(name1, len);
	block_program(name2, len);

	ASSERT_TEST(is_program_blocked(name1, len));
	ASSERT_TEST(is_program_blocked(name2, len));
	ASSERT_TEST(is_program_blocked(name3, len) == 0);
	ASSERT_TEST(is_program_blocked(name4, len) == 0);
	ASSERT_TEST(is_program_blocked("adar", 4) == 0);

	block_program(name3, len);
	block_program(name4, len);

	ASSERT_TEST(is_program_blocked(name3, len));
	ASSERT_TEST(is_program_blocked(name4, len));

	unblock_program(name3, len);
	ASSERT_TEST(is_program_blocked(name1, len));
	ASSERT_TEST(is_program_blocked(name2, len));
	ASSERT_TEST(is_program_blocked(name3, len) == 0);
	ASSERT_TEST(is_program_blocked(name4, len));

	unblock_program(name4, len);
	ASSERT_TEST(is_program_blocked(name1, len));
	ASSERT_TEST(is_program_blocked(name2, len));
	ASSERT_TEST(is_program_blocked(name3, len) == 0);
	ASSERT_TEST(is_program_blocked(name4, len) == 0);

	//errors again because why not
	ASSERT_TEST(is_program_blocked(NULL, len));
	ASSERT_TEST(errno == EINVAL);
	ASSERT_TEST(is_program_blocked("da", 0));
	ASSERT_TEST(errno == EINVAL);
	ASSERT_TEST(is_program_blocked(NULL, 0));
	ASSERT_TEST(errno == EINVAL);

	unblock_program(name1, len);
	ASSERT_TEST(is_program_blocked(name1, len) == 0);
	ASSERT_TEST(is_program_blocked(name2, len));
	ASSERT_TEST(is_program_blocked(name3, len) == 0);
	ASSERT_TEST(is_program_blocked(name4, len) == 0);

	unblock_program(name2, len);
	ASSERT_TEST(is_program_blocked(name1, len) == 0);
	ASSERT_TEST(is_program_blocked(name2, len)== 0);
	ASSERT_TEST(is_program_blocked(name3, len) == 0);
	ASSERT_TEST(is_program_blocked(name4, len) == 0);

	return true;
}
Exemple #7
0
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);
}