1 extern "C" {
2 void *sni_new();
3 void sni_free(void *sni, void (*cb)(void *user));
4 int sni_add(void *sni, const char *hostname, void *user);
5 void *sni_remove(void *sni, const char *hostname);
6 void *sni_find(void *sni, const char *hostname);
7 }
8 
9 #include <assert.h>
10 #include <stdio.h>
11 
12 /* Todo: replace 13, 14 and 15 with malloc */
13 //void *WILDCARD_GOOGLE_COM = strdup("*.google.com");
14 //void *TEST_GOOGLE_COM = strdup("test.google.com");
15 
sni_free_cb(void * user)16 void sni_free_cb(void *user) {
17 	printf("Freeing %p\n", user);
18 }
19 
main()20 int main() {
21 
22 	void *sni = sni_new();
23 
24 	/* Adding should succeed */
25 	assert(sni_add(sni, "*.google.com", 13) == 0);
26 	assert(sni_add(sni, "test.google.com", 14) == 0);
27 
28 	/* Adding the same name should not overwrite existing */
29 	assert(sni_add(sni, "*.google.com", 15) != 0);
30 	assert(sni_find(sni, "anything.google.com") == 13);
31 
32 	assert(sni_find(sni, "docs.google.com") == 13);
33 	assert(sni_find(sni, "*.google.com") == 13);
34 	assert(sni_find(sni, "test.google.com") == 14);
35 	assert(sni_find(sni, "yolo.nothing.com") == 0);
36 	assert(sni_find(sni, "yolo.google.com") == 13);
37 
38 	/* Removing should work */
39 	assert(sni_remove(sni, "test.google.com") == 14);
40 	assert(sni_find(sni, "test.google.com") == 13);
41 	assert(sni_remove(sni, "*.google.com") == 13);
42 	assert(sni_find(sni, "test.google.com") == 0);
43 
44 	/* Removing parent with data should not remove child with data */
45 	assert(sni_add(sni, "www.google.com", 16) == 0);
46 	assert(sni_add(sni, "www.google.com.au.ck.uk", 17) == 0);
47 	assert(sni_find(sni, "www.google.com") == 16);
48 	assert(sni_find(sni, "www.google.com.au.ck.uk") == 17);
49 	assert(sni_remove(sni, "www.google.com.yolo") == 0);
50 	assert(sni_remove(sni, "www.google.com.au.ck.uk") == 17);
51 	assert(sni_find(sni, "www.google.com") == 16);
52 
53 	/* Free should not leave anything remaining (test with ASAN leaksanitizer) */
54 	sni_free(sni, sni_free_cb);
55 
56 	printf("OK\n");
57 }
58