#include #include "self_pipe.h" #include "nbdtypes.h" #include "client.h" #define FAKE_SERVER ((struct server *)23) #define FAKE_SOCKET (42) START_TEST( test_assigns_socket ) { struct client * c; c = client_create( FAKE_SERVER, FAKE_SOCKET ); fail_unless( 42 == c->socket, "Socket wasn't assigned." ); } END_TEST START_TEST( test_assigns_server ) { struct client * c; /* can't predict the storage size so we can't allocate one on * the stack */ c = client_create( FAKE_SERVER, FAKE_SOCKET ); fail_unless( FAKE_SERVER == c->serve, "Serve wasn't assigned." ); } END_TEST START_TEST( test_opens_stop_signal ) { struct client *c = client_create( FAKE_SERVER, FAKE_SOCKET ); client_signal_stop( c ); fail_unless( 1 == self_pipe_signal_clear( c->stop_signal ), "No signal was sent." ); } END_TEST START_TEST( test_closes_stop_signal ) { struct client *c = client_create( FAKE_SERVER, FAKE_SOCKET ); int read_fd = c->stop_signal->read_fd; int write_fd = c->stop_signal->write_fd; client_destroy( c ); fail_unless( fd_is_closed( read_fd ), "Stop signal wasn't destroyed." ); fail_unless( fd_is_closed( write_fd ), "Stop signal wasn't destroyed." ); } END_TEST START_TEST( test_read_request_quits_on_stop_signal ) { int fds[2]; struct nbd_request nbdr; pipe( fds ); struct client *c = client_create( FAKE_SERVER, fds[0] ); client_signal_stop( c ); int client_read_request( struct client *, struct nbd_request *); fail_unless( 0 == client_read_request( c, &nbdr ), "Didn't quit on stop." ); close( fds[0] ); close( fds[1] ); } END_TEST Suite *client_suite() { Suite *s = suite_create("client"); TCase *tc_create = tcase_create("create"); TCase *tc_signal = tcase_create("signal"); TCase *tc_destroy = tcase_create("destroy"); tcase_add_test(tc_create, test_assigns_socket); tcase_add_test(tc_create, test_assigns_server); tcase_add_test(tc_signal, test_opens_stop_signal); tcase_add_test(tc_signal, test_read_request_quits_on_stop_signal); tcase_add_test( tc_destroy, test_closes_stop_signal ); suite_add_tcase(s, tc_create); suite_add_tcase(s, tc_signal); suite_add_tcase(s, tc_destroy); return s; } int main(void) { int number_failed; Suite *s = client_suite(); SRunner *sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? 0 : 1; }