END_TEST START_TEST(test_atm_balance_success) { // The file descriptors used for writing to the bank process and // reading in from the atm process. int bankfd[2]; pipe(bankfd); int atmfd[2]; pipe(atmfd); int bank_read = bankfd[0]; int bank_write = bankfd[1]; int atm_read = atmfd[0]; int atm_write = atmfd[1]; // The command buffer. Command cmd; MSG_BALANCE(&cmd, 0, 1); if (fork() == 0) { // Send it to the atm. int status = atm(bank_write, atm_read, 0, &cmd); ck_assert_msg(status == SUCCESS, "status should be SUCCESS, received %d", status); } else { // Need to set the read end of pipe to non-blocking otherwise // students without an implementation will not be able to run // tests. int flags = fcntl(bank_read, F_GETFL, 0); fcntl(bank_read, F_SETFL, flags | O_NONBLOCK); sleep(1); int status = read(bank_read, &cmd, MESSAGE_SIZE); ck_assert_msg(status != -1, "ATM should have sent data to the bank"); cmd_t c; int i, f, t, a; cmd_unpack(&cmd, &c, &i, &f, &t, &a); ck_assert_msg(c == BALANCE, "received message should be balance, got %d", c); ck_assert_int_eq(i, 0); ck_assert_int_eq(f, 1); ck_assert_int_eq(t, -1); ck_assert_int_eq(a, -1); MSG_OK(&cmd, i, f, t, a); write(atm_write, &cmd, MESSAGE_SIZE); } // Close file descriptors. close(bankfd[0]); close(bankfd[1]); close(atmfd[0]); close(atmfd[1]); }
END_TEST START_TEST(test_atm_connect_success) { // The file descriptors used for writing to the bank process and // reading in from the atm process. int bankfd[2]; pipe(bankfd); int atmfd[2]; pipe(atmfd); int bank_read = bankfd[0]; int bank_write = bankfd[1]; int atm_read = atmfd[0]; int atm_write = atmfd[1]; // The command buffer. Command cmd; MSG_CONNECT(&cmd, 0); if (fork() == 0) { // Send it to the atm. int status = atm(bank_write, atm_read, 0, &cmd); ck_assert_msg(status == SUCCESS, "status should be SUCCESS, received %d", status); } else { int flags = fcntl(bank_read, F_GETFL, 0); fcntl(bank_read, F_SETFL, flags | O_NONBLOCK); sleep(1); int status = read(bank_read, &cmd, MESSAGE_SIZE); ck_assert_msg(status != -1, "ATM should have sent data to the bank"); cmd_t c; int i, f, t, a; cmd_unpack(&cmd, &c, &i, &f, &t, &a); ck_assert_msg(c == CONNECT, "received message should be connect, got %d", c); MSG_OK(&cmd, i, f, t, a); write(atm_write, &cmd, MESSAGE_SIZE); } // Close file descriptors. close(bankfd[0]); close(bankfd[1]); close(atmfd[0]); close(atmfd[1]); }
END_TEST ////////////////////////////////////////////////////////////////////// ///////////// command unit tests ////////////////////////////////////////////////////////////////////// START_TEST(test_command_ok) { Command cmd; cmd_t c; int i = 1, f = 2, t = 3, a = 4; MSG_OK(&cmd, i, f, t, a); cmd_unpack(&cmd, &c, &i, &f, &t, &a); ck_assert_msg(c == OK, "command should be ok, received %d", c); ck_assert_msg(i == 1, "i should be 1, received %d", i); ck_assert_msg(f == 2, "f should be 2, received %d", f); ck_assert_msg(t == 3, "t should be 3, received %d", t); ck_assert_msg(a == 4, "a should be 4, received %d", a); }
int main(int argc, char **argv) { int overall_errors = 0; char buf[BIG_ENOUGH]; /* test an empty cdr channel */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST AN EMPTY CDR\n"); initial_put(STDCDR_EMPTY); MSG_OK(STDCDR_EMPTY, "01234"); MSG_OK(STDCDR_EMPTY, "567"); MSG_OK(STDCDR_EMPTY, "89abcdefg"); MSG_OK(STDCDR_EMPTY, "zyx"); MSG_OK(STDCDR_EMPTY, "this is the end"); MSG_ERR(STDCDR_EMPTY, "this write should fail"); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test stubbed cdr channel */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST STUBBED CDR\n"); eofpos = MANIFEST->channels[OPEN(STDCDR_STUBBED)].size; FPRINTF(STDERR, "%s size = %lld\n", MANIFEST->channels[OPEN(STDCDR_STUBBED)].name, eofpos); MSG_OK(STDCDR_STUBBED, "01234"); MSG_OK(STDCDR_STUBBED, "567"); MSG_OK(STDCDR_STUBBED, "89abcdefg"); MSG_OK(STDCDR_STUBBED, "zyx"); MSG_OK(STDCDR_STUBBED, "this is the end"); MSG_ERR(STDCDR_STUBBED, "this write should fail"); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test (in)valid write cases */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST (IN)VALID CDR WRITE CASES\n"); ZTEST(PWRITE(STDCDR_GOAT, buf, 0, 0) == 0); /* accessing 0 bytes is always ok */ ZTEST(PWRITE(STDCDR_GOAT, buf, -1, -1) < 0); /* invalid size, offset ignored = fail */ ZTEST(PWRITE(STDCDR_GOAT, buf, -1, 0) < 0); /* invalid size, offset ignored = fail */ ZTEST(PWRITE(STDCDR_GOAT, buf, -1, 1) < 0); /* invalid size, offset ignored = fail */ ZTEST(PWRITE(STDCDR_GOAT, buf, 0, -1) == 0); /* accessing of 0 bytes is always ok */ ZTEST(PWRITE(STDCDR_GOAT, buf, 1, -1) == 1); /* size = 1, offset ignored = 1 byte written */ ZTEST(PWRITE(STDCDR_GOAT, buf, 0, MANIFEST->channels[OPEN(STDCDR_GOAT)].limits[PutSizeLimit] + 1) == 0); ZTEST(PWRITE(STDCDR_GOAT, buf, 1, MANIFEST->channels[OPEN(STDCDR_GOAT)].limits[PutSizeLimit] + 1) == 1); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test (in)valid read cases */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST (IN)VALID CDR READ CASES\n"); ZTEST(PREAD(STDCDR_GOAT, buf, 0, 0) == 0); /* accessing 0 bytes is always ok */ ZTEST(PREAD(STDCDR_GOAT, buf, -1, -1) < 0); /* invalid size, invalid offset = fail */ ZTEST(PREAD(STDCDR_GOAT, buf, -1, 0) < 0); /* invalid size, invalid offset = fail */ ZTEST(PREAD(STDCDR_GOAT, buf, -1, 1) < 0); /* invalid size, invalid offset = fail */ ZTEST(PREAD(STDCDR_GOAT, buf, 0, -1) == 0); /* accessing 0 bytes is always ok */ ZTEST(PREAD(STDCDR_GOAT, buf, 1, -1) < 0); /* valid size, invalid offset = fail */ ZTEST(PREAD(STDCDR_GOAT, buf, 0, MANIFEST->channels[OPEN(STDCDR_GOAT)].limits[PutSizeLimit] + 1) < 0); ZTEST(PREAD(STDCDR_GOAT, buf, 1, MANIFEST->channels[OPEN(STDCDR_GOAT)].limits[PutSizeLimit] + 1) < 0); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test NULL buffer cases */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST NULL BUFFER CASES\n"); ZTEST(PWRITE(STDCDR_GOAT, NULL, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, NULL, 0, 0) < 0); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test other invalid buffer address/size cases for pwrite */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST OTHER INVALID BUFFER/SIZE CASES FOR PWRITE\n"); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x1, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, (void*)0xffff, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x10000, -1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, MANIFEST->heap_ptr, MANIFEST->heap_size + 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, MANIFEST->heap_ptr + MANIFEST->heap_size, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x100000000LL - 0x1000001 - 0x10000, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x100000000LL, 1, 0) < 0); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x100000000LL - 0x1000000, 0x1000001, 0) < 0); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test other valid buffer address/size cases for pwrite */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST OTHER VALID BUFFER/SIZE CASES FOR PWRITE\n"); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x10000, 1, 0) == 1); ZTEST(PWRITE(STDCDR_GOAT, MANIFEST->heap_ptr + MANIFEST->heap_size - 1, 1, 0) == 1); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x100000000LL - 0x1000000, 1, 0) == 1); ZTEST(PWRITE(STDCDR_GOAT, (void*)0x100000000LL - 0x1, 1, 0) == 1); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test other invalid buffer address/size cases for pread */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST OTHER INVALID BUFFER/SIZE CASES FOR PREAD\n"); ZTEST(PREAD(STDCDR_GOAT, (char*)main, 1, 0) < 0); ZTEST(PREAD(STDCDR_GOAT, MANIFEST->heap_ptr, MANIFEST->heap_size + 1, 0) < 0); ZTEST(PREAD(STDCDR_GOAT, MANIFEST->heap_ptr + MANIFEST->heap_size, 1, 0) < 0); ZTEST(PREAD(STDCDR_GOAT, (void*)0x100000000LL - 0x1000001, 1, 0) < 0); ZTEST(PREAD(STDCDR_GOAT, (void*)0x100000000LL, 1, 0) < 0); ZTEST(PREAD(STDCDR_GOAT, (void*)0x100000000LL - 0x1000000, 0x1000001, 0) < 0); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* test other valid buffer address/size cases for pread */ ERRCOUNT = 0; FPRINTF(STDERR, "TEST OTHER VALID BUFFER/SIZE CASES FOR PREAD\n"); ZTEST(PREAD(STDCDR_GOAT, &data_start, 1, 0) == 1); ZTEST(PREAD(STDCDR_GOAT, MANIFEST->heap_ptr + MANIFEST->heap_size - 1, 1, 0) == 1); ZTEST(PREAD(STDCDR_GOAT, (void*)0x100000000LL - 0x1000000, 1, 0) == 1); ZTEST(PREAD(STDCDR_GOAT, (void*)0x100000000LL - 0x1, 1, 0) == 1); overall_errors += ERRCOUNT; FPRINTF(STDERR, ERRCOUNT ? "TEST FAILED\n\n" : "TEST SUCCEED\n\n"); /* exit with code */ if(overall_errors > 0) FPRINTF(STDERR, "OVERALL TEST FAILED with %d errors\n", overall_errors); else FPRINTF(STDERR, "OVERALL TEST SUCCEED\n\n"); return overall_errors; }