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