Statistics
| Revision:

root / trunk / tests / test_download_queue.c @ 1847

History | View | Annotate | Download (20.8 KB)

1
/* 
2
    Copyright (C) 2005-2011  Erik van Pienbroek
3

                
4
    This program is free software; you can redistribute it and/or modify
5
    it under the terms of the GNU General Public License as published by
6
    the Free Software Foundation; either version 2 of the License, or
7
    (at your option) any later version.
8

                
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU General Public License for more details.
13

                
14
    You should have received a copy of the GNU General Public License
15
    along with this program; if not, write to the Free Software
16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
*/
18

                
19
#include 
20
#include 
21
#include 
22

                
23
#include "common.h"
24
#include "test_download_queue.h"
25

                
26
#include "nntpgrab_utils.h"
27
#include "download_queue.h"
28

                
29
/* Fake placeholders */
30
void
31
ng_plugin_emit_log_msg(NGPlugin *plugin_data, NGLogLevel log_level, const char *format, ...)
32
{
33
    va_list args;
34
    char msg[1024];
35
    va_start(args, format);
36
    memset(msg, 0, sizeof(msg));
37
    vsnprintf(msg, sizeof(msg) - 1, format, args);
38
    va_end(args);
39

                
40
    g_test_message("%s", msg);
41
}
42

                
43
typedef void* DecoderData;
44
void
45
decoder_thread_push_task(DecoderData *task)
46
{
47

                
48
}
49

                
50
NntpgrabCore *
51
get_core(void)
52
{
53
    return NULL;
54
}
55

                
56
void
57
download_thread_awaken_if_needed(void)
58
{
59

                
60
}
61

                
62
ngboolean
63
ng_plugin_emit_internal_event(const char *event_name, ...)
64
{
65
    return TRUE;
66
}
67

                
68
/* Helper functions */
69
static NGList *
70
generate_part_list(guint64 *file_size)
71
{
72
    NNTPPart *part;
73
    NGList *list;
74

                
75
    g_return_val_if_fail(file_size != NULL, NULL);
76

                
77
    *file_size = 0;
78

                
79
    part = g_slice_new0(NNTPPart);
80
    strncpy((char *) part->message_id, "", sizeof(part->message_id));
81
    part->size = 258374;
82
    part->part_num = 1;
83
    *file_size += part->size;
84
    list = ng_list_append(NULL, part);
85

                
86
    part = g_slice_new0(NNTPPart);
87
    strncpy((char *) part->message_id, "", sizeof(part->message_id));
88
    part->size = 258436;
89
    part->part_num = 2;
90
    *file_size += part->size;
91
    list = ng_list_append(list, part);
92

                
93
    part = g_slice_new0(NNTPPart);
94
    strncpy((char *) part->message_id, "", sizeof(part->message_id));
95
    part->size = 258498;
96
    part->part_num = 3;
97
    *file_size += part->size;
98
    list = ng_list_append(list, part);
99

                
100
    part = g_slice_new0(NNTPPart);
101
    strncpy((char *) part->message_id, "", sizeof(part->message_id));
102
    part->size = 258448;
103
    part->part_num = 4;
104
    *file_size += part->size;
105
    list = ng_list_append(list, part);
106

                
107
    return list;
108
}
109

                
110
void
111
free_part_list(NGList *parts)
112
{
113
    NGList *list = parts;
114

                
115
    while (list) {
116
        g_slice_free(NNTPPart, list->data);
117
        list = ng_list_next(list);
118
    }
119

                
120
    ng_list_free(parts);
121
}
122

                
123
void
124
free_group_list(NGList *groups)
125
{
126
    NGList *list = groups;
127

                
128
    while (list) {
129
        g_free(list->data);
130
        list = ng_list_next(list);
131
    }
132

                
133
    ng_list_free(groups);
134
}
135

                
136
void
137
fill_queue_with_dummy_data(void)
138
{
139
    int i;
140
    char *errmsg = NULL;
141
    char *collection_name = "some collection";
142

                
143
    for (i = 1; i <= 10; i++) {
144
        char *subject;
145
        char *poster;
146
        time_t stamp;
147
        guint64 file_size = 0;
148
        NGList *list_parts;
149
        NGList *list_groups;
150

                
151
        subject = g_strdup_printf("file %i", i);
152
        poster = "some poster";
153
        stamp = 1185657196;
154

                
155
        list_parts = generate_part_list(&file_size);
156
        list_groups = ng_list_append(NULL, g_strdup("alt.binaries.x"));
157
        list_groups = ng_list_append(list_groups, g_strdup("alt.binaries.nl"));
158

                
159
        if (!download_queue_add_file_to_queue(collection_name, subject, poster, stamp, file_size, list_groups, list_parts, &errmsg)) {
160
            FAIL_TEST("Unable to add file to download queue: %s\n", errmsg);
161
            g_free(errmsg);
162
            return;
163
        }
164

                
165
        free_part_list(list_parts);
166
        free_group_list(list_groups);
167

                
168
        g_free(subject);
169
    }
170
}
171

                
172
void
173
drop_dummy_data_from_queue(void)
174
{
175
    int i;
176
    char *errmsg = NULL;
177
    char *collection_name = "some collection";
178

                
179
    for (i = 1; i <= 10; i++) {
180
        char *subject;
181

                
182
        subject = g_strdup_printf("file %i", i);
183

                
184
        if (!download_queue_del_file_from_queue(collection_name, subject, &errmsg)) {
185
            FAIL_TEST("Unable to remove file from download queue: %s\n", errmsg);
186
            g_free(errmsg);
187
            return;
188
        }
189

                
190
        g_free(subject);
191
    }
192
}
193

                
194
/* Testcases */
195
static void
196
test_download_queue_add_file_to_queue(void)
197
{
198
    char *errmsg = NULL;
199
    NGList *list_parts;
200
    NGList *list_groups;
201
    char *collection_name;
202
    char *subject;
203
    char *poster;
204
    time_t stamp;
205
    guint64 file_size = 0;
206

                
207
    GError *err = NULL;
208
    char *filename_expected;
209
    char *filename_real;
210
    char *contents_expected;
211
    char *contents_real;
212

                
213
    /* Add a single file to the download queue */
214
    collection_name = "some collection";
215
    subject = "some subject";
216
    poster = "some poster";
217
    stamp = 1185657196;
218

                
219
    list_parts = generate_part_list(&file_size);
220
    list_groups = ng_list_append(NULL, g_strdup("alt.binaries.x"));
221
    list_groups = ng_list_append(list_groups, g_strdup("alt.binaries.nl"));
222

                
223
    if (!download_queue_add_file_to_queue(collection_name, subject, poster, stamp, file_size, list_groups, list_parts, &errmsg)) {
224
        FAIL_TEST("Unable to add file to download queue: %s\n", errmsg);
225
    }
226

                
227
    free_part_list(list_parts);
228
    free_group_list(list_groups);
229

                
230
    if (!download_queue_save(&errmsg)) {
231
        FAIL_TEST("Unable to save download queue: %s\n", errmsg);
232
        g_free(errmsg);
233
        return;
234
    }
235

                
236
    /* Verify the contents of the download queue file */
237
    filename_expected = "download_queue_with_1_file.db";
238
    if (!g_file_get_contents(filename_expected, &contents_expected, NULL, &err)) {
239
        FAIL_TEST("Unable to read contents of '%s': %s\n", filename_expected, err->message);
240
        g_error_free(err);
241
        return;
242
    }
243

                
244
    filename_real = get_location_of_download_queue();
245
    if (!g_file_get_contents(filename_real, &contents_real, NULL, &err)) {
246
        FAIL_TEST("Unable to read contents of '%s': %s\n", filename_real, err->message);
247
        g_free(contents_expected);
248
        g_free(filename_real);
249
        g_error_free(err);
250
        return;
251
    }
252
    g_free(filename_real);
253

                
254
    g_assert_cmpstr(contents_expected, ==, contents_real);
255

                
256
    g_free(contents_expected);
257
    g_free(contents_real);
258
}
259

                
260
static void
261
test_download_queue_restart_file(void)
262
{
263
    char *collection_name;
264
    char *subject;
265
    char *errmsg = NULL;
266

                
267
    g_test_message("Now trying to restart file which was added in the add_item_to_queue testcase");
268
    collection_name = "some collection";
269
    subject = "some subject";
270
    if (!download_queue_restart_file(collection_name, subject, &errmsg)) {
271
        FAIL_TEST("Unable to remove file from download queue: %s\n", errmsg);
272
    }
273

                
274
    g_test_message("Now trying to restart a non-existant file");
275
    if (!download_queue_restart_file("non-existant", subject, &errmsg)) {
276
        /* This is good */
277
        g_free(errmsg);
278
    } else {
279
        FAIL_TEST("download_queue_restart_file returned TRUE, while FALSE was expected");
280
        return;
281
    }
282

                
283
    /* Verify the contents of the download queue file */
284

                
285
}
286

                
287
static void
288
test_download_queue_del_file_from_queue(void)
289
{
290
    char *collection_name;
291
    char *subject;
292
    char *errmsg = NULL;
293
    GError *err = NULL;
294
    char *filename_real;
295
    char *contents_real = NULL;
296

                
297
    g_test_message("Now trying to remove file which was added in the add_item_to_queue testcase");
298
    collection_name = "some collection";
299
    subject = "some subject";
300
    if (!download_queue_del_file_from_queue(collection_name, subject, &errmsg)) {
301
        FAIL_TEST("Unable to remove file from download queue: %s\n", errmsg);
302
        g_free(errmsg);
303
        return;
304
    }
305

                
306
    g_test_message("Now trying to remove a non-existant file");
307
    if (!download_queue_del_file_from_queue("non-existant", subject, &errmsg)) {
308
        /* This is good */
309
        g_free(errmsg);
310
    } else {
311
        FAIL_TEST("download_queue_del_file_from_queue returned TRUE, while FALSE was expected");
312
        return;
313
    }
314

                
315
    if (!download_queue_save(&errmsg)) {
316
        FAIL_TEST("Unable to save download queue: %s\n", errmsg);
317
        g_free(errmsg);
318
        return;
319
    }
320

                
321
    /* Verify the contents of the download queue file */
322
    filename_real = get_location_of_download_queue();
323
    if (!g_file_get_contents(filename_real, &contents_real, NULL, &err)) {
324
        FAIL_TEST("Unable to read contents of '%s': %s\n", filename_real, err->message);
325
        g_free(filename_real);
326
        g_error_free(err);
327
        return;
328
    }
329
    g_free(filename_real);
330

                
331
    g_assert_cmpstr("", ==, contents_real);
332

                
333
    g_free(contents_real);
334
}
335

                
336
static void
337
test_download_queue_setup_no_servers(void *data, gconstpointer user_data)
338
{
339
    g_assert(configuration_get_avail_servers(config) == NULL);
340

                
341
    fill_queue_with_dummy_data();
342
}
343

                
344
static void
345
test_download_queue_teardown_no_servers(void *data, gconstpointer user_data)
346
{
347
    g_assert(configuration_get_avail_servers(config) == NULL);
348

                
349
    drop_dummy_data_from_queue();
350
}
351

                
352
static void
353
test_download_queue_no_servers(void *data, gconstpointer user_data)
354
{
355
    NNTPCollection *collection = NULL;
356
    NNTPFile *file = NULL;
357
    NNTPPart *part = NULL;
358
    gboolean nothing_to_download = FALSE;
359

                
360
    /* There are no servers configured at the moment, so a request for the next part for server_id 0 
361
     * should return FALSE and nothing_do_download should be TRUE */
362
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download)) {
363
        g_assert_cmpint(nothing_to_download, ==, 1);
364
        g_assert(collection == NULL);
365
        g_assert(file == NULL);
366
        g_assert(part == NULL);
367
    } else {
368
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
369
    }
