diff --git a/checker/2-uart-checker/_test/solution.ko b/checker/2-uart-checker/_test/solution.ko index 80c4a773b9b8eebe4dbbd66336e0f0fd3ca2cda4..996dd21ac572b8fd91bc14645e9bf6e57f4093d8 100644 Binary files a/checker/2-uart-checker/_test/solution.ko and b/checker/2-uart-checker/_test/solution.ko differ diff --git a/checker/2-uart-checker/_test/test.c b/checker/2-uart-checker/_test/test.c index ab42a72f4e7bc79bd44ee0c75fdfd05517cf1e46..5c0da2dc93023c09ba6e02bd5e32d54c3b62586b 100644 --- a/checker/2-uart-checker/_test/test.c +++ b/checker/2-uart-checker/_test/test.c @@ -42,13 +42,18 @@ exit(EXIT_FAILURE); \ } while (0) -#define test(d, v, e) do_test((d), (v), (e), 0, 0) -#define not_test(d, v, e) do_test((d), (v), (e), 1, 0) -#define fatal_test(d, v, e) do_test((d), (v), (e), 0, 1) +#define test(d, v, e, p) do_test((d), (v), (e), 0, 0, (p)) +#define not_test(d, v, e, p) do_test((d), (v), (e), 1, 0, (p)) +#define fatal_test(d, v, e,p) do_test((d), (v), (e), 0, 1, (p)) -static int -do_test(const char *description, int value, int expected, int negate, int fatal) +/* + * if the test passes it will return 0 + * if it fails it returns the number of points given as argument + */ +static float +do_test(const char *description, int value, int expected, int negate, int fatal, float points) { + cnt += points; int num_chars; num_chars = printf("%s", description); @@ -58,24 +63,24 @@ do_test(const char *description, int value, int expected, int negate, int fatal) fflush(stdout); if (!negate) { if (value == expected) { - printf("passed\n"); + printf("passed %.1f\n", points); return 0; } else { - printf("failed\n"); + printf("failed 0\n"); if (fatal) exit(EXIT_FAILURE); } } else { if (value != expected) { - printf("passed\n"); + printf("passed %.1f\n", points); return 0; } else { - printf("failed\n"); + printf("failed 0\n"); if (fatal) exit(EXIT_FAILURE); } } - return 1; + return points; } static void @@ -112,100 +117,96 @@ remove_nodes(void) unlink(UART10); } -static int +static float test1(void) { - int err = 0; + float total = 16; test_title("Test 1. Module insertion and removal"); /* Insert module with default params and test. */ - err |= fatal_test("insmod " MODULE_NAME ", default options", - system("insmod " MODULE_NAME ".ko"), 0); - err |= test("major", + total -= fatal_test("insmod " MODULE_NAME ", default options", + system("insmod " MODULE_NAME ".ko"), 0, 1); + total -= test("major", system("cat /proc/devices | grep '" XSTR(COM1_MAJOR) " " MODULE_NAME "' >/dev/null 2>&1"), - 0); - err |= test("ioports COM1", + 0, 1); + total -= test("ioports COM1", system("cat /proc/ioports | grep '03f8-03ff : " MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("ioports COM2", + 0, 1); + total -= test("ioports COM2", system("cat /proc/ioports | grep '02f8-02ff : " MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("interrupts COM1", + 0, 1); + total -= test("interrupts COM1", system("cat /proc/interrupts | grep '4:.*" MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("interrupts COM2", + 0, 1); + total -= test("interrupts COM2", system("cat /proc/interrupts | grep '3:.*" MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("rmmod", system("rmmod " MODULE_NAME), 0); - if (err) - return err; + 0, 1); + total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5); /* Insert module with different major. */ - err |= fatal_test("insmod " MODULE_NAME ", major=" XSTR(COM2_MAJOR), - system("insmod " MODULE_NAME ".ko major=" XSTR(COM2_MAJOR)), 0); - err |= test("major", + total -= fatal_test("insmod " MODULE_NAME ", major=" XSTR(COM2_MAJOR), + system("insmod " MODULE_NAME ".ko major=" XSTR(COM2_MAJOR)), 0, 1); + total -= test("major", system("cat /proc/devices | grep '" XSTR(COM2_MAJOR) " " MODULE_NAME "' >/dev/null 2>&1"), - 0); - err |= test("rmmod", system("rmmod " MODULE_NAME), 0); - if (err) - return err; + 0, 1); + total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5); /* Insert module only for COM2, check that it works side by side * with solution. */ - err |= fatal_test("insmod " MODULE_NAME ", COM2 only", + total -= fatal_test("insmod " MODULE_NAME ", COM2 only", system("insmod " MODULE_NAME ".ko option=" XSTR(OPTION_COM2_ONLY)), - 0); - err |= fatal_test("insmod " SOLUTION_NAME ", COM1 only", + 0, 1); + total -= fatal_test("insmod " SOLUTION_NAME ", COM1 only", system("insmod " SOLUTION_NAME ".ko option=" XSTR(OPTION_COM1_ONLY)), - 0); - err |= test("ioports COM1", + 0, 1); + total -= test("ioports COM1", system("cat /proc/ioports | grep '03f8-03ff : " SOLUTION_NAME "' > /dev/null 2>&1"), - 0); - err |= test("ioports COM2", + 0, 1); + total -= test("ioports COM2", system("cat /proc/ioports | grep '02f8-02ff : " MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("interrupts COM1", + 0, 1); + total -= test("interrupts COM1", system("cat /proc/interrupts | grep '4:.*" SOLUTION_NAME "' > /dev/null 2>&1"), - 0); - err |= test("interrupts COM2", + 0, 1); + total -= test("interrupts COM2", system("cat /proc/interrupts | grep '3:.*" MODULE_NAME "' > /dev/null 2>&1"), - 0); - err |= test("rmmod " MODULE_NAME, system("rmmod " MODULE_NAME), 0); - err |= test("rmmod " SOLUTION_NAME, system("rmmod " SOLUTION_NAME), 0); + 0, 1); + total -= test("rmmod " MODULE_NAME, system("rmmod " MODULE_NAME), 0, 0.5); + total -= test("rmmod " SOLUTION_NAME, system("rmmod " SOLUTION_NAME), 0, 0.5); - return err; + return total; } -static int +static float test2(void) { - int err = 0; + float total = 5.5; int fd; test_title("Test 2. Invalid parameters"); /* Check ioctl sanity. */ - err |= fatal_test("insmod", system("insmod " MODULE_NAME ".ko"), 0); + total -= fatal_test("insmod", system("insmod " MODULE_NAME ".ko"), 0, 1); fd = open(UART0, O_RDWR); if (fd == -1) fail("open " UART0); #define ioctl_test(n) test("invalid ioctl " XSTR((n)), \ - ioctl(fd, UART16550_IOCTL_SET_LINE, (n)), -1) - err |= ioctl_test(0xdeadbeef); - err |= ioctl_test(0x1337cafe); + ioctl(fd, UART16550_IOCTL_SET_LINE, (n)), -1, 1) + total -= ioctl_test(0xdeadbeef); + total -= ioctl_test(0x1337cafe); #undef ioctl_test - err |= test("invalid ioctl wrong operation", ioctl(fd, 0xffff), -1); + total -= test("invalid ioctl wrong operation", ioctl(fd, 0xffff), -1, 1); close(fd); - err |= test("rmmod", system("rmmod " MODULE_NAME), 0); + total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5); /* Check invalid module parameters. */ - err |= not_test("insmod " MODULE_NAME ", option=0xdeadbabe", + total -= not_test("insmod " MODULE_NAME ", option=0xdeadbabe", system("insmod " MODULE_NAME ".ko option=0xdeadbabe"), - 0); + 0, 1); - return err; + return total; } /* Speed sets: @@ -375,11 +376,12 @@ copy_test(int fd0, int fd1, int speed_set) return system("diff " INFILE " " OUTFILE "> /dev/null 2> /dev/null"); } -static int +static float generic_test(const char *reader, const char *writer, int speed_set, int num_tests) { - int fd0, fd1, i, err = 0; + int fd0, fd1, i; + float total = num_tests * 1.5 + (reader != writer ? 6 : 4) * 0.5; char dbuf[1024], cbuf[1024]; struct uart16550_line_info uli; @@ -387,15 +389,15 @@ generic_test(const char *reader, const char *writer, int speed_set, sprintf(dbuf, "insmod %s", reader); sprintf(cbuf, "insmod %s.ko option=%d", reader, OPTION_COM2_ONLY); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); sprintf(dbuf, "insmod %s", writer); sprintf(cbuf, "insmod %s.ko option=%d", writer, OPTION_COM1_ONLY); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); } else { sprintf(dbuf, "insmod %s", reader); sprintf(cbuf, "insmod %s.ko", reader); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); } gen_params(&uli, speed_set); @@ -405,14 +407,14 @@ generic_test(const char *reader, const char *writer, int speed_set, fd1 = open(UART1, O_RDONLY); if (fd1 == -1) fail("open " UART1); - err |= test("ioctl reader", - ioctl(fd1, UART16550_IOCTL_SET_LINE, &uli), 0); - err |= test("ioctl writer", - ioctl(fd0, UART16550_IOCTL_SET_LINE, &uli), 0); + total -= test("ioctl reader", + ioctl(fd1, UART16550_IOCTL_SET_LINE, &uli), 0, 0.5); + total -= test("ioctl writer", + ioctl(fd0, UART16550_IOCTL_SET_LINE, &uli), 0, 0.5); for (i = 0; i < num_tests; i++) { sprintf(dbuf, "test %02d", i + 1); - test(dbuf, copy_test(fd0, fd1, speed_set), 0); + total -= test(dbuf, copy_test(fd0, fd1, speed_set), 0, 1.5); } close(fd0); @@ -421,17 +423,17 @@ generic_test(const char *reader, const char *writer, int speed_set, if (reader != writer) { sprintf(dbuf, "rmmod %s", reader); sprintf(cbuf, "rmmod %s.ko", reader); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); sprintf(dbuf, "rmmod %s", writer); sprintf(cbuf, "rmmod %s.ko", writer); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); } else { sprintf(dbuf, "rmmod %s", reader); sprintf(cbuf, "rmmod %s.ko", reader); - fatal_test(dbuf, system(cbuf), 0); + total -= fatal_test(dbuf, system(cbuf), 0, 0.5); } - return err; + return total; } #define choose_one(rd, wr) do { \ @@ -445,7 +447,7 @@ generic_test(const char *reader, const char *writer, int speed_set, } \ } while (0) -static int +static float test3(void) { const char *rd, *wr; @@ -456,7 +458,7 @@ test3(void) return generic_test(rd, wr, 0, 5); } -static int +static float test4(void) { const char *rd, *wr; @@ -467,7 +469,7 @@ test4(void) return generic_test(rd, wr, 0, 5); } -static int +static float test5(void) { const char *rd, *wr; @@ -477,7 +479,7 @@ test5(void) return generic_test(rd, wr, 0, 5); } -static int +static float test6(void) { const char *rd, *wr; @@ -487,7 +489,7 @@ test6(void) return generic_test(rd, wr, 1, 5); } -static int +static float test7(void) { const char *rd, *wr; @@ -497,7 +499,7 @@ test7(void) return generic_test(rd, wr, 1, 5); } -static int +static float test8(void) { const char *rd, *wr; @@ -507,7 +509,7 @@ test8(void) return generic_test(rd, wr, 2, 5); } -static int +static float test9(void) { const char *rd, *wr; @@ -520,35 +522,26 @@ test9(void) int main(void) { - int num_passed = 0; - const int total = 9; + float num_passed = 0; + const int total = 92; srand(time(NULL)); make_nodes(); - if (test1() == 0) - num_passed++; - if (test2() == 0) - num_passed++; - if (test3() == 0) - num_passed++; - if (test4() == 0) - num_passed++; - if (test5() == 0) - num_passed++; - if (test6() == 0) - num_passed++; - if (test7() == 0) - num_passed++; - if (test8() == 0) - num_passed++; - if (test9() == 0) - num_passed++; + num_passed += test1(); + num_passed += test2(); + num_passed += test3(); + num_passed += test4(); + num_passed += test5(); + num_passed += test6(); + num_passed += test7(); + num_passed += test8(); + num_passed += test9(); remove_nodes(); unlink(INFILE); unlink(OUTFILE); - printf("\nFinal score: %d/%d\n", num_passed, total); + printf("\nTotal: [%.1f/%d]\n", num_passed, total); return 0; } diff --git a/checker/checker.sh b/checker/checker.sh index 27e16bf06747d00b59f3bd53adc598c1e9157902..4a29e71d2b9a23f61b298630436273e0d8270f97 100755 --- a/checker/checker.sh +++ b/checker/checker.sh @@ -141,7 +141,7 @@ run_checker() done fi - LINUX_ADD_CMDLINE="so2=$assignment" ./qemu/run-qemu.sh &> /dev/null & + LINUX_ADD_CMDLINE="so2=$assignment" make checker &> /dev/null & echo -n "CHECKER IS RUNNING" while [ ! -f $finished ]