blob: 11afc51963c22841f810e6fd118536a428b021b9 [file] [log] [blame]
Neels Hofmeyr6a29d322017-01-25 15:04:16 +01001/* Osmocom MSC+VLR end-to-end tests */
2
3/* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
4 *
5 * All Rights Reserved
6 *
7 * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 *
22 */
23
24#include "msc_vlr_tests.h"
25
Neels Hofmeyrf3d81f62018-03-02 01:05:38 +010026static void test_ms_timeout_lu_auth_resp()
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010027{
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +010028 comment_start();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010029
30 net->authentication_required = true;
31
32 fake_time_start();
33
34 btw("Location Update request causes a GSUP Send Auth Info request to HLR");
35 lu_result_sent = RES_NONE;
Neels Hofmeyr63b24642019-12-12 01:31:04 +010036 gsup_expect_tx("08010809710000004026f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010037 ms_sends_msg("050802008168000130089910070000006402");
38 OSMO_ASSERT(gsup_tx_confirmed);
39 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
40
41 btw("from HLR, rx _SEND_AUTH_INFO_RESULT; VLR sends Auth Req to MS");
42 auth_request_sent = false;
43 auth_request_expect_rand = "585df1ae287f6e273dce07090d61320b";
44 auth_request_expect_autn = NULL;
45 /* Based on a Ki of 000102030405060708090a0b0c0d0e0f */
46 gsup_rx("0a"
47 /* imsi */
48 "0108" "09710000004026f0"
49 /* auth vectors... */
50 /* TL TL rand */
51 "0322" "2010" "585df1ae287f6e273dce07090d61320b"
52 /* TL sres TL kc */
53 "2104" "2d8b2c3e" "2208" "61855fb81fc2a800"
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010054 HLR_TO_VLR,NULL);
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010055 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
56 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
57
58 BTW("MS fails to send an Authentication Response");
59
60 btw("At first, we're still waiting");
61 fake_time_passes(0, 423);
62 EXPECT_CONN_COUNT(1);
63 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
64 fake_time_passes(1, 235);
65 EXPECT_CONN_COUNT(1);
66 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
67 fake_time_passes(1, 235);
68 EXPECT_CONN_COUNT(1);
69 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
70 fake_time_passes(1, 235);
71 EXPECT_CONN_COUNT(1);
72 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
73 fake_time_passes(1, 235);
74 EXPECT_CONN_COUNT(1);
75 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
Philipp Maierfbf66102017-04-09 12:32:51 +020076 expect_bssap_clear();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010077 fake_time_passes(1, 235);
Neels Hofmeyrc036b792018-11-29 22:37:51 +010078 btw("RAN_CONN_TIMEOUT has passed, conn is gone.");
Philipp Maierfbf66102017-04-09 12:32:51 +020079 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010080 ran_sends_clear_complete();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010081 EXPECT_CONN_COUNT(0);
82 VERBOSE_ASSERT(lu_result_sent, == RES_REJECT, "%d");
83
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +010084 comment_end();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010085}
86
Neels Hofmeyrf3d81f62018-03-02 01:05:38 +010087static void test_ms_timeout_cm_auth_resp()
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010088{
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +010089 comment_start();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010090
91 net->authentication_required = true;
92
93 fake_time_start();
94
95 btw("Location Update request causes a GSUP Send Auth Info request to HLR");
96 lu_result_sent = RES_NONE;
Neels Hofmeyr63b24642019-12-12 01:31:04 +010097 gsup_expect_tx("08010809710000004026f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyr6a29d322017-01-25 15:04:16 +010098 ms_sends_msg("050802008168000130089910070000006402");
99 OSMO_ASSERT(gsup_tx_confirmed);
100 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
101
102 btw("from HLR, rx _SEND_AUTH_INFO_RESULT; VLR sends Auth Req to MS");
103 auth_request_sent = false;
104 auth_request_expect_rand = "585df1ae287f6e273dce07090d61320b";
105 auth_request_expect_autn = NULL;
106 /* Based on a Ki of 000102030405060708090a0b0c0d0e0f */
107 gsup_rx("0a"
108 /* imsi */
109 "0108" "09710000004026f0"
110 /* 5 auth vectors... */
111 /* TL TL rand */
112 "0322" "2010" "585df1ae287f6e273dce07090d61320b"
113 /* TL sres TL kc */
114 "2104" "2d8b2c3e" "2208" "61855fb81fc2a800"
115 "0322" "2010" "12aca96fb4ffdea5c985cbafa9b6e18b"
116 "2104" "20bde240" "2208" "07fa7502e07e1c00"
117 "0322" "2010" "e7c03ba7cf0e2fde82b2dc4d63077d42"
118 "2104" "a29514ae" "2208" "e2b234f807886400"
119 "0322" "2010" "fa8f20b781b5881329d4fea26b1a3c51"
120 "2104" "5afc8d72" "2208" "2392f14f709ae000"
121 "0322" "2010" "0fd4cc8dbe8715d1f439e304edfd68dc"
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100122 "2104" "bc8d1c5b" "2208" "da7cdd6bfe2d7000" HLR_TO_VLR,
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100123 NULL);
124 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
125 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
126
127 btw("MS sends Authen Response, VLR accepts and sends GSUP LU Req to HLR");
Neels Hofmeyr63b24642019-12-12 01:31:04 +0100128 gsup_expect_tx("04010809710000004026f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100129 ms_sends_msg("05542d8b2c3e");
130 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
131
132 btw("HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100133 gsup_rx("10010809710000004026f00804036470f1" HLR_TO_VLR,
134 "12010809710000004026f0" VLR_TO_HLR);
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100135 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
136
137 btw("HLR also sends GSUP _UPDATE_LOCATION_RESULT");
Philipp Maierfbf66102017-04-09 12:32:51 +0200138 expect_bssap_clear();
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100139 gsup_rx("06010809710000004026f0" HLR_TO_VLR, NULL);
Philipp Maierfbf66102017-04-09 12:32:51 +0200140 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100141
142 btw("LU was successful, and the conn has already been closed");
143 VERBOSE_ASSERT(lu_result_sent, == RES_ACCEPT, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100144 ran_sends_clear_complete();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100145 EXPECT_CONN_COUNT(0);
146
147 BTW("after a while, a new conn sends a CM Service Request. VLR responds with Auth Req, 2nd auth vector");
148 auth_request_sent = false;
149 auth_request_expect_rand = "12aca96fb4ffdea5c985cbafa9b6e18b";
150 cm_service_result_sent = RES_NONE;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100151 ms_sends_msg("05247403305886089910070000006402");
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100152 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
153 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
154
155 BTW("MS fails to send an Authentication Response");
156
157 btw("At first, we're still waiting");
158 fake_time_passes(0, 423);
159 EXPECT_CONN_COUNT(1);
160 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
161 fake_time_passes(1, 235);
162 EXPECT_CONN_COUNT(1);
163 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
164 fake_time_passes(1, 235);
165 EXPECT_CONN_COUNT(1);
166 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
167 fake_time_passes(1, 235);
168 EXPECT_CONN_COUNT(1);
169 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
170 fake_time_passes(1, 235);
171 EXPECT_CONN_COUNT(1);
172 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
Philipp Maierfbf66102017-04-09 12:32:51 +0200173 expect_bssap_clear();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100174 fake_time_passes(1, 235);
Neels Hofmeyrc036b792018-11-29 22:37:51 +0100175 btw("RAN_CONN_TIMEOUT has passed, conn is gone.");
Philipp Maierfbf66102017-04-09 12:32:51 +0200176 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100177 ran_sends_clear_complete();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100178 EXPECT_CONN_COUNT(0);
179 VERBOSE_ASSERT(cm_service_result_sent, == RES_REJECT, "%d");
180
181 clear_vlr();
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100182 comment_end();
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100183}
184
Neels Hofmeyrf3d81f62018-03-02 01:05:38 +0100185static void test_ms_timeout_paging()
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100186{
187 struct vlr_subscr *vsub;
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100188 const char *imsi = "901700000004620";
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100189
Neels Hofmeyr7814a832018-12-26 00:40:18 +0100190 rx_from_ran = OSMO_RAT_GERAN_A;
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100191
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100192 comment_start();
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100193
194 fake_time_start();
195
196 btw("Location Update request causes a GSUP LU request to HLR");
197 lu_result_sent = RES_NONE;
Neels Hofmeyr63b24642019-12-12 01:31:04 +0100198 gsup_expect_tx("04010809710000004026f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100199 ms_sends_msg("050802008168000130089910070000006402");
200 OSMO_ASSERT(gsup_tx_confirmed);
201 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
202
203 btw("HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100204 gsup_rx("10010809710000004026f00804036470f1" HLR_TO_VLR,
205 "12010809710000004026f0" VLR_TO_HLR);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100206 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
207
208 btw("HLR also sends GSUP _UPDATE_LOCATION_RESULT");
209 expect_bssap_clear();
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100210 gsup_rx("06010809710000004026f0" HLR_TO_VLR, NULL);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100211
212 btw("LU was successful, and the conn has already been closed");
213 VERBOSE_ASSERT(lu_result_sent, == RES_ACCEPT, "%d");
214 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100215 ran_sends_clear_complete();
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100216 EXPECT_CONN_COUNT(0);
217
218 BTW("an SMS is sent, MS is paged");
219 paging_expect_imsi(imsi);
220 paging_sent = false;
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100221 vsub = vlr_subscr_find_by_imsi(net->vlr, imsi, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100222 OSMO_ASSERT(vsub);
223 VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 0, "%d");
224
225 send_sms(vsub, vsub,
226 "Privacy in residential applications is a desirable"
227 " marketing option.");
228
229 VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 1, "%d");
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100230 vlr_subscr_put(vsub, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100231 vsub = NULL;
232 VERBOSE_ASSERT(paging_sent, == true, "%d");
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100233
234 btw("time passes and no paging result is received");
235
236 fake_time_passes(MSC_PAGING_RESPONSE_TIMER_DEFAULT - 1, 0);
237
238 btw("the paging timeout has not yet expired");
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100239 vsub = vlr_subscr_find_by_imsi(net->vlr, imsi, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100240 OSMO_ASSERT(vsub);
241 VERBOSE_ASSERT(vsub->cs.is_paging, == true, "%d");
242 btw("another request is added to the list but does not cause another paging");
243 paging_sent = false;
244 paging_expect_imsi(NULL);
245 send_sms(vsub, vsub,
246 "One paging ought to be enough for anyone.");
247 VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 2, "%d");
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100248 vlr_subscr_put(vsub, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100249 vsub = NULL;
250 VERBOSE_ASSERT(paging_sent, == false, "%d");
251
252 btw("the paging timeout expires, the paging as well as the requests are canceled");
253 fake_time_passes(2, 0);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100254
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100255 vsub = vlr_subscr_find_by_imsi(net->vlr, imsi, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100256 OSMO_ASSERT(vsub);
257 VERBOSE_ASSERT(vsub->cs.is_paging, == false, "%d");
258 VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 0, "%d");
Neels Hofmeyrfacd57a2017-12-15 03:48:48 +0100259
260 BTW("Now that the timeout has expired, another Paging is sent on request");
261 paging_expect_imsi(imsi);
262 paging_sent = false;
263
264 send_sms(vsub, vsub,
265 "Privacy in residential applications is a desirable"
266 " marketing option.");
267
268 VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 1, "%d");
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100269 vlr_subscr_put(vsub, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100270 vsub = NULL;
Neels Hofmeyrfacd57a2017-12-15 03:48:48 +0100271 VERBOSE_ASSERT(paging_sent, == true, "%d");
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100272
Neels Hofmeyrfacd57a2017-12-15 03:48:48 +0100273 BTW("subscriber detaches, pagings are canceled");
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100274 expect_bssap_clear();
275 ms_sends_msg("050130089910070000006402");
276 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100277
278 ran_sends_clear_complete();
279 EXPECT_CONN_COUNT(0);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100280
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100281 vsub = vlr_subscr_find_by_imsi(net->vlr, imsi, __func__);
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100282 OSMO_ASSERT(!vsub);
283
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100284 clear_vlr();
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100285 comment_end();
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100286}
287
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200288static void test_classmark_update_timeout()
289{
290 comment_start();
291
292 fake_time_start();
293
294 /* implicit: net->authentication_required = true; */
295 net->a5_encryption_mask = (1 << 3); /* A5/3 */
296
297 btw("Location Update request causes a GSUP Send Auth Info request to HLR");
298 lu_result_sent = RES_NONE;
Neels Hofmeyr63b24642019-12-12 01:31:04 +0100299 gsup_expect_tx("08010809710000004026f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200300 ms_sends_msg("050802008168000130089910070000006402");
301 OSMO_ASSERT(gsup_tx_confirmed);
302 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
303
304 btw("from HLR, rx _SEND_AUTH_INFO_RESULT; VLR sends Auth Req to MS");
305 /* Based on a Ki of 000102030405060708090a0b0c0d0e0f */
306 auth_request_sent = false;
307 auth_request_expect_rand = "585df1ae287f6e273dce07090d61320b";
308 auth_request_expect_autn = NULL;
309 gsup_rx("0a"
310 /* imsi */
311 "0108" "09710000004026f0"
312 /* TL TL rand */
313 "0322" "2010" "585df1ae287f6e273dce07090d61320b"
314 /* TL sres TL kc */
315 "2104" "2d8b2c3e" "2208" "61855fb81fc2a800"
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100316 HLR_TO_VLR,
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200317 NULL);
318 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
319 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
320
321 BTW("MS sends Authen Response, VLR accepts and wants to send Ciphering Mode Command to MS"
322 " -- but needs Classmark 2 to determine whether A5/3 is supported");
323 cipher_mode_cmd_sent = false;
324 ms_sends_msg("05542d8b2c3e");
325 OSMO_ASSERT(!cipher_mode_cmd_sent);
326 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
327
328 BTW("But the BSSMAP Classmark Update never arrives");
329 btw("At first, we're still waiting");
330 fake_time_passes(0, 423);
331 EXPECT_CONN_COUNT(1);
332 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
333 fake_time_passes(1, 235);
334 EXPECT_CONN_COUNT(1);
335 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
336 fake_time_passes(1, 235);
337 EXPECT_CONN_COUNT(1);
338 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
339 fake_time_passes(1, 235);
340 EXPECT_CONN_COUNT(1);
341 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
342 fake_time_passes(1, 235);
343 EXPECT_CONN_COUNT(1);
344 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
345 expect_bssap_clear();
346 fake_time_passes(1, 235);
Neels Hofmeyrc036b792018-11-29 22:37:51 +0100347 btw("RAN_CONN_TIMEOUT has passed, conn is gone.");
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200348 VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100349 ran_sends_clear_complete();
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200350 EXPECT_CONN_COUNT(0);
351 VERBOSE_ASSERT(lu_result_sent, == RES_REJECT, "%d");
352
353 comment_end();
354}
355
356
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100357msc_vlr_test_func_t msc_vlr_tests[] = {
358 test_ms_timeout_lu_auth_resp,
359 test_ms_timeout_cm_auth_resp,
Neels Hofmeyr2ff5bcd2017-12-15 03:02:27 +0100360 test_ms_timeout_paging,
Neels Hofmeyr3117b702018-09-13 03:23:07 +0200361 test_classmark_update_timeout,
Neels Hofmeyr6a29d322017-01-25 15:04:16 +0100362 NULL
363};