QNX: Tests: Add error/cleanup tests to NameServer test
[ipc/ipcdev.git] / qnx / src / tests / NameServerApp / NameServerApp.c
1 /*
2  * Copyright (c) 2013-2015, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /* =============================================================================
33  *  @file   NameServerApp.c
34  *
35  *  @brief  Sample application for NameServer module between MPU and Remote Proc
36  *
37  *  ============================================================================
38  */
40 /* Standard headers */
41 #include <stdio.h>
43 /* Ipc Standard header */
44 #include <ti/ipc/Std.h>
46 #include <ti/ipc/Ipc.h>
47 #include <_NameServer.h>
49 /* Module level headers */
50 #include <ti/ipc/NameServer.h>
53 /** ============================================================================
54  *  Macros and types
55  *  ============================================================================
56  */
57 #define NSNAME "MyNS"
58 #define NSNAME2 "MyNS2"
59 #define NSLONGNAME "LongNameabcdefghijklmnopqrstuvwxyz1234567890abcdefghi" \
60     "jklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890"
62 /** ============================================================================
63  *  Globals
64  *  ============================================================================
65  */
66 Int cleanupTest()
67 {
68     NameServer_Params params;
69     NameServer_Handle nsHandle;
70     Ptr ptr;
72     printf("Testing lazy cleanup...\n");
74     NameServer_Params_init(&params);
76     params.maxValueLen = sizeof(UInt32);
77     params.maxNameLen = 32;
79     nsHandle = NameServer_create(NSNAME, &params);
80     if (nsHandle == NULL) {
81         printf("Failed to create NameServer '%s'\n", NSNAME);
82         return -1;
83     }
84     else {
85         printf("Created NameServer '%s'\n", NSNAME);
86     }
88     ptr = NameServer_addUInt32(nsHandle, NSNAME2, 0xdeadbeef);
89     if (ptr == NULL) {
90         printf("    Error: NameServer_addUInt32() returned NULL\n");
91         NameServer_delete(&nsHandle);
92         return -1;
93     }
94     else {
95         printf("Added '%s' of value '0x%x' to instance '%s'\n", NSNAME2, 0xdeadbeef, NSNAME);
96     }
98     printf("Deleting nsHandle that still has an entry...\n");
99     NameServer_delete(&nsHandle);
101     printf("Creating an nsHandle with the same name again...\n");
102     nsHandle = NameServer_create(NSNAME, &params);
103     if (nsHandle == NULL) {
104         printf("Failed to create NameServer '%s'\n", NSNAME);
105         return -1;
106     }
107     else {
108         printf("Created NameServer '%s'\n", NSNAME);
109     }
111     ptr = NameServer_addUInt32(nsHandle, NSNAME2, 0xbadc0ffe);
112     if (ptr == NULL) {
113         printf("    Error: NameServer_addUInt32() returned NULL\n");
114         NameServer_delete(&nsHandle);
115         return -1;
116     }
117     else {
118         printf("Added '%s' of value '0x%x' to instance '%s'\n", NSNAME2, 0xbadc0ffe, NSNAME);
119     }
121     NameServer_delete(&nsHandle);
123     return 0;
126 Int nameLenTest()
128     NameServer_Params params;
129     NameServer_Handle nsHandle;
130     Int32 status = 0;
131     Ptr ptr;
132     UInt32 val;
134     printf("Testing long names...\n");
136     NameServer_Params_init(&params);
138     params.maxValueLen = sizeof(UInt32);
139     params.maxNameLen = 32;
141     nsHandle = NameServer_create(NSLONGNAME, &params);
142     if (nsHandle == NULL) {
143         printf("Failed to create NameServer '%s'\n", NSLONGNAME);
144         return -1;
145     }
146     else {
147         printf("Created NameServer '%s'\n", NSLONGNAME);
148     }
150     /* This name should be too long for creation params and results in error */
151     printf("Trying to add a name that exceeds maxNameLen...\n");
152     ptr = NameServer_addUInt32(nsHandle, NSLONGNAME, 0xdeadbeef);
153     if (ptr == NULL) {
154         printf("    ...got expected Failure from NameServer_addUInt32()\n");
155     }
156     else {
157         printf("    Error: NameServer_addUInt32() returned non-NULL %p (but "
158             "was expected to fail)\n", ptr);
159         NameServer_delete(&nsHandle);
160         return -1;
161     }
163     printf("Deleting nsHandle...\n");
164     NameServer_delete(&nsHandle);
166     NameServer_Params_init(&params);
168     params.maxValueLen = sizeof(UInt32);
169     params.maxNameLen = 180;
171     nsHandle = NameServer_create(NSLONGNAME, &params);
172     if (nsHandle == NULL) {
173         printf("Failed to create NameServer '%s'\n", NSLONGNAME);
174         return -1;
175     }
176     else {
177         printf("Created NameServer '%s'\n", NSLONGNAME);
178     }
180     /* This name is too long for remote to handle and results in error */
181     printf("Trying to get a name that the remote cannot handle...\n");
182     val = 0x00c0ffee;
183     status = NameServer_getUInt32(nsHandle, NSLONGNAME, &val, NULL);
184     if (status == NameServer_E_NAMETOOLONG) {
185         printf("    ...got expected Failure from NameServer_getUInt32()\n");
186     }
187     else {
188         printf("    Error: NameServer_getUint32() returned unexpected "
189             "result: %d\n", status);
190         return -1;
191     }
193     printf("Deleting nsHandle...\n");
194     NameServer_delete(&nsHandle);
196     NameServer_Params_init(&params);
198     params.maxValueLen = sizeof(UInt32);
199     params.maxNameLen = 32;
201     nsHandle = NameServer_create(NSLONGNAME, &params);
202     if (nsHandle == NULL) {
203         printf("Failed to create NameServer '%s'\n", NSLONGNAME);
204         return -1;
205     }
206     else {
207         printf("Created NameServer '%s'\n", NSLONGNAME);
208     }
210     /* The instance name is too long for remote and results in error */
211     printf("Trying to use an instance name that the remote cannot "
212         "handle...\n");
213     val = 0x00c0ffee;
214     status = NameServer_getUInt32(nsHandle, "Key", &val, NULL);
215     if (status == NameServer_E_NAMETOOLONG) {
216         printf("    ...got expected Failure from NameServer_getUInt32()\n");
217     }
218     else {
219         printf("    Error: NameServer_getUint32() returned unexpected "
220             "result: %d\n", status);
221         return -1;
222     }
224     printf("Deleting nsHandle...\n");
225     NameServer_delete(&nsHandle);
227     return 0;
230 Int testNS(NameServer_Handle nsHandle, String name)
232     Int32 status = 0;
233     Ptr ptr;
234     UInt32 val;
235     char key[16];
236     Int i;
238     ptr = NameServer_addUInt32(nsHandle, name, 0xdeadbeef);
239     if (ptr == NULL) {
240         printf("Failed to NameServer_addUInt32()\n");
241         return -1;
242     }
243     else {
244         printf("NameServer_addUInt32() returned %p\n", ptr);
245     }
247     printf("Trying to add same key (should fail)...\n");
248     ptr = NameServer_addUInt32(nsHandle, name, 0xdeadc0de);
249     if (ptr == NULL) {
250         printf("    ...got expected Failure from NameServer_addUInt32()\n");
251     }
252     else {
253         printf("    Error: NameServer_addUInt32() returned non-NULL %p (but was expected to fail)\n", ptr);
254         return -1;
255     }
257     val = 0x00c0ffee;
258     status = NameServer_getUInt32(nsHandle, name, &val, NULL);
259     printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
261     printf("Removing 0xdeadbeef w/ NameServer_remove()...\n");
262     status = NameServer_remove(nsHandle, name);
263     if (status < 0) {
264         printf("NameServer_remove() failed: %d\n", status);
265         return -1;
266     }
268     ptr = NameServer_addUInt32(nsHandle, name, 0xdeadc0de);
269     if (ptr == NULL) {
270         printf("Error: NameServer_addUInt32() failed\n");
271         return -1;
272     }
273     else {
274         printf("NameServer_addUInt32(0xdeadc0de) succeeded\n");
275     }
277     val = 0x00c0ffee;
278     status = NameServer_getUInt32(nsHandle, name, &val, NULL);
279     printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
281     printf("Removing 0xdeadc0de w/ NameServer_removeEntry()...\n");
282     status = NameServer_removeEntry(nsHandle, ptr);
283     if (status < 0) {
284         printf("NameServer_remove() failed: %d\n", status);
285         return -1;
286     }
288     ptr = NameServer_addUInt32(nsHandle, name, 0x0badc0de);
289     if (ptr == NULL) {
290         printf("Error: NameServer_addUInt32() failed\n");
291         return -1;
292     }
293     else {
294         printf("NameServer_addUInt32(0x0badc0de) succeeded\n");
295     }
297     val = 0x00c0ffee;
298     status = NameServer_getUInt32(nsHandle, name, &val, NULL);
299     printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
301     status = NameServer_remove(nsHandle, name);
302     if (status < 0) {
303         printf("Error: NameServer_remove() failed\n");
304         return -1;
305     }
306     else {
307         printf("NameServer_remove(%s) succeeded\n", name);
308     }
310     for (i = 0; i < 10; i++) {
311         sprintf(key, "foobar%d", i);
313         ptr = NameServer_addUInt32(nsHandle, key, 0x0badc0de + i);
314         if (ptr == NULL) {
315             printf("Error: NameServer_addUInt32() failed\n");
316             return -1;
317         }
318         else {
319             printf("NameServer_addUInt32(%s, 0x%x) succeeded\n", key, 0x0badc0de + i);
320         }
322         val = 0x00c0ffee;
323         status = NameServer_getUInt32(nsHandle, key, &val, NULL);
324         printf("NameServer_getUInt32(%s) returned %d, val=0x%x (was 0x00c0ffee)\n", key, status, val);
326         if (val != (0x0badc0de + i)) {
327             printf("get val (0x%x) != add val (0x%x)!\n", val, 0x0badc0de + i);
328         }
329     }
331     for (i = 0; i < 10; i++) {
332         sprintf(key, "foobar%d", i);
334         status = NameServer_remove(nsHandle, key);
335         if (status < 0) {
336             printf("Error: NameServer_remove() failed\n");
337             return -1;
338         }
339         else {
340             printf("NameServer_remove(%s) succeeded\n", key);
341         }
342     }
344     return 0;
347 /** ============================================================================
348  *  Functions
349  *  ============================================================================
350  */
351 Int
352 NameServerApp_startup()
354     Int32 status = 0;
355     NameServer_Params params;
356     NameServer_Handle nsHandle;
357     NameServer_Handle nsHandleAlias;
358     NameServer_Handle nsHandle2;
359     Int iteration = 0;
361     printf ("Entered NameServerApp_startup\n");
363     status = Ipc_start();
365     if (status < 0) {
366         printf("Ipc_start failed: status = %d\n", status);
367         return -1;
368     }
370     printf("Calling NameServer_setup()...\n");
371     NameServer_setup();
373 again:
374     NameServer_Params_init(&params);
376     params.maxValueLen = sizeof(UInt32);
377     params.maxNameLen = 32;
379     printf("params.maxValueLen=%d\n", params.maxValueLen);
380     printf("params.maxNameLen=%d\n", params.maxNameLen);
381     printf("params.checkExisting=%d\n", params.checkExisting);
383     nsHandle = NameServer_create(NSNAME, &params);
384     if (nsHandle == NULL) {
385         printf("Failed to create NameServer '%s'\n", NSNAME);
386         return -1;
387     }
388     else {
389         printf("Created NameServer '%s'\n", NSNAME);
390     }
392     nsHandleAlias = NameServer_create(NSNAME, &params);
393     if (nsHandleAlias == NULL) {
394         printf("Failed to get handle to NameServer '%s'\n", NSNAME);
395         return -1;
396     }
397     else {
398         printf("Got another handle to NameServer '%s'\n", NSNAME);
399     }
401     NameServer_Params_init(&params);
403     params.maxValueLen = sizeof(UInt32);
404     params.maxNameLen = 32;
405     nsHandle2 = NameServer_create(NSNAME2, &params);
406     if (nsHandle2 == NULL) {
407         printf("Failed to create NameServer '%s'\n", NSNAME2);
408         return -1;
409     }
410     else {
411         printf("Created NameServer '%s'\n", NSNAME2);
412     }
414     printf("Testing nsHandle\n");
415     status = testNS(nsHandle, "Key");
416     if (status != 0) {
417         printf("test failed on nsHandle\n");
418         return status;
419     }
420     printf("Testing nsHandle2\n");
421     status = testNS(nsHandle2, "Key");
422     if (status != 0) {
423         printf("test failed on nsHandle2\n");
424         return status;
425     }
427     printf("Deleting nsHandle and nsHandle2...\n");
428     NameServer_delete(&nsHandle);
429     NameServer_delete(&nsHandle2);
431     /*
432      * Verify that we can still use the alias handle after deleting the
433      * initial handle
434      */
435     printf("Testing nsHandleAlias\n");
436     status = testNS(nsHandleAlias, "Key");
437     if (status != 0) {
438         printf("test failed on nsHandleAlias\n");
439         return status;
440     }
441     printf("Deleting nsHandleAlias...\n");
442     NameServer_delete(&nsHandleAlias);
444     iteration++;
445     if (iteration < 2) {
446         goto again;
447     }
449     status = nameLenTest();
450     if (status != 0) {
451         printf("Name Length test failed\n");
452         return status;
453     }
455     status = cleanupTest();
456     if (status != 0) {
457         printf("Cleanup test failed\n");
458         return status;
459     }
461     printf("Calling NameServer_destroy()...\n");
462     NameServer_destroy();
464     printf ("Leaving NameServerApp_startup: status = 0x%x\n", status);
466     return status;
470 Int
471 NameServerApp_execute()
473     Int32 status = 0;
475     printf ("Entered NameServerApp_execute\n");
477     printf ("Leaving NameServerApp_execute\n\n");
479     return status;
482 Int
483 NameServerApp_shutdown()
485     Int32 status = 0;
487     printf ("Entered NameServerApp_shutdown()\n");
489     status = Ipc_stop();
490     if (status < 0) {
491         printf("Ipc_stop failed: status = %d\n", status);
492     }
494     printf ("Leave NameServerApp_shutdown()\n");
496     return status;
499 int
500 main (int argc, char ** argv)
502     int status = 0;
504     status = NameServerApp_startup();
505     if (status < 0) {
506         return -1;
507     }
509     status = NameServerApp_execute();
510     if (status < 0) {
511         return -1;
512     }
514     status = NameServerApp_shutdown();
515     if (status < 0) {
516         return -1;
517     }
519     return(0);