dates element are mandatory at DataBoxCreditInfo
[libisds.git] / test / simline / isds_get_commercial_credit.c
blobf287297b22e126609de394ca4fb2c481ca082e58
1 #ifndef _POSIX_SOURCE
2 #define _POSIX_SOURCE /* For getaddrinfo(3) */
3 #endif
5 #ifndef _BSD_SOURCE
6 #define _BSD_SOURCE /* For NI_MAXHOST */
7 #endif
9 #ifndef _XOPEN_SOURCE
10 #define _XOPEN_SOURCE 600 /* For unsetenv(3) */
11 #endif
13 #include "../test.h"
14 #include "server.h"
15 #include "isds.h"
17 static const char *username = "Doug1as$";
18 static const char *password = "42aA#bc8";
21 static int test_login(const isds_error error, struct isds_ctx *context,
22 const char *url, const char *username, const char *password,
23 const struct isds_pki_credentials *pki_credentials,
24 struct isds_otp *otp) {
25 isds_error err;
27 err = isds_login(context, url, username, password, pki_credentials, otp);
28 if (error != err)
29 FAIL_TEST("Wrong return code: expected=%s, returned=%s (%s)",
30 isds_strerror(error), isds_strerror(err),
31 isds_long_message(context));
33 PASS_TEST;
36 static int test_isds_get_commercial_credit(const isds_error error,
37 struct isds_ctx *context, const char *box_id,
38 const struct tm *from_date, const struct tm *to_date,
39 const long int *credit, const char **email,
40 const struct isds_list *history) {
41 isds_error returned_error;
42 long int returned_credit = -1;
43 char *returned_email = strdup("foo");
44 struct isds_list *returned_history = NULL;
45 const struct isds_list *item;
46 struct isds_list *returned_item;
47 const struct isds_credit_event *event;
48 struct isds_credit_event *returned_event;
50 returned_error = isds_get_commercial_credit(context, box_id,
51 from_date, to_date,
52 (NULL == credit) ? NULL : &returned_credit,
53 (NULL == email) ? NULL : &returned_email,
54 (NULL == history) ? NULL : &returned_history);
56 if (error != returned_error) {
57 FAILURE_REASON("Wrong return code: expected=%s, returned=%s (%s)",
58 isds_strerror(error), isds_strerror(returned_error),
59 isds_long_message(context));
60 goto fail;
63 if (IE_SUCCESS != returned_error) {
64 if (NULL != email && NULL != returned_email)
65 FAIL_TEST("email is not NULL on error");
66 if (NULL != history && NULL != returned_history)
67 FAIL_TEST("history is not NULL on error");
68 PASS_TEST;
71 if (NULL != email)
72 TEST_STRING_DUPLICITY(*email, returned_email);
73 if (NULL != credit)
74 TEST_INT_DUPLICITY(*credit, returned_credit);
75 for (item = history, returned_item = returned_history;
76 NULL != item;
77 item = item->next, returned_item = returned_item->next) {
78 if (NULL == returned_item)
79 FAIL_TEST("Returned history has too few items");
80 event = (struct isds_credit_event *)item->data;
81 returned_event = (struct isds_credit_event *)returned_item->data;
82 if (NULL == event)
83 ABORT_UNIT("History event is not defined");
84 if (NULL == returned_item)
85 FAIL_TEST("Returned history event is NULL and it shouldn't be");
86 TEST_TIMEVALPTR_DUPLICITY(event->time, returned_event->time);
87 TEST_INT_DUPLICITY(event->credit_change, returned_event->credit_change);
88 TEST_INT_DUPLICITY(event->new_credit, returned_event->new_credit);
89 TEST_INT_DUPLICITY(event->type, returned_event->type);
91 switch (event->type) {
92 case ISDS_CREDIT_CHARGED:
93 TEST_STRING_DUPLICITY(event->details.charged.transaction,
94 returned_event->details.charged.transaction);
95 break;
96 case ISDS_CREDIT_DISCHARGED:
97 TEST_STRING_DUPLICITY(event->details.discharged.transaction,
98 returned_event->details.discharged.transaction);
99 break;
100 case ISDS_CREDIT_MESSAGE_SENT:
101 TEST_STRING_DUPLICITY(event->details.message_sent.recipient,
102 returned_event->details.message_sent.recipient);
103 TEST_STRING_DUPLICITY(event->details.message_sent.message_id,
104 returned_event->details.message_sent.message_id);
105 break;
106 case ISDS_CREDIT_STORAGE_SET:
107 TEST_INT_DUPLICITY(event->details.storage_set.new_capacity,
108 returned_event->details.storage_set.new_capacity);
109 TEST_TMPTR_DUPLICITY(event->details.storage_set.new_valid_from,
110 returned_event->details.storage_set.new_valid_from);
111 TEST_TMPTR_DUPLICITY(event->details.storage_set.new_valid_to,
112 returned_event->details.storage_set.new_valid_to);
113 TEST_INTPTR_DUPLICITY(event->details.storage_set.old_capacity,
114 returned_event->details.storage_set.old_capacity);
115 TEST_TMPTR_DUPLICITY(event->details.storage_set.old_valid_from,
116 returned_event->details.storage_set.old_valid_from);
117 TEST_TMPTR_DUPLICITY(event->details.storage_set.old_valid_to,
118 returned_event->details.storage_set.old_valid_to);
119 TEST_STRING_DUPLICITY(event->details.storage_set.initiator,
120 returned_event->details.storage_set.initiator);
121 break;
122 case ISDS_CREDIT_EXPIRED:
123 break;
124 default:
125 FAIL_TEST("Uknown credit event type returned");
128 if (NULL != returned_item)
129 FAIL_TEST("Returned history has too many items");
132 free(returned_email);
133 isds_list_free(&returned_history);
134 PASS_TEST;
136 fail:
137 free(returned_email);
138 isds_list_free(&returned_history);
139 return 1;
142 int main(int argc, char **argv) {
143 int error;
144 pid_t server_process;
145 struct isds_ctx *context = NULL;
146 char *url = NULL;
148 INIT_TEST("isds_get_commercial_credit");
150 if (unsetenv("http_proxy")) {
151 ABORT_UNIT("Could not remove http_proxy variable from environment\n");
153 if (isds_init()) {
154 isds_cleanup();
155 ABORT_UNIT("isds_init() failed\n");
157 context = isds_ctx_create();
158 if (!context) {
159 isds_cleanup();
160 ABORT_UNIT("isds_ctx_create() failed\n");
164 const char *box_id = "abcefgh";
165 const struct tm from_date = {
166 .tm_year = 1,
167 .tm_mon = 1,
168 .tm_mday = 3
170 const struct tm to_date = {
171 .tm_year = 4,
172 .tm_mon = 4,
173 .tm_mday = 6
175 struct tm new_valid_from = {
176 .tm_year = 2,
177 .tm_mon = 2,
178 .tm_mday = 7
180 struct tm new_valid_to = {
181 .tm_year = 3,
182 .tm_mon = 3,
183 .tm_mday = 8
185 struct tm old_valid_from = {
186 .tm_year = 5,
187 .tm_mon = 5,
188 .tm_mday = 9
190 struct tm old_valid_to = {
191 .tm_year = 6,
192 .tm_mon = 6,
193 .tm_mday = 10
195 const long int credit = 42;
196 long int old_capacity = 43;
197 const char *email = "joe@example.com";
198 struct timeval event_time = {
199 .tv_sec = 981173106,
200 .tv_usec = 123456
203 struct isds_credit_event event_credit_expired = {
204 .time = &event_time,
205 .credit_change = 133,
206 .new_credit = 244,
207 .type = ISDS_CREDIT_EXPIRED,
209 struct server_credit_event server_event_credit_expired = {
210 .time = &event_time,
211 .credit_change = 133,
212 .new_credit = 244,
213 .type = SERVER_CREDIT_EXPIRED,
215 struct isds_list history_expired = {
216 .next = NULL,
217 .data = &event_credit_expired,
218 .destructor = NULL
220 struct server_list server_history_expired = {
221 .next = NULL,
222 .data = &server_event_credit_expired,
223 .destructor = NULL
226 struct isds_credit_event event_credit_storage_set = {
227 .time = &event_time,
228 .credit_change = 133,
229 .new_credit = 244,
230 .type = ISDS_CREDIT_STORAGE_SET,
231 .details.storage_set.new_capacity = 41,
232 .details.storage_set.new_valid_from = &new_valid_from,
233 .details.storage_set.new_valid_to = &new_valid_to,
234 .details.storage_set.old_capacity = &old_capacity,
235 .details.storage_set.old_valid_from = &old_valid_from,
236 .details.storage_set.old_valid_to = &old_valid_to,
237 .details.storage_set.initiator = "Foo",
239 struct server_credit_event server_event_credit_storage_set = {
240 .time = &event_time,
241 .credit_change = 133,
242 .new_credit = 244,
243 .type = SERVER_CREDIT_STORAGE_SET,
244 .details.storage_set.new_capacity = 41,
245 .details.storage_set.new_valid_from = &new_valid_from,
246 .details.storage_set.new_valid_to = &new_valid_to,
247 .details.storage_set.old_capacity = &old_capacity,
248 .details.storage_set.old_valid_from = &old_valid_from,
249 .details.storage_set.old_valid_to = &old_valid_to,
250 .details.storage_set.initiator = "Foo",
252 struct isds_list history_storage_set = {
253 .next = &history_expired,
254 .data = &event_credit_storage_set,
255 .destructor = NULL
257 struct server_list server_history_storage_set = {
258 .next = &server_history_expired,
259 .data = &server_event_credit_storage_set,
260 .destructor = NULL
263 struct isds_credit_event event_credit_message_sent = {
264 .time = &event_time,
265 .credit_change = 133,
266 .new_credit = 244,
267 .type = ISDS_CREDIT_MESSAGE_SENT,
268 .details.message_sent.recipient = "Foo",
269 .details.message_sent.message_id = "ijklmnop",
271 struct server_credit_event server_event_credit_message_sent = {
272 .time = &event_time,
273 .credit_change = 133,
274 .new_credit = 244,
275 .type = SERVER_CREDIT_MESSAGE_SENT,
276 .details.message_sent.recipient = "Foo",
277 .details.message_sent.message_id = "ijklmnop",
279 struct isds_list history_message_sent = {
280 .next = &history_storage_set,
281 .data = &event_credit_message_sent,
282 .destructor = NULL
284 struct server_list server_history_message_sent = {
285 .next = &server_history_storage_set,
286 .data = &server_event_credit_message_sent,
287 .destructor = NULL
290 struct isds_credit_event event_credit_discharged = {
291 .time = &event_time,
292 .credit_change = 133,
293 .new_credit = 244,
294 .type = ISDS_CREDIT_DISCHARGED,
295 .details.discharged.transaction = "Foo"
297 struct server_credit_event server_event_credit_discharged = {
298 .time = &event_time,
299 .credit_change = 133,
300 .new_credit = 244,
301 .type = SERVER_CREDIT_DISCHARGED,
302 .details.discharged.transaction = "Foo"
304 struct isds_list history_discharged = {
305 .next = &history_message_sent,
306 .data = &event_credit_discharged,
307 .destructor = NULL
309 struct server_list server_history_discharged = {
310 .next = &server_history_message_sent,
311 .data = &server_event_credit_discharged,
312 .destructor = NULL
315 struct isds_credit_event event_credit_charged = {
316 .time = &event_time,
317 .credit_change = 133,
318 .new_credit = 244,
319 .type = ISDS_CREDIT_CHARGED,
320 .details.charged.transaction = "Foo"
322 struct server_credit_event server_event_credit_charged = {
323 .time = &event_time,
324 .credit_change = 133,
325 .new_credit = 244,
326 .type = SERVER_CREDIT_CHARGED,
327 .details.charged.transaction = "Foo"
329 const struct isds_list history = {
330 .next = &history_discharged,
331 .data = &event_credit_charged,
332 .destructor = NULL
334 const struct server_list server_history = {
335 .next = &server_history_discharged,
336 .data = &server_event_credit_charged,
337 .destructor = NULL
341 const struct arguments_DS_df_DataBoxCreditInfo service_arguments = {
342 .status_code = "0000",
343 .status_message = "Ok.",
344 .box_id = box_id,
345 .from_date = &from_date,
346 .to_date = &to_date,
347 .current_credit = credit,
348 .email = email,
349 .history = &server_history
351 const struct service_configuration services[] = {
352 { SERVICE_DS_Dz_DummyOperation, NULL },
353 { SERVICE_DS_df_DataBoxCreditInfo, &service_arguments },
354 { SERVICE_END, NULL }
356 const struct arguments_basic_authentication server_arguments = {
357 .username = username,
358 .password = password,
359 .isds_deviations = 1,
360 .services = services
362 error = start_server(&server_process, &url,
363 server_basic_authentication, &server_arguments, NULL);
364 if (error == -1) {
365 isds_ctx_free(&context);
366 isds_cleanup();
367 ABORT_UNIT(server_error);
370 TEST("login", test_login, IE_SUCCESS,
371 context, url, username, password, NULL, NULL);
372 TEST("NULL box_id", test_isds_get_commercial_credit, IE_INVAL,
373 context, NULL, NULL, NULL, NULL, NULL, NULL);
374 TEST("All data", test_isds_get_commercial_credit, IE_SUCCESS,
375 context, box_id, &from_date, &to_date, &credit, &email,
376 &history);
377 TEST("Wrong box_id", test_isds_get_commercial_credit, IE_ISDS,
378 context, "1", &from_date, &to_date, &credit, &email,
379 &history);
380 TEST("No history", test_isds_get_commercial_credit, IE_SUCCESS,
381 context, box_id, NULL, NULL, &credit, &email, NULL);
383 if (stop_server(server_process)) {
384 ABORT_UNIT(server_error);
387 free(url);
388 url = NULL;
392 isds_logout(context);
393 isds_ctx_free(&context);
394 isds_cleanup();
395 SUM_TEST();