check_public.c revision 8ffb90f1
1602e473dSmrg#include <check.h>
2602e473dSmrg#include <string.h>
3602e473dSmrg#include <stdlib.h>
4602e473dSmrg#include "check_suites.h"
5602e473dSmrg#include "xcb.h"
6602e473dSmrg#include "xcbext.h"
7602e473dSmrg
8602e473dSmrg/* xcb_parse_display tests {{{ */
9602e473dSmrg
10602e473dSmrgtypedef enum test_type_t {
11602e473dSmrg	TEST_ARGUMENT, TEST_ENVIRONMENT, TEST_END
12602e473dSmrg} test_type_t;
13602e473dSmrgstatic const char *const test_string[] = { "", "via $DISPLAY " };
14602e473dSmrg
15602e473dSmrgstatic void parse_display_pass(const char *name, const char *host, const int display, const int screen)
16602e473dSmrg{
17602e473dSmrg	int success;
18602e473dSmrg	char *got_host;
19602e473dSmrg	int got_display, got_screen;
20602e473dSmrg	const char *argument = 0;
21602e473dSmrg	test_type_t test_type;
22602e473dSmrg
23602e473dSmrg	for(test_type = TEST_ARGUMENT; test_type != TEST_END; test_type++)
24602e473dSmrg	{
25602e473dSmrg		if(test_type == TEST_ARGUMENT)
26602e473dSmrg		{
27602e473dSmrg			argument = name;
28602e473dSmrg			putenv("DISPLAY=");
29602e473dSmrg		}
30602e473dSmrg		else if(test_type == TEST_ENVIRONMENT)
31602e473dSmrg		{
32602e473dSmrg			argument = 0;
33602e473dSmrg			setenv("DISPLAY", name, 1);
34602e473dSmrg		}
35602e473dSmrg
36602e473dSmrg		got_host = (char *) -1;
37602e473dSmrg		got_display = got_screen = -42;
38602e473dSmrg		mark_point();
39602e473dSmrg		success = xcb_parse_display(argument, &got_host, &got_display, &got_screen);
408ffb90f1Smrg		ck_assert_msg(success, "unexpected parse failure %sfor '%s'", test_string[test_type], name);
418ffb90f1Smrg		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);
428ffb90f1Smrg		ck_assert_msg(display == got_display, "parse %sproduced unexpected display '%d' for '%s': expected '%d'", test_string[test_type], got_display, name, display);
438ffb90f1Smrg		ck_assert_msg(screen == got_screen, "parse %sproduced unexpected screen '%d' for '%s': expected '%d'", test_string[test_type], got_screen, name, screen);
44602e473dSmrg
45602e473dSmrg		got_host = (char *) -1;
46602e473dSmrg		got_display = got_screen = -42;
47602e473dSmrg		mark_point();
48602e473dSmrg		success = xcb_parse_display(argument, &got_host, &got_display, 0);
498ffb90f1Smrg		ck_assert_msg(success, "unexpected screenless parse failure %sfor '%s'", test_string[test_type], name);
508ffb90f1Smrg		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);
518ffb90f1Smrg		ck_assert_msg(display == got_display, "screenless parse %sproduced unexpected display '%d' for '%s': expected '%d'", test_string[test_type], got_display, name, display);
52602e473dSmrg	}
53602e473dSmrg	putenv("DISPLAY=");
54602e473dSmrg}
55602e473dSmrg
56602e473dSmrgstatic void parse_display_fail(const char *name)
57602e473dSmrg{
58602e473dSmrg	int success;
59602e473dSmrg	char *got_host;
60602e473dSmrg	int got_display, got_screen;
61602e473dSmrg	const char *argument = 0;
62602e473dSmrg	test_type_t test_type;
63602e473dSmrg
64602e473dSmrg	for(test_type = TEST_ARGUMENT; test_type != TEST_END; test_type++)
65602e473dSmrg	{
66602e473dSmrg		if(test_type == TEST_ARGUMENT)
67602e473dSmrg		{
68602e473dSmrg			argument = name;
69602e473dSmrg			putenv("DISPLAY=");
70602e473dSmrg		}
71602e473dSmrg		else if(test_type == TEST_ENVIRONMENT)
72602e473dSmrg		{
73602e473dSmrg			if (!name) break;
74602e473dSmrg			argument = 0;
75602e473dSmrg			setenv("DISPLAY", name, 1);
76602e473dSmrg		}
77602e473dSmrg
78602e473dSmrg		got_host = (char *) -1;
79602e473dSmrg		got_display = got_screen = -42;
80602e473dSmrg		mark_point();
81602e473dSmrg		success = xcb_parse_display(argument, &got_host, &got_display, &got_screen);
828ffb90f1Smrg		ck_assert_msg(!success, "unexpected parse success %sfor '%s'", test_string[test_type], name);
838ffb90f1Smrg		ck_assert_msg(got_host == (char *) -1, "host changed on parse failure %sfor '%s': got %p", test_string[test_type], name, got_host);
848ffb90f1Smrg		ck_assert_msg(got_display == -42, "display changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_display);
858ffb90f1Smrg		ck_assert_msg(got_screen == -42, "screen changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_screen);
86602e473dSmrg
87602e473dSmrg		got_host = (char *) -1;
88602e473dSmrg		got_display = got_screen = -42;
89602e473dSmrg		mark_point();
90602e473dSmrg		success = xcb_parse_display(argument, &got_host, &got_display, 0);
918ffb90f1Smrg		ck_assert_msg(!success, "unexpected screenless parse success %sfor '%s'", test_string[test_type], name);
928ffb90f1Smrg		ck_assert_msg(got_host == (char *) -1, "host changed on parse failure %sfor '%s': got %p", test_string[test_type], name, got_host);
938ffb90f1Smrg		ck_assert_msg(got_display == -42, "display changed on parse failure %sfor '%s': got %d", test_string[test_type], name, got_display);
94602e473dSmrg	}
95602e473dSmrg	putenv("DISPLAY=");
96602e473dSmrg}
97602e473dSmrg
98602e473dSmrgSTART_TEST(parse_display_unix)
99602e473dSmrg{
100602e473dSmrg	parse_display_pass(":0", "", 0, 0);
101602e473dSmrg	parse_display_pass(":1", "", 1, 0);
102602e473dSmrg	parse_display_pass(":0.1", "", 0, 1);
103602e473dSmrg}
104602e473dSmrgEND_TEST
105602e473dSmrg
106602e473dSmrgSTART_TEST(parse_display_ip)
107602e473dSmrg{
108602e473dSmrg	parse_display_pass("x.org:0", "x.org", 0, 0);
109602e473dSmrg	parse_display_pass("expo:0", "expo", 0, 0);
110602e473dSmrg	parse_display_pass("bigmachine:1", "bigmachine", 1, 0);
111602e473dSmrg	parse_display_pass("hydra:0.1", "hydra", 0, 1);
112602e473dSmrg}
113602e473dSmrgEND_TEST
114602e473dSmrg
115602e473dSmrgSTART_TEST(parse_display_ipv4)
116602e473dSmrg{
117602e473dSmrg	parse_display_pass("198.112.45.11:0", "198.112.45.11", 0, 0);
118602e473dSmrg	parse_display_pass("198.112.45.11:0.1", "198.112.45.11", 0, 1);
119602e473dSmrg}
120602e473dSmrgEND_TEST
121602e473dSmrg
122602e473dSmrgSTART_TEST(parse_display_ipv6)
123602e473dSmrg{
124602e473dSmrg	parse_display_pass(":::0", "::", 0, 0);
125602e473dSmrg	parse_display_pass("1:::0", "1::", 0, 0);
126602e473dSmrg	parse_display_pass("::1:0", "::1", 0, 0);
127602e473dSmrg	parse_display_pass("::1:0.1", "::1", 0, 1);
128602e473dSmrg	parse_display_pass("::127.0.0.1:0", "::127.0.0.1", 0, 0);
129602e473dSmrg	parse_display_pass("::ffff:127.0.0.1:0", "::ffff:127.0.0.1", 0, 0);
130602e473dSmrg	parse_display_pass("2002:83fc:d052::1:0", "2002:83fc:d052::1", 0, 0);
131602e473dSmrg	parse_display_pass("2002:83fc:d052::1:0.1", "2002:83fc:d052::1", 0, 1);
132602e473dSmrg	parse_display_pass("[::]:0", "[::]", 0, 0);
133602e473dSmrg	parse_display_pass("[1::]:0", "[1::]", 0, 0);
134602e473dSmrg	parse_display_pass("[::1]:0", "[::1]", 0, 0);
135602e473dSmrg	parse_display_pass("[::1]:0.1", "[::1]", 0, 1);
136602e473dSmrg	parse_display_pass("[::127.0.0.1]:0", "[::127.0.0.1]", 0, 0);
137602e473dSmrg	parse_display_pass("[::ffff:127.0.0.1]:0", "[::ffff:127.0.0.1]", 0, 0);
138602e473dSmrg	parse_display_pass("[2002:83fc:d052::1]:0", "[2002:83fc:d052::1]", 0, 0);
139602e473dSmrg	parse_display_pass("[2002:83fc:d052::1]:0.1", "[2002:83fc:d052::1]", 0, 1);
140602e473dSmrg}
141602e473dSmrgEND_TEST
142602e473dSmrg
143602e473dSmrgSTART_TEST(parse_display_decnet)
144602e473dSmrg{
145602e473dSmrg	parse_display_pass("myws::0", "myws:", 0, 0);
146602e473dSmrg	parse_display_pass("big::1", "big:", 1, 0);
147602e473dSmrg	parse_display_pass("hydra::0.1", "hydra:", 0, 1);
148602e473dSmrg}
149602e473dSmrgEND_TEST
150602e473dSmrg
151602e473dSmrgSTART_TEST(parse_display_negative)
152602e473dSmrg{
153602e473dSmrg	parse_display_fail(0);
154602e473dSmrg	parse_display_fail("");
155602e473dSmrg	parse_display_fail(":");
156602e473dSmrg	parse_display_fail("::");
157602e473dSmrg	parse_display_fail(":::");
158602e473dSmrg	parse_display_fail(":.");
159602e473dSmrg	parse_display_fail(":a");
160602e473dSmrg	parse_display_fail(":a.");
161602e473dSmrg	parse_display_fail(":0.");
162602e473dSmrg	parse_display_fail(":.a");
163602e473dSmrg	parse_display_fail(":.0");
164602e473dSmrg	parse_display_fail(":0.a");
165602e473dSmrg	parse_display_fail(":0.0.");
166602e473dSmrg
167602e473dSmrg	parse_display_fail("127.0.0.1");
168602e473dSmrg	parse_display_fail("127.0.0.1:");
169602e473dSmrg	parse_display_fail("127.0.0.1::");
170602e473dSmrg	parse_display_fail("::127.0.0.1");
171602e473dSmrg	parse_display_fail("::127.0.0.1:");
172602e473dSmrg	parse_display_fail("::127.0.0.1::");
173602e473dSmrg	parse_display_fail("::ffff:127.0.0.1");
174602e473dSmrg	parse_display_fail("::ffff:127.0.0.1:");
175602e473dSmrg	parse_display_fail("::ffff:127.0.0.1::");
176602e473dSmrg	parse_display_fail("localhost");
177602e473dSmrg	parse_display_fail("localhost:");
178602e473dSmrg	parse_display_fail("localhost::");
179602e473dSmrg}
180602e473dSmrgEND_TEST
181602e473dSmrg
182602e473dSmrg/* }}} */
183602e473dSmrg
184602e473dSmrgstatic void popcount_eq(uint32_t bits, int count)
185602e473dSmrg{
1868ffb90f1Smrg	ck_assert_msg(xcb_popcount(bits) == count, "unexpected popcount(%08x) != %d", bits, count);
187602e473dSmrg}
188602e473dSmrg
189602e473dSmrgSTART_TEST(popcount)
190602e473dSmrg{
191602e473dSmrg	uint32_t mask;
192602e473dSmrg	int count;
193602e473dSmrg
194602e473dSmrg	for (mask = 0xffffffff, count = 32; count >= 0; mask >>= 1, --count) {
195602e473dSmrg		popcount_eq(mask, count);
196602e473dSmrg	}
197602e473dSmrg	for (mask = 0x80000000; mask; mask >>= 1) {
198602e473dSmrg		popcount_eq(mask, 1);
199602e473dSmrg	}
200602e473dSmrg	for (mask = 0x80000000; mask > 1; mask >>= 1) {
201602e473dSmrg		popcount_eq(mask | 1, 2);
202602e473dSmrg	}
203602e473dSmrg}
204602e473dSmrgEND_TEST
205602e473dSmrg
206602e473dSmrgSuite *public_suite(void)
207602e473dSmrg{
208602e473dSmrg	Suite *s = suite_create("Public API");
209602e473dSmrg	putenv("DISPLAY=");
210602e473dSmrg	suite_add_test(s, parse_display_unix, "xcb_parse_display unix");
211602e473dSmrg	suite_add_test(s, parse_display_ip, "xcb_parse_display ip");
212602e473dSmrg	suite_add_test(s, parse_display_ipv4, "xcb_parse_display ipv4");
213602e473dSmrg	suite_add_test(s, parse_display_ipv6, "xcb_parse_display ipv6");
214602e473dSmrg	suite_add_test(s, parse_display_decnet, "xcb_parse_display decnet");
215602e473dSmrg	suite_add_test(s, parse_display_negative, "xcb_parse_display negative");
216602e473dSmrg	suite_add_test(s, popcount, "xcb_popcount");
217602e473dSmrg	return s;
218602e473dSmrg}
219