00001 #include <neuro/neuro.h>
00002 #include <unistd.h>
00003 #include <neuro/ns2net.h>
00004 #include <string.h>
00005 #include <search.h>
00006
00007 struct NSCounter { int success, timedOut, refused, unknownHost, bindSuccess, bindError; };
00008
00009 struct NSNetConnectionController *bindNSCC, *connectNSCC;
00010
00011 #define MAXCHAR 1024
00012
00013 char readBuffer[MAXCHAR];
00014 int readLen;
00015 static void clearReadBuffer(void)
00016 {
00017 readLen = 0;
00018 }
00019
00020 static void readBufferMustMatch(const char *str)
00021 {
00022 rassert(readLen == strlen(str));
00023 rassert(strncmp(str, readBuffer, strlen(str)) == 0);
00024 }
00025
00026
00027 static void NSRHBytesRead(void *udata, const char *buf, int len)
00028 {
00029 int i;
00030 for (i = 0; i < len; ++i) {
00031 rassert(readLen < MAXCHAR);
00032 readBuffer[readLen] = buf[i];
00033 readLen += 1;
00034 putchar(buf[i]);
00035 }
00036 }
00037
00038 static void NSRHClosed(void *udata)
00039 {
00040 printf("NSRH Stream closed.\n");
00041 }
00042
00043 static void NSBHBindError(void *udata) {
00044 struct NSCounter *count = (struct NSCounter *) udata;
00045 count->bindError += 1;
00046 }
00047
00048 static void NSCHUnknownHost(void *udata) {
00049 struct NSCounter *count = (struct NSCounter *) udata;
00050 count->unknownHost += 1;
00051 }
00052
00053 static void NSCHTimedOut(void *udata) {
00054 struct NSCounter *count = (struct NSCounter *) udata;
00055 count->timedOut += 1;
00056 }
00057
00058 static void NSCHRefused(void *udata) {
00059 struct NSCounter *count = (struct NSCounter *) udata;
00060 count->refused += 1;
00061 }
00062
00063 static struct NSNetConnectionReadHandler nsrh;
00064
00065 static void NSBHBindSuccess(void *udata, struct NSNetConnectionController *nscc) {
00066 struct NSCounter *count = (struct NSCounter *) udata;
00067 int retval;
00068 count->bindSuccess += 1;
00069 retval = attachConnectionReadHandler(nscc, &nsrh, "bindsuccess");
00070 rassert(retval == 0);
00071 bindNSCC = nscc;
00072 }
00073
00074 static void NSCHSuccess(void *udata, struct NSNetConnectionController *nscc) {
00075 int retval;
00076 struct NSCounter *count = (struct NSCounter *) udata;
00077 count->success += 1;
00078 retval = attachConnectionReadHandler(nscc, &nsrh, "connectsuccess");
00079 connectNSCC = nscc;
00080 }
00081
00082 static void testNSConnect(void) {
00083 int portNum = 7211;
00084 struct NSCounter basic = { 0, 0, 0 };
00085 struct NSCounter cur;
00086 struct NSNetConnectionHandler nsch;
00087 struct NSNetBindHandler nsbh;
00088 struct NSNet *ns;
00089
00090 nsrh.bytesRead = NSRHBytesRead;
00091 nsrh.closed = NSRHClosed;
00092
00093 nsch.success = NSCHSuccess;
00094 nsch.timedOut = NSCHTimedOut;
00095 nsch.refused = NSCHRefused;
00096 nsch.unknownHost = NSCHUnknownHost;
00097
00098 nsbh.success = NSBHBindSuccess;
00099 nsbh.error = NSBHBindError;
00100
00101 cur = basic;
00102 ns = newNSNet();
00103 attemptConnect(ns, &nsch, "notAValidHostName", 5555, &cur);
00104 rassert(cur.success == 0 && cur.unknownHost == 1 && cur.refused == 0 && cur.timedOut == 0);
00105 cur = basic;
00106 rassert(0 == attemptConnect(ns, &nsch, "localhost", 5555, &cur));
00107 waitForNetEvent(ns, 2000);
00108 rassert(cur.success == 0 && cur.unknownHost == 0 && cur.refused == 1 && cur.timedOut == 0);
00109 cur = basic;
00110 rassert(0 == attemptBind(ns, &nsbh, 1, portNum, &cur));
00111 rassert(cur.bindSuccess == 0 && cur.bindError == 0);
00112 rassert(0 == attemptConnect(ns, &nsch, "localhost", portNum, &cur));
00113 waitForNetEvent(ns, 1000);
00114 rassert(cur.success == 1 && cur.unknownHost == 0 && cur.refused == 0 && cur.timedOut == 0);
00115 rassert(cur.bindSuccess == 1 && cur.bindError == 0);
00116 cur = basic;
00117 rassert(0 == attemptBind(ns, &nsbh, 0, portNum+1, &cur));
00118 rassert(cur.bindSuccess == 0 && cur.bindError == 0);
00119 rassert(0 == attemptConnect(ns, &nsch, "localhost", portNum+1, &cur));
00120 waitForNetEvent(ns, 1000);
00121 rassert(cur.bindSuccess == 1 && cur.bindError == 0);
00122 rassert(connectNSCC != NULL);
00123 rassert(bindNSCC != NULL);
00124 clearReadBuffer();
00125 { char *msg = "msgtoserver"; writeNSBytes(connectNSCC, msg, strlen(msg)); }
00126 waitForNetEvent(ns, 1000);
00127 readBufferMustMatch("msgtoserver");
00128 clearReadBuffer();
00129 { char *msg = "msgtoclient!";
00130 while (*msg) {
00131 writeNSBytes(bindNSCC, msg, 1);
00132 waitForNetEvent(ns, 1000);
00133 msg += 1;
00134 }
00135 }
00136 readBufferMustMatch("msgtoclient!");
00137 }
00138
00139 static void testNSNet(void)
00140 {
00141 testNSConnect();
00142 if (fork()) {
00143 }
00144 else {
00145 }
00146 }
00147
00148 static int allSum = 0;
00149 static void allStringTester
00150 (struct StringTable *st, const char *key, void *val, void *udata)
00151 {
00152 allSum += key[0] - '0';
00153 }
00154
00155 static void testStringTable(void)
00156 {
00157 int val;
00158 struct StringTable *st;
00159 int i;
00160 for (i = 0; i < 100; i += 1) {
00161 st = newStringTable();
00162 rassert(st);
00163 rassert(findString(st, "dog") == NULL);
00164 rassert(putString(st, "cat", &val) == 0);
00165 rassert(findString(st, "cat") == &val);
00166 rassert(delString(st, "dog") == ERR_NOSTRING);
00167 rassert(delString(st, "cat") == 0);
00168 rassert(findString(st, "cat") == NULL);
00169 rassert(putString(st, "1", &val) == 0);
00170 rassert(putString(st, "2", &val) == 0);
00171 rassert(putString(st, "3", &val) == 0);
00172 allSum = 0;
00173 allStrings(st, allStringTester, NULL);
00174 rassert(allSum == 6);
00175 rassert(delString(st, "1") == 0);
00176 rassert(delString(st, "3") == 0);
00177 rassert(delString(st, "2") == 0);
00178 rassert(putString(st, "memcheck", &val) == 0);
00179 freeStringTable(st);
00180 }
00181 }
00182
00183 static const char *gotParm;
00184 static int gotInt;
00185 static int gotUnknown;
00186
00187 static void handlePrint(struct CommandHandler *ch, int cliIndex) {
00188 gotParm = fetchStringParameter(ch, 0);
00189 fetchIntParameters(ch, &gotInt, 1);
00190 }
00191
00192 static void handleUnknown(struct CommandHandler *ch, int cliIndex) {
00193 gotUnknown = 1;
00194 }
00195
00196 static void testCommandHandler(void)
00197 {
00198 struct CommandHandler *ch;
00199 gotUnknown = 0;
00200 gotParm = NULL;
00201 ch = newCommandHandler();
00202 newClientStarted(ch, 3);
00203 handleLine(ch, "what", 3);
00204 enregisterCommand(ch, "unknown", handleUnknown);
00205 enregisterCommand(ch, "print", handlePrint);
00206 rassert(gotUnknown == 0);
00207 handleLine(ch, "what", 3);
00208 rassert(gotUnknown == 1);
00209 handleLine(ch, "print 0", 3);
00210 rassert(gotParm != NULL);
00211 rassert(strcmp(gotParm, "0") == 0);
00212 rassert(gotInt == 0);
00213 handleLine(ch, "print \"\"", 3);
00214 rassert(strcmp(gotParm, "") == 0);
00215 rassert(gotInt == 0);
00216 handleLine(ch, "print \\\"", 3);
00217 rassert(strcmp(gotParm, "\"") == 0);
00218 rassert(gotInt == 0);
00219 handleLine(ch, "print 87", 3);
00220 rassert(gotInt == 87);
00221 rassert(strcmp(gotParm, "87") == 0);
00222 rassert(strcmp(gotParm, "87") == 0);
00223 handleLine(ch, "print \"45\"", 3);
00224 handleLine(ch, "print \"48\" ", 3);
00225 handleLine(ch, "print \"14\" ", 3);
00226 handleLine(ch, "print 11 ", 3);
00227 handleLine(ch, "print \"hi\"", 3);
00228 handleLine(ch, "print \" hi\"", 3);
00229 handleLine(ch, "print \"h i\"", 3);
00230 handleLine(ch, "print \"hi \"", 3);
00231 handleLine(ch, "print \"h\\\\i\"", 3);
00232 handleLine(ch, "print \"h\\\"i\"", 3);
00233 freeCommandHandler(ch);
00234 }
00235
00236 int main(int argc, char **argv)
00237 {
00238 testStringTable();
00239 testCommandHandler();
00240 testNSNet();
00241 return 0;
00242 }