370
}
371

                
372
int
373
main(int argc, char **argv)
374
{
375
    int ret;
376
    char *errmsg = NULL;
377

                
378
    g_type_init();
379
    g_test_init(&argc, &argv, NULL);
380
    g_test_bug_base("https://www.nntpgrab.nl/issues/");
381

                
382
    initialize_tests();
383

                
384
    /* Base initialisation for download queue operations */
385
    if (!(config = configuration_new(&errmsg, NULL))) {
386
        g_error("Unable to initialize configuration. Unable to continue download queue tests: %s\n", errmsg);
387
    }
388

                
389
    if (!download_queue_init(config, &errmsg)) {
390
        g_error("Unable to initialize download queue. Unable to continue download queue tests: %s\n", errmsg);
391
    }
392

                
393
    /* Add the various testcases */
394
    g_test_add_func("/download_queue/add_file_to_queue", test_download_queue_add_file_to_queue);
395
    g_test_add_func("/download_queue/restart_file", test_download_queue_restart_file);
396
    g_test_add_func("/download_queue/del_file_from_queue", test_download_queue_del_file_from_queue);
397

                
398
    /* No servers */
399
    g_test_add("/download_queue/no_servers", void, NULL,
400
               test_download_queue_setup_no_servers,
401
               test_download_queue_no_servers,
402
               test_download_queue_teardown_no_servers);
403

                
404
    /* One server */
405
    g_test_add("/download_queue/one_server/before/all_available", void, NULL,
406
               test_download_queue_setup_one_server_before,
407
               test_download_queue_one_server_all_available,
408
               test_download_queue_teardown_one_server);
409
    g_test_add("/download_queue/one_server/after/all_available", void, NULL,
410
               test_download_queue_setup_one_server_after,
411
               test_download_queue_one_server_all_available,
412
               test_download_queue_teardown_one_server);
413
    g_test_add("/download_queue/one_server/before/some_available", void, NULL,
414
               test_download_queue_setup_one_server_before,
415
               test_download_queue_one_server_some_available,
416
               test_download_queue_teardown_one_server);
417
    g_test_add("/download_queue/one_server/after/some_available", void, NULL,
418
               test_download_queue_setup_one_server_after,
419
               test_download_queue_one_server_all_available,
420
               test_download_queue_teardown_one_server);
421

                
422
    /* Two servers with equal priority */
423
    g_test_add("/download_queue/two_servers_equal_prio/before/all_available_on_one", void, NULL,
424
               test_download_queue_setup_two_servers_equal_prio_before,
425
               test_download_queue_two_servers_equal_prio_all_available_on_one,
426
               test_download_queue_teardown_two_servers);
427
    g_test_add("/download_queue/two_servers_equal_prio/after/all_available_on_one", void, NULL,
428
               test_download_queue_setup_two_servers_equal_prio_after,
429
               test_download_queue_two_servers_equal_prio_all_available_on_one,
430
               test_download_queue_teardown_two_servers);
431

                
432
    g_test_add("/download_queue/two_servers_equal_prio/before/all_available_on_one/server_two_added_between", void, NULL,
433
               test_download_queue_setup_two_servers_before_one_initial,
434
               test_download_queue_two_servers_equal_prio_all_available_on_one_server_two_added_between,
435
               test_download_queue_teardown_two_servers);
436
    g_test_add("/download_queue/two_servers_equal_prio/after/all_available_on_one/server_two_added_between", void, NULL,
437
               test_download_queue_setup_two_servers_after_one_initial,
438
               test_download_queue_two_servers_equal_prio_all_available_on_one_server_two_added_between,
439
               test_download_queue_teardown_two_servers);
440

                
441
    g_test_add("/download_queue/two_servers_equal_prio/before/some_available_on_one_all_on_two", void, NULL,
442
               test_download_queue_setup_two_servers_equal_prio_before,
443
               test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two,
444
               test_download_queue_teardown_two_servers);
445
    g_test_add("/download_queue/two_servers_equal_prio/after/some_available_on_one_all_on_two", void, NULL,
446
               test_download_queue_setup_two_servers_equal_prio_after,
447
               test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two,
448
               test_download_queue_teardown_two_servers);
449

                
450
    g_test_add("/download_queue/two_servers_equal_prio/before/some_available_on_one_all_on_two/server_two_added_between", void, NULL,
451
               test_download_queue_setup_two_servers_before_one_initial,
452
               test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two_server_two_added_between,
453
               test_download_queue_teardown_two_servers);
454
    g_test_add("/download_queue/two_servers_equal_prio/after/some_available_on_one_all_on_two/server_two_added_between", void, NULL,
455
               test_download_queue_setup_two_servers_after_one_initial,
456
               test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two_server_two_added_between,
457
               test_download_queue_teardown_two_servers);
458

                
459
    g_test_add("/download_queue/two_servers_equal_prio/before/some_available_on_one_some_on_two", void, NULL,
460
               test_download_queue_setup_two_servers_equal_prio_before,
461
               test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two,
462
               test_download_queue_teardown_two_servers);
463
    g_test_add("/download_queue/two_servers_equal_prio/after/some_available_on_one_some_on_two", void, NULL,
464
               test_download_queue_setup_two_servers_equal_prio_after,
465
               test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two,
466
               test_download_queue_teardown_two_servers);
467

                
468
    g_test_add("/download_queue/two_servers_equal_prio/before/some_available_on_one_some_on_two/server_two_added_between", void, NULL,
469
               test_download_queue_setup_two_servers_before_one_initial,
470
               test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two_server_two_added_between,
471
               test_download_queue_teardown_two_servers);
472
    g_test_add("/download_queue/two_servers_equal_prio/after/some_available_on_one_some_on_two/server_two_added_between", void, NULL,
473
               test_download_queue_setup_two_servers_after_one_initial,
474
               test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two_server_two_added_between,
475
               test_download_queue_teardown_two_servers);
476

                
477
    /* Two servers with different priority */
478
    g_test_add("/download_queue/two_servers_different_prio/before/all_available_on_one", void, NULL,
479
               test_download_queue_setup_two_servers_different_prio_before,
480
               test_download_queue_two_servers_different_prio_all_available_on_one,
481
               test_download_queue_teardown_two_servers);
482
    g_test_add("/download_queue/two_servers_different_prio/after/all_available_on_one", void, NULL,
483
               test_download_queue_setup_two_servers_different_prio_after,
484
               test_download_queue_two_servers_different_prio_all_available_on_one,
485
               test_download_queue_teardown_two_servers);
486

                
487
    g_test_add("/download_queue/two_servers_different_prio/before/all_available_on_one/server_two_added_between", void, NULL,
488
               test_download_queue_setup_two_servers_before_one_initial,
489
               test_download_queue_two_servers_different_prio_all_available_on_one_server_two_added_between,
490
               test_download_queue_teardown_two_servers);
491
    g_test_add("/download_queue/two_servers_different_prio/after/all_available_on_one/server_two_added_between", void, NULL,
492
               test_download_queue_setup_two_servers_after_one_initial,
493
               test_download_queue_two_servers_different_prio_all_available_on_one_server_two_added_between,
494
               test_download_queue_teardown_two_servers);
495

                
496
    g_test_add("/download_queue/two_servers_different_prio/before/some_available_on_one_all_on_two", void, NULL,
497
               test_download_queue_setup_two_servers_different_prio_before,
498
               test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two,
499
               test_download_queue_teardown_two_servers);
500
    g_test_add("/download_queue/two_servers_different_prio/after/some_available_on_one_all_on_two", void, NULL,
501
               test_download_queue_setup_two_servers_different_prio_after,
502
               test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two,
503
               test_download_queue_teardown_two_servers);
504

                
505
    g_test_add("/download_queue/two_servers_different_prio/before/some_available_on_one_all_on_two/server_two_added_between", void, NULL,
506
               test_download_queue_setup_two_servers_before_one_initial,
507
               test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two_server_two_added_between,
508
               test_download_queue_teardown_two_servers);
509
    g_test_add("/download_queue/two_servers_different_prio/after/some_available_on_one_all_on_two/server_two_added_between", void, NULL,
510
               test_download_queue_setup_two_servers_after_one_initial,
511
               test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two_server_two_added_between,
512
               test_download_queue_teardown_two_servers);
513

                
514
    g_test_add("/download_queue/two_servers_different_prio/before/some_available_on_one_some_on_two", void, NULL,
515
               test_download_queue_setup_two_servers_different_prio_before,
516
               test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two,
517
               test_download_queue_teardown_two_servers);
518
    g_test_add("/download_queue/two_servers_different_prio/after/some_available_on_one_some_on_two", void, NULL,
519
               test_download_queue_setup_two_servers_different_prio_after,
520
               test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two,
521
               test_download_queue_teardown_two_servers);
522

                
523
    g_test_add("/download_queue/two_servers_different_prio/before/some_available_on_one_some_on_two/server_two_added_between", void, NULL,
524
               test_download_queue_setup_two_servers_before_one_initial,
525
               test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two_server_two_added_between,
526
               test_download_queue_teardown_two_servers);
527
    g_test_add("/download_queue/two_servers_different_prio/after/some_available_on_one_some_on_two/server_two_added_between", void, NULL,
528
               test_download_queue_setup_two_servers_after_one_initial,
529
               test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two_server_two_added_between,
530
               test_download_queue_teardown_two_servers);
531

                
532
    /* Perform the tests */
533
    ret = g_test_run();
534

                
535
    /* Cleanup */
536
    if (!download_queue_destroy(&errmsg)) {
537
        g_error("Unable to destroy download queue: %s\n", &errmsg);
538
    }
539

                
540
    configuration_destroy(config);
541

                
542
    cleanup_tests();
543

                
544
    return ret;
545
}