int main( int argc, char *argv[] ) { run_all_tests(); show_test_results(); return (tests_pass()) ? EXIT_SUCCESS : EXIT_FAILURE; }
void run_user_template() { /* * Declare the results struct. */ Test **user_template_test; /* * First we create the test (to set some values displayed in test header * correctly). */ user_template_test = create_test(&user_template_dtest,tsamples,psamples,&user_template); /* * Set any GLOBAL data used by the test. This is very test specific -- most * library tests won't have any but a few do. The data will usually be input * via one of the special command line variables reserved for that purpose, * and only can work if the -a(ll) flag is not set -- otherwise test specific * defaults are used. */ user_template_lag = (int)x_user; /* * Show the standard test header for this test. */ show_test_header(&user_template_dtest,user_template_test); /* * This is where we can output any test-specific information (such as * the value of the lag). In dieharder, I tend to start each output * line with an # to make things all pretty. */ printf("# Lag used in %s test: %u\n",user_template_dtest.name,user_template_lag); /* * Set any GLOBAL data used by the test. Then call the test itself * This fills in the results in the Test struct. */ std_test(&user_template_dtest,user_template_test); /* * This almost certainly belongs in the show_test_results section, * possibly with additional conditionals rejecting test results involving * rewinds, period. */ if(strncmp("file_input",gsl_rng_name(rng),10) == 0){ printf("# %u rands were used in this test\n",file_input_get_rtot(rng)); printf("# The file %s was rewound %u times\n",gsl_rng_name(rng),file_input_get_rewind_cnt(rng)); } /* * Show standard test results, for all statistics generated by a single run. */ show_test_results(&user_template_dtest,user_template_test); }
void run_diehard_sums() { /* * Declare the results struct. */ Test **diehard_sums_test; /* * First we create the test (to set some values displayed in test header * correctly). */ diehard_sums_test = create_test(&diehard_sums_dtest,tsamples,psamples,&diehard_sums); /* * Set any GLOBAL data used by the test. */ diehard_sums_rand_dbl = (double *)malloc((size_t) diehard_sums_test[0]->tsamples*sizeof(double)); /* * Show the standard test header for this test. */ show_test_header(&diehard_sums_dtest,diehard_sums_test); /* * This is where we can output any test-specific information. */ /* * Set any GLOBAL data used by the test. Then call the test itself * This fills in the results in the Test struct. */ std_test(&diehard_sums_dtest,diehard_sums_test); /* * This almost certainly belongs in the show_test_results section, * possibly with additional conditionals rejecting test results involving * rewinds, period. */ if(strncmp("file_input",gsl_rng_name(rng),10) == 0){ printf("# %u rands were used in this test\n",file_input_get_rtot(rng)); printf("# The file %s was rewound %u times\n",gsl_rng_name(rng),file_input_get_rewind_cnt(rng)); } /* * Show standard test results, for all statistics generated by a single run. */ show_test_results(&diehard_sums_dtest,diehard_sums_test); /* * Free global memory */ free(diehard_sums_rand_dbl); }
void run_marsaglia_tsang_gcd() { /* * Declare the results struct. */ Test **marsaglia_tsang_gcd_test; /* * First we create the test (to set some values displayed in test header * correctly). */ marsaglia_tsang_gcd_test = create_test(&marsaglia_tsang_gcd_dtest,tsamples,psamples,&marsaglia_tsang_gcd); /* * Set any GLOBAL data used by the test. */ /* * Show the standard test header for this test. */ show_test_header(&marsaglia_tsang_gcd_dtest,marsaglia_tsang_gcd_test); /* * This is where we can output any test-specific information. */ /* * Set any GLOBAL data used by the test. Then call the test itself * This fills in the results in the Test struct. */ std_test(&marsaglia_tsang_gcd_dtest,marsaglia_tsang_gcd_test); /* * This almost certainly belongs in the show_test_results section, * possibly with additional conditionals rejecting test results involving * rewinds, period. */ if(strncmp("file_input",gsl_rng_name(rng),10) == 0){ printf("# %u rands were used in this test\n",file_input_get_rtot(rng)); printf("# The file %s was rewound %u times\n",gsl_rng_name(rng),file_input_get_rewind_cnt(rng)); } /* * Show standard test results, for all statistics generated by a single run. */ show_test_results(&marsaglia_tsang_gcd_dtest,marsaglia_tsang_gcd_test); }
int main( int argc, char *argv[] ) { if ( argc < 2 ) { printf( "Must supply a db file name.\n" ); return EXIT_FAILURE; } sqlite3_open( argv[1], &db ); sqlite3_exec( db, "begin", NULL, NULL, NULL ); run_all_tests( db ); show_test_results(); sqlite3_exec( db, "rollback", NULL, NULL, NULL ); sqlite3_close( db ); return (tests_pass()) ? EXIT_SUCCESS : EXIT_FAILURE; }
void do_tcp_test(int s1, int type, struct sockaddr *slave, int nbufs, int buflen, int pause_time, int pause_threshold) { int i, s, td_len, tot_len, wlen, len, seq, seq_errors, total_packets, res; struct sockaddr_storage test_chan_slave; struct timeval start_time, end_time; struct nc_request req; struct nc_reply reply; struct nc_test_results results; struct nc_test_data *tdp; int lost_packets = 0; int conn_failures = 0; int need_send, need_recv; const char *type_name; int pkt_ctr = 0; unsigned char *dp; need_recv = true; need_send = true; type_name = "TCP echo"; switch (type) { case NC_REQUEST_TCP_RECV: need_recv = false; need_send = true; type_name = "TCP recv"; break; case NC_REQUEST_TCP_SEND: need_recv = true; need_send = false; type_name = "TCP send"; break; case NC_REQUEST_TCP_ECHO: break; } new_test(); req.type = htonl(type); req.nbufs = htonl(nbufs); req.buflen = htonl(buflen); req.slave_port = htonl(NC_TESTING_SLAVE_PORT); req.master_port = htonl(NC_TESTING_MASTER_PORT); nc_message(s1, &req, &reply, slave); if (reply.response != ntohl(NC_REPLY_ACK)) { test_printf("Slave denied %s [%d,%d] test\n", type_name, nbufs, buflen); return; } s = socket(slave->sa_family, SOCK_STREAM, 0); if (s < 0) { pexit("datagram socket"); } test_printf("Start %s [%d,%d]", type_name, nbufs, buflen); if (pause_time) { test_printf(" - %dms delay after %d packet%s\n", pause_time*10, pause_threshold, pause_threshold > 1 ? "s" : ""); } else { test_printf(" - no delays\n"); } test_delay(3*100); memcpy(&test_chan_slave, slave, sa_len(slave)); switch (slave->sa_family) { case AF_INET: ((struct sockaddr_in *)&test_chan_slave)->sin_port = htons(ntohl(req.slave_port)); break; case AF_INET6: ((struct sockaddr_in6 *)&test_chan_slave)->sin6_port = htons(ntohl(req.slave_port)); break; default: pexit("strange TCP sockaddr"); } while (connect(s, (struct sockaddr *)&test_chan_slave, sa_len(slave)) < 0) { perror("Can't connect to slave"); if (++conn_failures > MAX_ERRORS) { test_printf("Too many connection failures - giving up\n"); return; } if (errno == ECONNREFUSED) { // Give the slave a little time test_delay(100); // 1 second } else { return; } } gettimeofday(&start_time, 0); seq = 0; seq_errors = 0; total_packets = 0; for (i = 0; i < nbufs; i++) { td_len = buflen + sizeof(struct nc_test_data); if (need_send) { tdp = (struct nc_test_data *)out_buf; tdp->key1 = htonl(NC_TEST_DATA_KEY1); tdp->key2 = htonl(NC_TEST_DATA_KEY2); tdp->seq = htonl(i); tdp->len = htonl(td_len); tot_len = 0; dp = (unsigned char *)tdp; while (tot_len < td_len) { len = td_len - tot_len; if ((wlen = write(s, dp, len)) != len) { if (wlen < 0) { test_printf("Slave connection broken\n"); perror("write"); close(s); return; } else { test_printf("block: %d, short write - only %d of %d\n", total_packets, wlen, len); } } tot_len += wlen; dp += wlen; } total_packets++; } if (need_recv) { tdp = (struct nc_test_data *)in_buf; res = do_read(s, tdp, td_len); if (res != td_len) { lost_packets++; if (res < 0) { test_printf("Slave connection broken\n"); perror("read"); break; } else { test_printf("Slave timed out after %d buffers [read %d bytes]\n", i, res); } } else { if ((ntohl(tdp->key1) == NC_TEST_DATA_KEY1) && (ntohl(tdp->key2) == NC_TEST_DATA_KEY2)) { if (ntohl(tdp->seq) != seq) { test_printf("Packets out of sequence - recvd: %d, expected: %d\n", ntohl(tdp->seq), seq); seq_errors++; if (!need_send) { // Reset sequence to what the slave wants seq = ntohl(tdp->seq); } } } else { test_printf("Bad data packet - key: %x/%x, seq: %d\n", ntohl(tdp->key1), ntohl(tdp->key2), ntohl(tdp->seq)); } total_packets++; } seq++; if (seq == nbufs) { break; } if (pause_time && (++pkt_ctr == pause_threshold)) { pkt_ctr = 0; test_delay(pause_time); } } } gettimeofday(&end_time, 0); show_results(type_name, &start_time, &end_time, total_packets, buflen, lost_packets, seq_errors); // Fetch results record if (do_read(s, &results, sizeof(results)) != sizeof(results)) { test_printf("No results record sent\n"); } else { show_test_results(&results); } close(s); }
void do_udp_test(int s1, int type, struct sockaddr *slave, int nbufs, int buflen, int pause_time, int pause_threshold) { int i, s, td_len, seq, seq_errors, total_packets; struct sockaddr_storage test_chan_master, test_chan_slave; struct timeval start_time, end_time; struct nc_request req; struct nc_reply reply; struct nc_test_results results; struct nc_test_data *tdp; fd_set fds; struct timeval timeout; int lost_packets = 0; int need_send, need_recv; const char *type_name; int pkt_ctr = 0; need_recv = true; need_send = true; type_name = "UDP echo"; switch (type) { case NC_REQUEST_UDP_RECV: need_recv = false; need_send = true; type_name = "UDP recv"; break; case NC_REQUEST_UDP_SEND: need_recv = true; need_send = false; type_name = "UDP send"; break; case NC_REQUEST_UDP_ECHO: break; } new_test(); req.type = htonl(type); req.nbufs = htonl(nbufs); req.buflen = htonl(buflen); req.slave_port = htonl(NC_TESTING_SLAVE_PORT); req.master_port = htonl(NC_TESTING_MASTER_PORT); nc_message(s1, &req, &reply, slave); if (reply.response != ntohl(NC_REPLY_ACK)) { test_printf("Slave denied %s [%d,%d] test\n", type_name, nbufs, buflen); return; } s = socket(slave->sa_family, SOCK_DGRAM, 0); if (s < 0) { pexit("datagram socket"); } memset(&test_chan_master, 0, sizeof(test_chan_master)); ((struct sockaddr *)&test_chan_master)->sa_family = slave->sa_family; memcpy(&test_chan_slave, slave, sa_len(slave)); #ifndef __linux ((struct sockaddr *)&test_chan_master)->sa_len = slave->sa_len; #endif switch (slave->sa_family) { case AF_INET: ((struct sockaddr_in *)&test_chan_master)->sin_addr.s_addr = htonl(INADDR_ANY); ((struct sockaddr_in *)&test_chan_master)->sin_port = htons(ntohl(req.master_port)); ((struct sockaddr_in *)&test_chan_slave)->sin_port = htons(ntohl(req.slave_port)); break; case AF_INET6: ((struct sockaddr_in6 *)&test_chan_master)->sin6_addr = in6addr_any; ((struct sockaddr_in6 *)&test_chan_master)->sin6_port = htons(ntohl(req.master_port)); ((struct sockaddr_in6 *)&test_chan_slave)->sin6_port = htons(ntohl(req.slave_port)); break; default: pexit("strange TCP sockaddr"); } if (bind(s, (struct sockaddr *)&test_chan_master, sa_len((struct sockaddr *)&test_chan_master)) < 0) { perror("UDP bind <do_udp_test>"); close(s); return; } test_printf("Start %s [%d,%d]", type_name, nbufs, buflen); if (pause_time) { test_printf(" - %dms delay after %d packet%s\n", pause_time*10, pause_threshold, pause_threshold > 1 ? "s" : ""); } else { test_printf(" - no delays\n"); } gettimeofday(&start_time, 0); seq = 0; seq_errors = 0; total_packets = 0; for (i = 0; i < nbufs; i++) { td_len = buflen + sizeof(struct nc_test_data); if (need_send) { tdp = (struct nc_test_data *)out_buf; tdp->key1 = htonl(NC_TEST_DATA_KEY1); tdp->key2 = htonl(NC_TEST_DATA_KEY2); tdp->seq = htonl(i); tdp->len = htonl(td_len); if (sendto(s, tdp, td_len, 0, (struct sockaddr *)&test_chan_slave, sa_len((struct sockaddr *)&test_chan_slave)) < 0) { perror("sendto"); close(s); return; } total_packets++; } if (need_recv) { FD_ZERO(&fds); FD_SET(s, &fds); timeout.tv_sec = NC_TEST_TIMEOUT; timeout.tv_usec = 0; if (select(s+1, &fds, 0, 0, &timeout) <= 0) { test_printf("Slave timed out after %d buffers\n", i); lost_packets++; } else { tdp = (struct nc_test_data *)in_buf; if (recvfrom(s, tdp, td_len, 0, 0, 0) < 0) { perror("recvfrom"); close(s); return; } if ((ntohl(tdp->key1) == NC_TEST_DATA_KEY1) && (ntohl(tdp->key2) == NC_TEST_DATA_KEY2)) { if (ntohl(tdp->seq) != seq) { test_printf("Packets out of sequence - recvd: %d, expected: %d\n", ntohl(tdp->seq), seq); seq_errors++; if (!need_send) { // Reset sequence to what the slave wants seq = ntohl(tdp->seq); } } } else { test_printf("Bad data packet - key: %x/%x, seq: %d\n", ntohl(tdp->key1), ntohl(tdp->key2), ntohl(tdp->seq)); } total_packets++; } seq++; if (seq == nbufs) { break; } if (pause_time && (++pkt_ctr == pause_threshold)) { pkt_ctr = 0; test_delay(pause_time); } } } gettimeofday(&end_time, 0); show_results(type_name, &start_time, &end_time, total_packets, buflen, lost_packets, seq_errors); // Fetch results record FD_ZERO(&fds); FD_SET(s, &fds); timeout.tv_sec = NC_RESULTS_TIMEOUT; timeout.tv_usec = 0; if (select(s+1, &fds, 0, 0, &timeout) <= 0) { test_printf("No results record sent\n"); } else { if (recvfrom(s, &results, sizeof(results), 0, 0, 0) < 0) { perror("recvfrom"); } show_test_results(&results); } close(s); }