Modified process status handling to provide appropriate tag
[dyninst.git] / igen / tests / client2.C
1 #include <unistd.h>
2 #include <assert.h>
3 #include "test2.thread.CLNT.h"
4 #include "thread/h/thread.h"
5
6 string str1 = "A Test String with server words in it";
7
8 extern void *serverMainFunc(void *);
9
10 bool s2Equal (T_test2::s2 &one, T_test2::s2 &two)
11 {
12   if (one.i1 != two.i1)
13     return false;
14   else if (one.i2 != two.i2)
15     return false;
16   else 
17     return true;
18 }
19 static int stid;
20 static bool asyncCalled = false;
21 static int ctid, dtid;
22 static unsigned asyncCount = 0;
23
24 void *clientMainFunc(void *parentId) {
25   int i, total;
26   T_test2::intStruct is;
27   testUser *remote;
28   string *str2;
29
30   thr_create(0, 0, serverMainFunc, (void*) thr_self(), 0, (thread_t*) &stid);
31   printf("In client2 after thread create, %d\n", stid);
32
33   remote = new testUser(stid);
34
35   int tries;
36   vector<int> vect;
37   vect += 1; vect += 2; vect += 3; vect += 4; vect += 5; 
38   vect += 6; vect += 7; vect += 8; vect += 9; vect += 10;
39
40   scope::fruit fr1 = scope::orange;
41   assert (fr1 == remote->echoFruit(fr1));
42
43   other o, *op;  o.i = 3; o.k = 3.0;
44   op = remote->testOther(&o);
45   assert(op->i = 3);  assert(op->k == 3.0);
46   delete op;
47
48   for (tries=0; tries<100; tries++)
49     remote->nullNull();
50   cerr << "nullNull ok\n";
51
52   for (tries=0; tries<100; tries++)
53     assert(remote->intNull() == 0);
54   cerr << "intNull ok\n";
55
56   for (tries=0; tries<100; tries++)
57     remote->nullStruct(is);
58   cerr << "nullStruct ok\n";
59
60   for (tries=0; tries<100; tries++) {
61     int len = remote->intString(&str1);
62     assert(str1.length() == len);
63   }
64   cerr << "intString ok\n";
65
66   for (tries=0; tries<100; tries++) {
67     str2 = remote->stringString(&str1);
68     assert(*str2 == str1);
69   }
70   cerr << "stringString ok\n";
71
72   for (tries=0; tries<100; tries++) {
73     assert(remote->add(1, 1) == 2);
74     assert(remote->add(-1, -13) == -14);
75   }
76   cerr << "add ok\n";
77
78   total = 0;
79   for (int s=0; s<vect.size(); s++)
80     total += vect[s];
81
82   assert(remote->sumVector(&vect) == total);
83   cout << "sumVector ok\n";
84
85   T_test2::s2 one, two, *p1;
86
87   one.i1 = 3; one.i2 = 7;
88   two.i1 = 3; two.i2 = 7;
89   p1 = remote->isSp(&two);
90   assert (s2Equal(*p1, two));
91   cout << "struct equal ok\n";
92
93   for (i=0; i<100; i++)
94     remote->triggerAsyncUpcall(-10);
95   cout << "triggerAsync ok\n";
96
97   for (i=0; i < 100; i++)
98     assert(remote->add(1, 0) == 1);
99   cout << "add ok\n";
100
101   unsigned tag = MSG_TAG_ANY; int from;
102   while ((from = msg_poll(&tag, 0)) != THR_ERR) {
103     if (remote->isValidTag((T_test2::message_tags)tag))
104       if (remote->waitLoop(false, T_test2::last) == T_test2::error) {
105         cerr << "error\n";
106         assert(0);
107       }
108     tag = MSG_TAG_ANY;
109   }
110
111   cout << "at hangup\n";
112   remote->hangup();
113
114   if (asyncCalled)
115     printf("ThreadPC test1 passed\n");
116   else
117     cerr << "error, async upcall not handled\n";
118   delete remote;
119   return 0;
120 }
121
122
123 main() {
124   thread_t tid; void *ptr;
125   thr_create(0, 0, clientMainFunc, (void*) thr_self(), 0, (thread_t*) &ctid);
126   thr_join(ctid, &tid, &ptr);
127   cout << "In main, all tests passed\n";
128 }
129
130
131 void testUser::asyncUpcall(int val) {
132   asyncCalled = true;
133   printf("asyncUpcall called with value = %d: count = %d\n", val, asyncCount);
134   asyncCount++;
135 }