| #include "Config.h" | 
 |  | 
 | #include <stdio.h> | 
 | #include <assert.h> | 
 | #include <string.h> | 
 | #include <stdarg.h> | 
 | #include <sys/wait.h> | 
 | #include <stdlib.h> | 
 | #include <unistd.h> | 
 |  | 
 | #include "Bootstrap.h" | 
 | #include "Str.h" | 
 | #include "List.h" | 
 | #include "system/System.h" | 
 | #include "system/Command.h" | 
 | #include "system/Time.h" | 
 |  | 
 | /** | 
 |  * Command.c unit tests. | 
 |  */ | 
 |  | 
 |  | 
 | static void onExec(Process_T P) { | 
 |         assert(P); | 
 |         char buf[STRLEN]; | 
 |         // Child process info | 
 |         printf("\tSubprocess ((pid=%d) created with cwd (%s)\n", Process_getPid(P), Process_getDir(P)); | 
 |         InputStream_T in = Process_getInputStream(P); | 
 |         OutputStream_T out = Process_getOutputStream(P); | 
 |         InputStream_T err = Process_getErrorStream(P); | 
 |         printf("\tSub-Process is %s\n", Process_isRunning(P) ? "running" : "not running"); | 
 |         printf("\tCommunication with child:\n"); | 
 |         if (! InputStream_readLine(in, buf, STRLEN)) { | 
 |                 InputStream_readLine(err, buf, STRLEN); | 
 |                 printf("\tError in script: %s\n", buf); | 
 |         } else { | 
 |                 printf("\t%s", buf); | 
 |                 OutputStream_print(out, "Elessar Telcontar\n"); | 
 |                 assert(OutputStream_flush(out) > 0); | 
 |                 char *line = InputStream_readLine(in, buf, STRLEN); | 
 |                 assert(line); | 
 |                 printf("\t%s", line); | 
 |         } | 
 |         Process_free(&P); | 
 |         assert(! P); | 
 | } | 
 |  | 
 |  | 
 | static void onTerminate(Process_T P) { | 
 |         assert(P); | 
 |         printf("\tTest terminate subprocess ((pid=%d)\n", Process_getPid(P)); | 
 |         assert(Process_isRunning(P)); | 
 |         Process_terminate(P); | 
 |         printf("\tWaiting on process to terminate.. "); | 
 |         printf("Process exited with status: %d\n", Process_waitFor(P)); | 
 |         Process_free(&P); | 
 |         assert(! P); | 
 | } | 
 |  | 
 |  | 
 | static void onKill(Process_T P) { | 
 |         assert(P); | 
 |         printf("\tTest kill subprocess ((pid=%d)\n", Process_getPid(P)); | 
 |         assert(Process_isRunning(P)); | 
 |         Process_kill(P); | 
 |         printf("\tWaiting on process to exit.. "); | 
 |         printf("Process exited with status: %d\n", Process_waitFor(P)); | 
 |         Process_free(&P); | 
 |         assert(! P); | 
 | } | 
 |  | 
 |  | 
 | int main(void) { | 
 |  | 
 |         Bootstrap(); // Need to initialize library | 
 |                  | 
 |         printf("============> Start Command Tests\n\n"); | 
 |          | 
 |          | 
 |         printf("=> Test1: create/destroy\n"); | 
 |         { | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL); | 
 |                 assert(c); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test1: OK\n\n"); | 
 |          | 
 |         printf("=> Test2: set and get uid/gid\n"); | 
 |         { | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL); | 
 |                 assert(c); | 
 |                 // Check that default is 0 | 
 |                 assert(Command_getUid(c) == 0); | 
 |                 assert(Command_getGid(c) == 0); | 
 |                 // set and test uid and gid | 
 |                 Command_setUid(c,42); | 
 |                 assert(Command_getUid(c) == 42); | 
 |                 Command_setGid(c,148); | 
 |                 assert(Command_getGid(c) == 148); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test2: OK\n\n"); | 
 |                  | 
 |         printf("=> Test3: set and get working directory\n"); | 
 |         { | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL); | 
 |                 assert(c); | 
 |                 // Check that a default working directory is NULL. I.e. current directory | 
 |                 assert(! Command_getDir(c)); | 
 |                 // Check that a NULL working directory is allowed, meaning the calling process's current directory | 
 |                 Command_setDir(c, NULL); | 
 |                 // Set and get | 
 |                 Command_setDir(c, "/tmp/"); | 
 |                 assert(Str_isEqual(Command_getDir(c), "/tmp")); // trailing separator is removed upon set | 
 |                 // Check invalid value | 
 |                 TRY | 
 |                 { | 
 |                         Command_setDir(c, "/hubba/bubba"); | 
 |                         printf("Test failed\n"); | 
 |                         exit(1); | 
 |                 } | 
 |                 ELSE | 
 |                 { | 
 |                         assert(Str_isEqual(Command_getDir(c), "/tmp")); | 
 |                 } | 
 |                 END_TRY; | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test3: OK\n\n"); | 
 |          | 
 |         printf("=> Test4: set and get env\n"); | 
 |         { | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL); | 
 |                 assert(c); | 
 |                 // Check default PATH | 
 |                 assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin")); | 
 |                 // Set and get | 
 |                 Command_setEnv(c, "LANG", "C"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "LANG"), "C")); | 
 |                 Command_setEnv(c, "SHELL", "/bin/bash"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash")); | 
 |                 // setEnvString | 
 |                 // Check default PATH | 
 |                 assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin")); | 
 |                 // Set and get env string | 
 |                 Command_vSetEnv(c, "PATH=/usr/bin;SHELL=/bin/bash"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "PATH"), "/usr/bin")); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash")); | 
 |                 // With space in string | 
 |                 Command_vSetEnv(c, "LANG = C"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "LANG"), "C")); | 
 |                 Command_vSetEnv(c, "PATH = /usr/bin ; SHELL = /bin/bash"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "PATH"), "/usr/bin")); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash")); | 
 |                 // Invalid String | 
 |                 Command_vSetEnv(c, "HELLO:WORLD"); | 
 |                 assert(! Command_getEnv(c, "HELLO")); | 
 |                 assert(! Command_getEnv(c, "HELLO:WORLD")); | 
 |                 // Varargs | 
 |                 Command_vSetEnv(c, "PATH=%s; TERM=%s;", "/bin", "vterm"); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin")); | 
 |                 assert(Str_isEqual(Command_getEnv(c, "TERM"), "vterm")); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test4: OK\n\n"); | 
 |          | 
 |         printf("=> Test5: set and get Command\n"); | 
 |         { | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL); | 
 |                 assert(c); | 
 |                 List_T l = Command_getCommand(c); | 
 |                 assert(Str_isEqual(l->head->e, "/bin/sh")); | 
 |                 assert(Str_isEqual(l->head->next->e, "-c")); | 
 |                 assert(Str_isEqual(l->head->next->next->e, "ps -aef|grep monit")); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test5: OK\n\n"); | 
 |  | 
 |         printf("=> Test6: execute\n"); | 
 |         { | 
 |                 // Program producing error | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "baluba;", NULL); | 
 |                 assert(c); | 
 |                 Command_setDir(c, "/"); | 
 |                 printf("\tThis should produce an error:\n"); | 
 |                 onExec(Command_execute(c)); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |  | 
 |                 // Correct program | 
 |                 c = Command_new("/bin/sh", "-c", "echo \"Please enter your name:\";read name;echo \"Hello $name\";", NULL); | 
 |                 assert(c); | 
 |                 onExec(Command_execute(c)); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test6: OK\n\n"); | 
 |                  | 
 |         printf("=> Test7: terminate and kill sub-process\n"); | 
 |         { | 
 |                 // Test terminate | 
 |                 Command_T c = Command_new("/bin/sh", "-c", "sleep 30;", NULL); | 
 |                 assert(c); | 
 |                 onTerminate(Command_execute(c)); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |                  | 
 |                 // Test kill | 
 |                 c = Command_new("/bin/sh", "-c", "trap 1 2 15; sleep 30; ", NULL); | 
 |                 assert(c); | 
 |                 onKill(Command_execute(c)); | 
 |                 Command_free(&c); | 
 |                 assert(!c); | 
 |         } | 
 |         printf("=> Test7: OK\n\n"); | 
 |  | 
 |         printf("============> Command Tests: OK\n\n"); | 
 |         | 
 |         return 0; | 
 | } | 
 |  |