check_public.c revision 8ffb90f1
1#include <check.h> 2#include <string.h> 3#include <stdlib.h> 4#include "check_suites.h" 5#include "xcb.h" 6#include "xcbext.h" 7 8/* xcb_parse_display tests {{{ */ 9 10typedef enum test_type_t { 11 TEST_ARGUMENT, TEST_ENVIRONMENT, TEST_END 12} test_type_t; 13static const char *const test_string[] = { "", "via $DISPLAY " }; 14 15static void parse_display_pass(const char *name, const char *host, const int display, const int screen) 16{ 17 int success; 18 char *got_host; 19 int got_display, got_screen; 20 const char *argument = 0; 21 test_type_t test_type; 22 23 for(test_type = TEST_ARGUMENT; test_type != TEST_END; test_type++) 24 { 25 if(test_type == TEST_ARGUMENT) 26 { 27 argument = name; 28 putenv("DISPLAY="); 29 } 30 else if(test_type == TEST_ENVIRONMENT) 31 { 32 argument = 0; 33 setenv("DISPLAY", name, 1); 34 } 35 36 got_host = (char *) -1; 37 got_display = got_screen = -42; 38 mark_point(); 39 success = xcb_parse_display(argument, &got_host, &got_display, &got_screen); 40 ck_assert_msg(success, "unexpected parse failure %sfor '%s'", test_string[test_type], name); 41 ck_assert_msg(strcmp(host, got_host) == 0, "parse %sproduced unexpected hostname '%s' for '%s': expected '%s'", test_string[test_type], got_host, name, host); 42 ck_assert_msg(display == got_display, "parse %sproduced unexpected display '%d' for '%s': expected '%d'", test_string[test_type], got_display, name, display); 43 ck_assert_msg(screen == got_screen, "parse %sproduced unexpected screen '%d' for '%s': expected '%d'", test_string[test_type], got_screen, name, screen); 44 45 got_host = (char *) -1; 46 got_display = got_screen = -42; 47 mark_point(); 48 success = xcb_parse_display(argument, &got_host, &got_display, 0); 49 ck_assert_msg(success, "unexpected screenless parse failure %sfor '%s'", test_string[test_type], name); 50 ck_assert_msg(strcmp(host, got_host) == 0, "screenless parse %sproduced unexpected hostname '%s' for '%s': expected '%s'", test_string[test_type], got_host, name, host); 51 ck_assert_msg(display == got_display, "screenless parse %sproduced unexpected display '%d' for '%s': expected '%d'", test_string[test_type], got_display, name, display); 52 } 53 putenv("DISPLAY="); 54} 55 56static void parse_display_fail(const char *name) 57{ 58 int success; 59 char *got_host; 60 int got_display, got_screen; 61 const char *argument = 0; 62 test_type_t test_type; 63 64 for(test_type = TEST_ARGUMENT; test_type != TEST_END; test_type++) 65 { 66 if(test_type == TEST_ARGUMENT) 67 { 68 argument = name; 69 putenv("DISPLAY="); 70 } 71 else if(test_type == TEST_ENVIRONMENT) 72 { 73 if (!name) break; 74 argument = 0; 75 setenv("DISPLAY", name, 1); 76 } 77 78 got_host = (char *) -1; 79 got_display = got_screen = -42; 80 mark_point(); 81 success = xcb_parse_display(argument, &got_host, &got_display, &got_screen); 82 ck_assert_msg(!success, "unexpected parse success %sfor '%s'", test_string[test_type], name); 83 ck_assert_msg(got_host == (char *) -1, "host changed on parse failure %sfor '%s': got %p", test_string[test_type], name, got_host); 84 ck_assert_msg(got_display == -42, "display changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_display); 85 ck_assert_msg(got_screen == -42, "screen changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_screen); 86 87 got_host = (char *) -1; 88 got_display = got_screen = -42; 89 mark_point(); 90 success = xcb_parse_display(argument, &got_host, &got_display, 0); 91 ck_assert_msg(!success, "unexpected screenless parse success %sfor '%s'", test_string[test_type], name); 92 ck_assert_msg(got_host == (char *) -1, "host changed on parse failure %sfor '%s': got %p", test_string[test_type], name, got_host); 93 ck_assert_msg(got_display == -42, "display changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_display); 94 } 95 putenv("DISPLAY="); 96} 97 98START_TEST(parse_display_unix) 99{ 100 parse_display_pass(":0", "", 0, 0); 101 parse_display_pass(":1", "", 1, 0); 102 parse_display_pass(":0.1", "", 0, 1); 103} 104END_TEST 105 106START_TEST(parse_display_ip) 107{ 108 parse_display_pass("x.org:0", "x.org", 0, 0); 109 parse_display_pass("expo:0", "expo", 0, 0); 110 parse_display_pass("bigmachine:1", "bigmachine", 1, 0); 111 parse_display_pass("hydra:0.1", "hydra", 0, 1); 112} 113END_TEST 114 115START_TEST(parse_display_ipv4) 116{ 117 parse_display_pass("198.112.45.11:0", "198.112.45.11", 0, 0); 118 parse_display_pass("198.112.45.11:0.1", "198.112.45.11", 0, 1); 119} 120END_TEST 121 122START_TEST(parse_display_ipv6) 123{ 124 parse_display_pass(":::0", "::", 0, 0); 125 parse_display_pass("1:::0", "1::", 0, 0); 126 parse_display_pass("::1:0", "::1", 0, 0); 127 parse_display_pass("::1:0.1", "::1", 0, 1); 128 parse_display_pass("::127.0.0.1:0", "::127.0.0.1", 0, 0); 129 parse_display_pass("::ffff:127.0.0.1:0", "::ffff:127.0.0.1", 0, 0); 130 parse_display_pass("2002:83fc:d052::1:0", "2002:83fc:d052::1", 0, 0); 131 parse_display_pass("2002:83fc:d052::1:0.1", "2002:83fc:d052::1", 0, 1); 132 parse_display_pass("[::]:0", "[::]", 0, 0); 133 parse_display_pass("[1::]:0", "[1::]", 0, 0); 134 parse_display_pass("[::1]:0", "[::1]", 0, 0); 135 parse_display_pass("[::1]:0.1", "[::1]", 0, 1); 136 parse_display_pass("[::127.0.0.1]:0", "[::127.0.0.1]", 0, 0); 137 parse_display_pass("[::ffff:127.0.0.1]:0", "[::ffff:127.0.0.1]", 0, 0); 138 parse_display_pass("[2002:83fc:d052::1]:0", "[2002:83fc:d052::1]", 0, 0); 139 parse_display_pass("[2002:83fc:d052::1]:0.1", "[2002:83fc:d052::1]", 0, 1); 140} 141END_TEST 142 143START_TEST(parse_display_decnet) 144{ 145 parse_display_pass("myws::0", "myws:", 0, 0); 146 parse_display_pass("big::1", "big:", 1, 0); 147 parse_display_pass("hydra::0.1", "hydra:", 0, 1); 148} 149END_TEST 150 151START_TEST(parse_display_negative) 152{ 153 parse_display_fail(0); 154 parse_display_fail(""); 155 parse_display_fail(":"); 156 parse_display_fail("::"); 157 parse_display_fail(":::"); 158 parse_display_fail(":."); 159 parse_display_fail(":a"); 160 parse_display_fail(":a."); 161 parse_display_fail(":0."); 162 parse_display_fail(":.a"); 163 parse_display_fail(":.0"); 164 parse_display_fail(":0.a"); 165 parse_display_fail(":0.0."); 166 167 parse_display_fail("127.0.0.1"); 168 parse_display_fail("127.0.0.1:"); 169 parse_display_fail("127.0.0.1::"); 170 parse_display_fail("::127.0.0.1"); 171 parse_display_fail("::127.0.0.1:"); 172 parse_display_fail("::127.0.0.1::"); 173 parse_display_fail("::ffff:127.0.0.1"); 174 parse_display_fail("::ffff:127.0.0.1:"); 175 parse_display_fail("::ffff:127.0.0.1::"); 176 parse_display_fail("localhost"); 177 parse_display_fail("localhost:"); 178 parse_display_fail("localhost::"); 179} 180END_TEST 181 182/* }}} */ 183 184static void popcount_eq(uint32_t bits, int count) 185{ 186 ck_assert_msg(xcb_popcount(bits) == count, "unexpected popcount(%08x) != %d", bits, count); 187} 188 189START_TEST(popcount) 190{ 191 uint32_t mask; 192 int count; 193 194 for (mask = 0xffffffff, count = 32; count >= 0; mask >>= 1, --count) { 195 popcount_eq(mask, count); 196 } 197 for (mask = 0x80000000; mask; mask >>= 1) { 198 popcount_eq(mask, 1); 199 } 200 for (mask = 0x80000000; mask > 1; mask >>= 1) { 201 popcount_eq(mask | 1, 2); 202 } 203} 204END_TEST 205 206Suite *public_suite(void) 207{ 208 Suite *s = suite_create("Public API"); 209 putenv("DISPLAY="); 210 suite_add_test(s, parse_display_unix, "xcb_parse_display unix"); 211 suite_add_test(s, parse_display_ip, "xcb_parse_display ip"); 212 suite_add_test(s, parse_display_ipv4, "xcb_parse_display ipv4"); 213 suite_add_test(s, parse_display_ipv6, "xcb_parse_display ipv6"); 214 suite_add_test(s, parse_display_decnet, "xcb_parse_display decnet"); 215 suite_add_test(s, parse_display_negative, "xcb_parse_display negative"); 216 suite_add_test(s, popcount, "xcb_popcount"); 217 return s; 218} 219