New interfaces for `usesTrap' and `canUseExtraSlot'.
[dyninst.git] / igen / tests / client1.C
1 #include "test1.xdr.CLNT.h"
2 #include "common/h/Timer.h"
3
4 string str1 = "A Test string with server words in it";
5 string str2 = "Different string";
6
7 void echoA(vector<string> &in) {
8   for (int i=0; i<in.size(); ++i)
9     cout << "Element " << i << " = " << in[i] << endl;
10 }
11
12 void echoCSA(vector<T_test1::charStruct> &in) {
13   for (int i=0; i<in.size(); ++i)
14     cout << "Item " << i << " = " << in[i].cp << endl;
15 }
16
17 static bool seen_done = false;
18 static bool seen_rapid_upcall=false;
19 static bool seen_random_upcall = false;
20 static unsigned count = 0;
21 timer perf_timer;
22
23 T_test1::derClass::derClass() { }
24 T_test1::basicClass::basicClass() { }
25
26 main(int argc, char *argv[])
27 {
28     int i, fd, pid, total;
29     T_test1::intStruct is;
30     testUser *remote;
31
32     vector<string> arg_list;
33     // note -- starting on remote hosts will not work yet
34     string host = "localhost";
35     if (argc > 1)
36       host = argv[1];
37
38     fd = RPCprocessCreate(pid, host, "", "server1", arg_list);
39     if (fd < 0) {
40         perror("process Create");
41         exit(-1);
42     }
43
44     remote = new testUser(fd, NULL, NULL, false);
45
46     int tries; 
47     for (tries=0; tries<100; tries++)
48       remote->nullNull();
49     cerr << "nullNull ok\n";
50
51     for (tries=0; tries<100; tries++)
52       assert(remote->intNull() == 0);
53     cerr << "intNull ok\n";
54
55     for (tries=0; tries<100; tries++)
56       remote->nullStruct(is);
57     cerr << "nullStruct ok\n";
58
59     string longStr = "abacasdflkjasrlejrlkjavljadl;jasdjwe;rawojiasdvjal;jwer;lkjadsjasvl;jopejrl;jwel;jasdjasfjl;wejrl;asjd;jasdfjajfjer;lasdf;jasdfjasrjawrjas;jfajfl;ajf;lajwer;ljwaer;laflk;jasdf;jasdfjasdfjasdkfjwejrafjafjafjl;roaiwejfoifjasdjweroijwajasdjasvja;rjwrjasfjajvl;jowerjoiargj;dasgjl;l;kwrl;jfasdjfajfl;fj;sd;fj;fsdlksdfljkajforijsdogjlsl;ertokpsdrjioerjsfdjweiojsdflkjweojsdfojsdjerojsdjsdfjwejdsojsdggjgjsdfjsdfjerjegeigiolkdfsgasdgjerjerjwtgjodfsgjjasdjasfjajfl;ajgoierjtergjaejasdasjdlfjoarjioasdjdagjasoigjagoirghasdhasfjaofjpweasfjasdjasdjfwjfadfjoagjfoargjopasdfgjopjfof;jf;jasdf;jrwjaejadsojassjjsjasdjasdjarwjioaejasdjiasdjhashasdhasdhasdopfhasoidjfaodfjpfoasjdjasdjasfjofjodgjajasdjasdjajgogofjasdjasdjfasfjasofjojofioasdgjasgjasgjadgjadgjajgaopgjajgasjadjasdjasjasjasjasjaopjfasfasflkasjfgjdfjasdjfasjfoifoidfjasdjasd;jfjasdjasdjasjfojgofgjasjasdjasjfawjfgaojgl;fjagjasdjfas;jfajfl;f;jasdjasdjajflfjf;asdfaljfofglhasdfgalfl;asdjasdfjasdfja;fj;asf;asjdfl;jag;okahsdhasdfhasfofosdfljkasdlfjasjfafaffjaslkjajafjasdjkasd;jkasdfasdfasdf;jasdf;lkajsdjasdf;ljasdjasdjasdjasfja;fjadf;jasdjas;fjasjfajfl;f;jdfjasdfjasfjajfjfasdjasdjasd;jasddsslfg;fgj;fg;jasdf;dasjasdjasd;jasfjasjfas;fjasjasd;jasd;jasd;jasd;jasd;fjasd;jasdjasdjasdljk";
60
61     assert(longStr.length() == remote->intString(longStr));
62     cerr << "intString: long string test ok, length = " << longStr.length() << endl;
63
64     string strNull;
65     assert(strNull.length() == remote->intString(strNull));
66     cerr << "intString: null string test ok\n";
67         
68     for (tries=0; tries<100; tries++)
69       assert(str1.length() == remote->intString(str1));
70     cerr << "intString ok\n";
71
72     str2 = remote->stringString(strNull);
73     assert(str2 == strNull);
74     cerr << "stringString: null string test ok\n";
75
76     const unsigned max_tries = 500;
77
78     cerr << "Performance testing: \n";
79     perf_timer.clear();
80     perf_timer.start();
81     for (tries=0; tries<max_tries; tries++) 
82       remote->nullNull();
83     perf_timer.stop();
84     cerr << max_tries << " null rpc's in " << perf_timer.wsecs() << " seconds\n";
85     cerr << ((double)max_tries)/perf_timer.wsecs() << " null rpc's per second\n\n";
86
87     string echo_me = "happy", res_me;
88     perf_timer.clear();
89     perf_timer.start();
90     for (tries=0; tries<max_tries; tries++) {
91       res_me = remote->stringString(echo_me);
92       assert(res_me == echo_me);
93     }
94     perf_timer.stop();
95     cerr << max_tries << " echo string rpc's in " << perf_timer.wsecs() << " seconds\n";
96     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo string rpc's per second\n\n";
97
98     perf_timer.clear();
99     perf_timer.start();
100     for (tries=0; tries<max_tries; tries++) {
101       res_me = remote->stringStringRef(echo_me);
102       assert(res_me == echo_me);
103     }
104     perf_timer.stop();
105     cerr << max_tries << " echo string by ref rpc's in " << perf_timer.wsecs() << " seconds\n";
106     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo string by ref rpc's per second\n\n";
107
108     perf_timer.clear();
109     perf_timer.start();
110     for (tries=0; tries<max_tries; tries++) {
111       res_me = remote->stringStringRef(longStr);
112       assert(res_me == longStr);
113     }
114     perf_timer.stop();
115     cerr << max_tries << " echo long string rpc's in " << perf_timer.wsecs() << " seconds\n";
116     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo long string rpc's per second\n\n";
117
118     perf_timer.clear();
119     perf_timer.start();
120     for (tries=0; tries<max_tries; tries++) {
121       res_me = remote->stringStringRef(longStr);
122       assert(res_me == longStr);
123     }
124     perf_timer.stop();
125     cerr << max_tries << " echo long string by ref rpc's in " << perf_timer.wsecs() << " seconds\n";
126     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo long string by ref rpc's per second\n\n";
127
128     vector<string> arg, result;
129     arg += "happy"; arg += "sad"; arg += "honest"; arg += "memory_hog";
130     arg += "design"; arg += "good"; arg += "bad"; arg += "functional";
131     arg += "efficient"; arg += "debug"; arg += "core_dump"; arg += "fault";
132     arg += "colors"; arg += "widgets"; arg += "stupendous";
133     for (int q=0; q<100; ++q)
134       arg += "filler";
135
136     perf_timer.clear();
137     perf_timer.start();
138     for (tries=0; tries<max_tries; tries++)
139       result = remote->norefVector(arg);
140     perf_timer.stop();
141     cerr << max_tries << " echo vector<string> rpc's in " << perf_timer.wsecs() << " seconds\n";
142     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo vector<string> rpc's per second\n\n";
143
144     perf_timer.clear();
145     perf_timer.start();
146     for (tries=0; tries<max_tries; tries++)
147       result = remote->refVector(arg);
148     perf_timer.stop();
149     cerr << max_tries << " echo vector<string> by ref rpc's in " << perf_timer.wsecs() << " seconds\n";
150     cerr << ((double)max_tries)/perf_timer.wsecs() << " echo vector<string> by ref rpc's per second\n\n";
151
152     
153     for (tries=0; tries<100; tries++) {
154       assert(remote->add(1, 1) == 2);
155       assert(remote->add(-1, -13) == -14);
156     }
157     cerr << "add ok\n";
158
159     vector<int> vect;
160     vect += 1; vect += 2; vect += 3; vect += 4; vect += 5;
161     vect += 6; vect += 7; vect += 8; vect += 9; vect += 10;
162     for (i=0, total = 0; i < vect.size(); i++) 
163         total += vect[i];
164     
165     for (tries=0; tries<100; tries++) {
166       assert(remote->sumVector(vect) == total);
167       assert(remote->sumVectorPtr(&vect) == total);
168     }
169     cerr << "sumVector ok\n";
170
171     remote->triggerAsyncUpcall(-10);
172     remote->wait_for(T_test1::asyncUpcall_REQ);
173     for (i=0; i < 10000; i++)
174         assert(remote->add(1, i) == (1+i));
175     printf("RPC test1 passed\n");
176
177     vector<string> cpa, res;
178     cpa += "Happy"; cpa += "Sad";
179     echoA(cpa);
180     res = remote->echoCPA(cpa);
181     echoA(res);
182
183     assert(res.size() == cpa.size());
184     for (int ea=0; ea<res.size(); ea++)
185       assert(res[ea] == cpa[ea]);
186
187     vector<string> *vs = remote->echoCPAPtr(&cpa);
188     assert(vs->size() == cpa.size());
189     for (int l=0; l<vs->size(); l++)
190       assert((*vs)[l] == cpa[l]);
191     delete vs;
192
193     T_test1::charStruct cs, csp;
194     vector<T_test1::charStruct> csa, csap;
195
196     cs.cp = "Happy";
197     csp = remote->echoCS(cs);
198     assert (csp.cp == cs.cp);
199
200     csp.cp = "Hospital"; csa += csp;
201     csp.cp = "Accident"; csa += csp;
202
203     csap = remote->echoCSA(csa);
204     assert (csap.size() == csa.size());
205     for (ea=0; ea<csa.size(); ea++)
206       assert(csap[ea].cp == csa[ea].cp);
207
208     T_test1::charStruct *csptr;
209     csptr = remote->echoCSP((T_test1::charStruct*)NULL);
210     assert(!csptr);
211     cerr << "Passed null structure ok\n";
212
213     csptr = remote->echoCSP(&cs);
214     assert(csptr->cp == cs.cp);
215     cerr << "Passed structure pointer ok\n";
216     delete csptr;
217
218     T_test1::basicClass b, b1, *bp; T_test1::derClass d, d1, *dp;
219     b.b = false; d.u = 3019; d.b = false;
220     bp = NULL;
221     bp = remote->echoClass((T_test1::basicClass*)NULL);
222     assert(!bp);
223     cerr << "Null class passed ok\n";
224     bp = remote->echoClass(&b);
225     assert(!bp->b);
226     assert(bp->getId() == T_test1::basicClass_id);
227     delete bp;
228     cerr << "passing class pointers ok\n";
229
230     b1 = remote->echoBClass(b);
231     d1 = remote->echoDClass(d);
232     assert(!b1.b); 
233     assert(d1.u == 3019); 
234     assert(!d.b);
235     cerr << "passing classes ok\n";
236
237     bp = remote->echoClass(&d1);
238     assert(bp->getId() == T_test1::derClass_id);
239     delete bp;
240     cerr << "passing derived class ok\n";
241
242     vector<string> vs1, vs2;
243     vs1 += "/Mark"; vs1 += "/Is"; vs1 += "/Bored";
244     vs2 += "/What"; vs2 += "/To";
245     vector<T_test1::resStruct> vres, answer;
246     T_test1::resStruct restr;
247     restr.parts = vs1;
248     restr.handle = 0;
249     vres += restr;
250     restr.parts = vs2;
251     vres += restr;
252     cerr << "Echoing vector of structures\n";
253     answer = remote->echoResStruct(vres);
254     assert(answer[0].parts == vs1);
255     assert(answer[1].parts == vs2);
256     cerr << "Echoing vector of structures --> passed\n";
257     
258     cerr << "triggering async upcalls\n";
259     T_test1::boolStruct bs;
260     bs.b = true;
261     assert (remote->boolToString(bs) == "true");
262     bs.b = false;
263     assert (!seen_rapid_upcall);
264     assert (remote->boolToString(bs) == "false");
265     assert (!seen_rapid_upcall);
266     cerr << "handling async upcalls\n";
267     while(remote->is_buffered(T_test1::rapidUpcall_REQ))
268       remote->wait_for(T_test1::rapidUpcall_REQ);
269
270     assert(count == 999);
271     assert (!seen_random_upcall);
272
273     bool one_there = true; 
274     while (one_there) {
275       one_there = false;
276       if (remote->is_buffered(T_test1::up1_REQ)) {
277         remote->wait_for(T_test1::up1_REQ); one_there = true;
278       }
279       if (remote->is_buffered(T_test1::up2_REQ)) {
280         remote->wait_for(T_test1::up2_REQ); one_there = true;
281       }
282       if (remote->is_buffered(T_test1::up3_REQ)) {
283         remote->wait_for(T_test1::up3_REQ); one_there = true;
284       }
285       if (remote->is_buffered(T_test1::up4_REQ)) {
286         remote->wait_for(T_test1::up4_REQ); one_there = true;
287       }
288     }
289     remote->wait_for(T_test1::up_done_REQ);
290     remote->asyncClient();
291     sleep(3);
292     delete remote;
293 }
294
295 void testUser::rapidUpcall(unsigned val) {
296   if (!seen_rapid_upcall) {
297     seen_rapid_upcall = true;
298     count = val;
299   } else {
300     assert (count == (val - 1));
301     count++;
302   }
303 }
304
305 void testUser::asyncUpcall(int val) {
306   printf("asyncUpcall called with value = %d\n", val);
307 }
308
309 unsigned total = 0;
310
311 void testUser::up1() {
312   total++;
313   seen_random_upcall = true;
314 }
315
316 void testUser::up2() {
317   total++;
318   seen_random_upcall = true;
319 }
320
321 void testUser::up3() {
322   total++;
323   seen_random_upcall = true;
324 }
325
326 void testUser::up4() {
327   total++;
328   seen_random_upcall = true;
329 }
330
331 void testUser::up_done(u_int tot) {
332   assert(tot == total);
333   seen_done = true;
334 }