| 38 void *data2; |
38 void *data2; |
| 39 int i1; |
39 int i1; |
| 40 int i2; |
40 int i2; |
| 41 } EVTest; |
41 } EVTest; |
| 42 |
42 |
| 43 UCX_TEST(test_evhandler_create) { |
43 CX_TEST(test_evhandler_create) { |
| 44 EventHandlerConfig cfg1 = { .nthreads = 1}; |
44 EventHandlerConfig cfg1 = { .nthreads = 1}; |
| 45 |
45 |
| 46 EventHandlerConfig cfg4 = { .nthreads = 4}; |
46 EventHandlerConfig cfg4 = { .nthreads = 4}; |
| 47 |
47 |
| 48 UCX_TEST_BEGIN; |
48 CX_TEST_DO { |
| 49 |
49 EVHandler *ev1 = evhandler_create(&cfg1); |
| 50 EVHandler *ev1 = evhandler_create(&cfg1); |
50 CX_TEST_ASSERT(ev1); |
| 51 UCX_TEST_ASSERT(ev1, "evhandler_create (1) failed"); |
51 CX_TEST_ASSERT(ev1->numins == 1); |
| 52 UCX_TEST_ASSERT(ev1->numins == 1, "ev1 wrong number of instances"); |
52 |
| 53 |
53 EVHandler *ev2 = evhandler_create(&cfg4); |
| 54 EVHandler *ev2 = evhandler_create(&cfg4); |
54 CX_TEST_ASSERT(ev2); |
| 55 UCX_TEST_ASSERT(ev2, "evhandler_create (2) failed"); |
55 CX_TEST_ASSERT(ev2->numins == 4); |
| 56 UCX_TEST_ASSERT(ev2->numins == 4, "ev2 wrong number of instances"); |
56 |
| 57 |
57 |
| 58 |
58 evhandler_shutdown(ev1); |
| 59 evhandler_shutdown(ev1); |
59 evhandler_shutdown(ev2); |
| 60 evhandler_shutdown(ev2); |
60 |
| 61 |
61 evhandler_wait_and_destroy(ev1); |
| 62 evhandler_wait_and_destroy(ev1); |
62 evhandler_wait_and_destroy(ev2); |
| 63 evhandler_wait_and_destroy(ev2); |
63 } |
| 64 |
|
| 65 UCX_TEST_END; |
|
| 66 } |
64 } |
| 67 |
65 |
| 68 static int test_event_send_fn(EventHandler *h, Event *event) { |
66 static int test_event_send_fn(EventHandler *h, Event *event) { |
| 69 EVTest *test = event->cookie; |
67 EVTest *test = event->cookie; |
| 70 test->i1 = 1; |
68 test->i1 = 1; |
| 89 pthread_cond_wait(&testdata->cond, &testdata->mutex); |
87 pthread_cond_wait(&testdata->cond, &testdata->mutex); |
| 90 pthread_mutex_unlock(&testdata->mutex); |
88 pthread_mutex_unlock(&testdata->mutex); |
| 91 } |
89 } |
| 92 } |
90 } |
| 93 |
91 |
| 94 UCX_TEST(test_event_send) { |
92 CX_TEST(test_event_send) { |
| 95 EventHandlerConfig cfg = { .nthreads = 1}; |
93 EventHandlerConfig cfg = { .nthreads = 1}; |
| 96 |
94 |
| 97 EVHandler *ev = evhandler_create(&cfg); |
95 EVHandler *ev = evhandler_create(&cfg); |
| 98 EventHandler *h = ev_instance(ev); |
96 EventHandler *h = ev_instance(ev); |
| 99 |
97 |
| 101 ZERO(&testdata, sizeof(EVTest)); |
99 ZERO(&testdata, sizeof(EVTest)); |
| 102 testdata.h = h; |
100 testdata.h = h; |
| 103 pthread_mutex_init(&testdata.mutex, NULL); |
101 pthread_mutex_init(&testdata.mutex, NULL); |
| 104 pthread_cond_init(&testdata.cond, NULL); |
102 pthread_cond_init(&testdata.cond, NULL); |
| 105 |
103 |
| 106 UCX_TEST_BEGIN; |
104 CX_TEST_DO { |
| 107 |
105 |
| 108 // test sending a single event |
106 // test sending a single event |
| 109 // the event signals completion in the testdata object |
107 // the event signals completion in the testdata object |
| 110 // wait up to 10 seconds for completion (it should be instantly) |
108 // wait up to 10 seconds for completion (it should be instantly) |
| 111 |
109 |
| 112 Event evt; |
110 Event evt; |
| 113 ZERO(&evt, sizeof(Event)); |
111 ZERO(&evt, sizeof(Event)); |
| 114 evt.fn = test_event_send_fn; |
112 evt.fn = test_event_send_fn; |
| 115 evt.cookie = &testdata; |
113 evt.cookie = &testdata; |
| 116 |
114 |
| 117 int ret = event_send(h, &evt); |
115 int ret = event_send(h, &evt); |
| 118 |
116 |
| 119 // wait for event finish |
117 // wait for event finish |
| 120 testdata_wait_for_completion(&testdata); |
118 testdata_wait_for_completion(&testdata); |
| 121 |
119 |
| 122 UCX_TEST_ASSERT(!ret, "event_send failed"); |
120 CX_TEST_ASSERT(!ret); |
| 123 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); |
121 CX_TEST_ASSERT(testdata.i1); |
| 124 UCX_TEST_ASSERT(testdata.i2, "event callback received wrong event handler pointer"); |
122 CX_TEST_ASSERT(testdata.i2); |
| 125 |
123 |
| 126 UCX_TEST_END; |
124 } |
| 127 |
125 |
| 128 pthread_mutex_destroy(&testdata.mutex); |
126 pthread_mutex_destroy(&testdata.mutex); |
| 129 pthread_cond_destroy(&testdata.cond); |
127 pthread_cond_destroy(&testdata.cond); |
| 130 |
128 |
| 131 evhandler_shutdown(ev); |
129 evhandler_shutdown(ev); |
| 174 event_send(h, finish_event); |
172 event_send(h, finish_event); |
| 175 |
173 |
| 176 return 0; |
174 return 0; |
| 177 } |
175 } |
| 178 |
176 |
| 179 UCX_TEST(test_event_send_multi) { |
177 CX_TEST(test_event_send_multi) { |
| 180 EventHandlerConfig cfg = { .nthreads = 1}; |
178 EventHandlerConfig cfg = { .nthreads = 1}; |
| 181 |
179 |
| 182 EVHandler *ev = evhandler_create(&cfg); |
180 EVHandler *ev = evhandler_create(&cfg); |
| 183 EventHandler *h = ev_instance(ev); |
181 EventHandler *h = ev_instance(ev); |
| 184 |
182 |
| 186 ZERO(&testdata, sizeof(EVTest)); |
184 ZERO(&testdata, sizeof(EVTest)); |
| 187 testdata.h = h; |
185 testdata.h = h; |
| 188 pthread_mutex_init(&testdata.mutex, NULL); |
186 pthread_mutex_init(&testdata.mutex, NULL); |
| 189 pthread_cond_init(&testdata.cond, NULL); |
187 pthread_cond_init(&testdata.cond, NULL); |
| 190 |
188 |
| 191 UCX_TEST_BEGIN; |
189 CX_TEST_DO { |
| 192 |
190 |
| 193 // test sending multiple events |
191 // test sending multiple events |
| 194 // the first callback test_event_send_multi_fn1 adds additional |
192 // the first callback test_event_send_multi_fn1 adds additional |
| 195 // EV_TEST_NUM_EVENTS events to the handler + an additional |
193 // EV_TEST_NUM_EVENTS events to the handler + an additional |
| 196 // finishing event, that notifies completion |
194 // finishing event, that notifies completion |
| 197 |
195 |
| 198 Event evt; |
196 Event evt; |
| 199 ZERO(&evt, sizeof(Event)); |
197 ZERO(&evt, sizeof(Event)); |
| 200 evt.fn = test_event_send_multi_fn1; |
198 evt.fn = test_event_send_multi_fn1; |
| 201 evt.cookie = &testdata; |
199 evt.cookie = &testdata; |
| 202 |
200 |
| 203 int ret = event_send(h, &evt); |
201 int ret = event_send(h, &evt); |
| 204 |
202 |
| 205 // wait for event finish |
203 // wait for event finish |
| 206 testdata_wait_for_completion(&testdata); |
204 testdata_wait_for_completion(&testdata); |
| 207 |
205 |
| 208 UCX_TEST_ASSERT(!ret, "event_send failed"); |
206 CX_TEST_ASSERT(!ret); |
| 209 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); |
207 CX_TEST_ASSERT(testdata.i1); |
| 210 UCX_TEST_ASSERT(testdata.i2 == EV_TEST_NUM_EVENTS, "event callback received wrong event handler pointer"); |
208 CX_TEST_ASSERT(testdata.i2 == EV_TEST_NUM_EVENTS); |
| 211 |
209 |
| 212 UCX_TEST_END; |
210 } |
| 213 |
211 |
| 214 pthread_mutex_destroy(&testdata.mutex); |
212 pthread_mutex_destroy(&testdata.mutex); |
| 215 pthread_cond_destroy(&testdata.cond); |
213 pthread_cond_destroy(&testdata.cond); |
| 216 |
214 |
| 217 evhandler_shutdown(ev); |
215 evhandler_shutdown(ev); |