xref: /minix/minix/tests/ds/dstest.c (revision 7f5f010b)
1 #include "inc.h"
2 
3 char *key_u32 = "test_u32";
4 char *key_str = "test_str";
5 char *key_mem = "test_mem";
6 char *key_label = "test_label";
7 
8 /*===========================================================================*
9  *				test_u32				     *
10  *===========================================================================*/
11 void test_u32(void)
12 {
13 	int r;
14 	u32_t value;
15 
16 	/* Publish and retrieve. */
17 	r = ds_publish_u32(key_u32, 1234, 0);
18 	assert(r == OK);
19 	r = ds_retrieve_u32(key_u32, &value);
20 	assert(r == OK && value == 1234);
21 
22 	/* If dstest deletes 'test_u32' immediately after publishing it,
23 	 * subs will catch the event, but it can't check it immediately.
24 	 * So dstest will sleep 2 seconds to wait for subs to complete. */
25 	sleep(2);
26 
27 	/* Publish again without DSF_OVERWRITE. */
28 	r = ds_publish_u32(key_u32, 4321, 0);
29 	assert(r == EEXIST);
30 
31 	/* Publish again with DSF_OVERWRITE to overwrite it. */
32 	r = ds_publish_u32(key_u32, 4321, DSF_OVERWRITE);
33 	assert(r == OK);
34 	r = ds_retrieve_u32(key_u32, &value);
35 	assert(r == OK && value == 4321);
36 
37 	/* Delete. */
38 	r = ds_delete_u32(key_u32);
39 	assert(r == OK);
40 	r = ds_retrieve_u32(key_u32, &value);
41 	assert(r == ESRCH);
42 
43 	printf("DSTEST: U32 test successful!\n");
44 }
45 
46 /*===========================================================================*
47  *				test_str				     *
48  *===========================================================================*/
49 void test_str(void)
50 {
51 	int r;
52 	char *string = "little";
53 	char *longstring = "verylooooooongstring";
54 	char buf[17];
55 
56 	r = ds_publish_str(key_str, string, 0);
57 	assert(r == OK);
58 
59 	r = ds_retrieve_str(key_str, buf, sizeof(buf)-1);
60 	assert(r == OK && strcmp(string, buf) == 0);
61 
62 	r = ds_delete_str(key_str);
63 	assert(r == OK);
64 
65 	/* Publish a long string. */
66 	r = ds_publish_str(key_str, longstring, 0);
67 	assert(r == OK);
68 
69 	r = ds_retrieve_str(key_str, buf, sizeof(buf)-1);
70 	assert(r == OK && strcmp(string, buf) != 0
71 		&& strncmp(longstring, buf, sizeof(buf)-1) == 0);
72 
73 	r = ds_delete_str(key_str);
74 	assert(r == OK);
75 
76 	printf("DSTEST: STRING test successful!\n");
77 }
78 
79 /*===========================================================================*
80  *				test_mem				     *
81  *===========================================================================*/
82 void test_mem(void)
83 {
84 	char *string1 = "ok, this is a string";
85 	char *string2 = "ok, this is a very looooong string";
86 	size_t len1 = strlen(string1) + 1;
87 	size_t len2 = strlen(string2) + 1;
88 	char buf[100];
89 	size_t get_len;
90 	int r;
91 
92 	/* Publish and retrieve. */
93 	r = ds_publish_mem(key_mem, string1, len1, 0);
94 	assert(r == OK);
95 	get_len = 100;
96 	r = ds_retrieve_mem(key_mem, buf, &get_len);
97 	assert(r == OK && strcmp(string1, buf) == 0);
98 	assert(get_len == len1);
99 
100 	/* Let get_len=8, which is less than strlen(string1). */
101 	get_len = 8;
102 	r = ds_retrieve_mem(key_mem, buf, &get_len);
103 	assert(r == OK && get_len == 8);
104 
105 	/* Publish again to overwrite with a bigger memory range. */
106 	r = ds_publish_mem(key_mem, string2, len2, DSF_OVERWRITE);
107 	assert(r == OK);
108 
109 	get_len = 100;
110 	r = ds_retrieve_mem(key_mem, buf, &get_len);
111 	assert(r == OK && strcmp(string2, buf) == 0);
112 	assert(get_len == len2);
113 
114 	r = ds_delete_mem(key_mem);
115 	assert(r == OK);
116 
117 	printf("DSTEST: MEM test successful!\n");
118 }
119 
120 /*===========================================================================*
121  *				test_label				     *
122  *===========================================================================*/
123 void test_label(void)
124 {
125 	int r;
126 	char label[DS_MAX_KEYLEN];
127 	endpoint_t endpoint;
128 
129 	/* Retrieve own label and endpoint. */
130 	r = ds_retrieve_label_name(label, sef_self());
131 	assert(r == OK);
132 	r = ds_retrieve_label_endpt(label, &endpoint);
133 	assert(r == OK && endpoint == sef_self());
134 
135 	/* Publish and delete. */
136 	r = ds_publish_label(label, endpoint, 0);
137 	assert(r == EPERM);
138 	r = ds_delete_label(label);
139 	assert(r == EPERM);
140 
141 	printf("DSTEST: LABEL test successful!\n");
142 }
143 
144 /*===========================================================================*
145  *			       sef_cb_init_fresh			     *
146  *===========================================================================*/
147 static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
148 {
149 	/* Run all the tests. */
150 	test_u32();
151 	test_str();
152 	test_mem();
153 	test_label();
154 
155 	return OK;
156 }
157 
158 /*===========================================================================*
159  *			       sef_local_startup			     *
160  *===========================================================================*/
161 static void sef_local_startup(void)
162 {
163 	/* Let SEF perform startup. */
164 	sef_setcb_init_fresh(sef_cb_init_fresh);
165 
166 	sef_startup();
167 }
168 
169 /*===========================================================================*
170  *				main					     *
171  *===========================================================================*/
172 int main(void)
173 {
174 	/* SEF local startup. */
175 	sef_local_startup();
176 
177 	return 0;
178 }
179