src/server/test/event.c

changeset 552
4ed0e46aa9dc
parent 551
97039494764b
equal deleted inserted replaced
551:97039494764b 552:4ed0e46aa9dc
53 53
54 EVHandler *ev2 = evhandler_create(&cfg4); 54 EVHandler *ev2 = evhandler_create(&cfg4);
55 UCX_TEST_ASSERT(ev2, "evhandler_create (2) failed"); 55 UCX_TEST_ASSERT(ev2, "evhandler_create (2) failed");
56 UCX_TEST_ASSERT(ev2->numins == 4, "ev2 wrong number of instances"); 56 UCX_TEST_ASSERT(ev2->numins == 4, "ev2 wrong number of instances");
57 57
58 evhandler_close(ev1); 58
59 evhandler_close(ev2); 59 evhandler_shutdown(ev1);
60 evhandler_shutdown(ev2);
61
62 evhandler_wait_and_destroy(ev1);
63 evhandler_wait_and_destroy(ev2);
60 64
61 UCX_TEST_END; 65 UCX_TEST_END;
62 } 66 }
63 67
64 static int test_event_send_fn(EventHandler *h, Event *event) { 68 static int test_event_send_fn(EventHandler *h, Event *event) {
69 pthread_mutex_lock(&test->mutex); 73 pthread_mutex_lock(&test->mutex);
70 pthread_cond_signal(&test->cond); 74 pthread_cond_signal(&test->cond);
71 pthread_mutex_unlock(&test->mutex); 75 pthread_mutex_unlock(&test->mutex);
72 76
73 return 0; 77 return 0;
78 }
79
80 static void testdata_wait_for_completion(EVTest *testdata) {
81 time_t tstart = time(NULL);
82 while(!testdata->i1) {
83 time_t t = time(NULL);
84 if(t - tstart > 10) {
85 break;
86 }
87
88 pthread_mutex_lock(&testdata->mutex);
89 pthread_cond_wait(&testdata->cond, &testdata->mutex);
90 pthread_mutex_unlock(&testdata->mutex);
91 }
74 } 92 }
75 93
76 UCX_TEST(test_event_send) { 94 UCX_TEST(test_event_send) {
77 EventHandlerConfig cfg = { .nthreads = 1}; 95 EventHandlerConfig cfg = { .nthreads = 1};
78 96
85 pthread_mutex_init(&testdata.mutex, NULL); 103 pthread_mutex_init(&testdata.mutex, NULL);
86 pthread_cond_init(&testdata.cond, NULL); 104 pthread_cond_init(&testdata.cond, NULL);
87 105
88 UCX_TEST_BEGIN; 106 UCX_TEST_BEGIN;
89 107
108 // test sending a single event
109 // the event signals completion in the testdata object
110 // wait up to 10 seconds for completion (it should be instantly)
111
90 Event evt; 112 Event evt;
91 ZERO(&evt, sizeof(Event)); 113 ZERO(&evt, sizeof(Event));
92 evt.fn = test_event_send_fn; 114 evt.fn = test_event_send_fn;
93 evt.cookie = &testdata; 115 evt.cookie = &testdata;
94 116
95 int ret = event_send(h, &evt); 117 int ret = event_send(h, &evt);
96 118
97 // wait for event finish 119 // wait for event finish
98 time_t tstart = time(NULL); 120 testdata_wait_for_completion(&testdata);
99 while(!testdata.i1) {
100 time_t t = time(NULL);
101 if(t - tstart > 10) {
102 break;
103 }
104
105 pthread_mutex_lock(&testdata.mutex);
106 pthread_cond_wait(&testdata.cond, &testdata.mutex);
107 pthread_mutex_unlock(&testdata.mutex);
108 }
109 121
110 UCX_TEST_ASSERT(!ret, "event_send failed"); 122 UCX_TEST_ASSERT(!ret, "event_send failed");
111 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); 123 UCX_TEST_ASSERT(testdata.i1, "event callback not called");
112 UCX_TEST_ASSERT(testdata.i2, "event callback received wrong event handler pointer"); 124 UCX_TEST_ASSERT(testdata.i2, "event callback received wrong event handler pointer");
113 125
114 UCX_TEST_END; 126 UCX_TEST_END;
115 127
116 pthread_mutex_destroy(&testdata.mutex); 128 pthread_mutex_destroy(&testdata.mutex);
117 pthread_cond_destroy(&testdata.cond); 129 pthread_cond_destroy(&testdata.cond);
118 130
119 evhandler_close(ev); 131 evhandler_shutdown(ev);
120 } 132 evhandler_wait_and_destroy(ev);
133 }
134
135 #define EV_TEST_NUM_EVENTS 2000
136
137 static int test_event_send_multi_fn_count(EventHandler *h, Event *event) {
138 EVTest *test = event->cookie;
139
140 test->i2++;
141
142 return 0;
143 }
144
145 static int test_event_send_multi_fn_end(EventHandler *h, Event *event) {
146 EVTest *test = event->cookie;
147 test->i1 = 1;
148
149 pthread_mutex_lock(&test->mutex);
150 pthread_cond_signal(&test->cond);
151 pthread_mutex_unlock(&test->mutex);
152
153 return 0;
154 }
155
156 static int test_event_send_multi_fn1(EventHandler *h, Event *event) {
157 EVTest *test = event->cookie;
158 test->i2 = 0;
159
160 for(int i=0;i<EV_TEST_NUM_EVENTS;i++) {
161 Event *newevent = malloc(sizeof(Event));
162 ZERO(newevent, sizeof(Event));
163 newevent->fn = test_event_send_multi_fn_count;
164 newevent->finish = ev_free_event;
165 newevent->cookie = test;
166 event_send(h, newevent);
167 }
168
169 Event *finish_event = malloc(sizeof(Event));
170 ZERO(finish_event, sizeof(Event));
171 finish_event->fn = test_event_send_multi_fn_end;
172 finish_event->finish = ev_free_event;
173 finish_event->cookie = test;
174 event_send(h, finish_event);
175
176 return 0;
177 }
178
179 UCX_TEST(test_event_send_multi) {
180 EventHandlerConfig cfg = { .nthreads = 1};
181
182 EVHandler *ev = evhandler_create(&cfg);
183 EventHandler *h = ev_instance(ev);
184
185 EVTest testdata;
186 ZERO(&testdata, sizeof(EVTest));
187 testdata.h = h;
188 pthread_mutex_init(&testdata.mutex, NULL);
189 pthread_cond_init(&testdata.cond, NULL);
190
191 UCX_TEST_BEGIN;
192
193 // test sending multiple events
194 // the first callback test_event_send_multi_fn1 adds additional
195 // EV_TEST_NUM_EVENTS events to the handler + an additional
196 // finishing event, that notifies completion
197
198 Event evt;
199 ZERO(&evt, sizeof(Event));
200 evt.fn = test_event_send_multi_fn1;
201 evt.cookie = &testdata;
202
203 int ret = event_send(h, &evt);
204
205 // wait for event finish
206 testdata_wait_for_completion(&testdata);
207
208 UCX_TEST_ASSERT(!ret, "event_send failed");
209 UCX_TEST_ASSERT(testdata.i1, "event callback not called");
210 UCX_TEST_ASSERT(testdata.i2 == EV_TEST_NUM_EVENTS, "event callback received wrong event handler pointer");
211
212 UCX_TEST_END;
213
214 pthread_mutex_destroy(&testdata.mutex);
215 pthread_cond_destroy(&testdata.cond);
216
217 evhandler_shutdown(ev);
218 evhandler_wait_and_destroy(ev);
219 }

mercurial