Revision 1847

trunk/nntpgrab_core/download_queue.c (revision 1847)
864 864
{
865 865
    GList *list;
866 866
    NNTPCollection *collection;
867
    int i;
867 868

                
868 869
    g_static_mutex_lock(&mutex);
869 870

                
... ...
918 919

                
919 920
            download_thread_awaken_if_needed();
920 921

                
922
            /* We can't rely on the contents of the server positions cache, so reset it */
923
            for (i = 0; i < MAX_NNTP_SERVERS; i++) {
924
                reset_server_positions(i);
925
            }
926

                
921 927
            return TRUE;
922 928
        }
923 929

                
... ...
1814 1820
    GList *list=  NULL;
1815 1821
    GList *list2 = NULL;
1816 1822
    GList *par2files = NULL;
1823
    int i;
1817 1824

                
1818 1825
    /* Only download optional PAR2 files when the intelligent PAR2 downloading feature is enabled */
1819 1826
    if (!opts.enable_intelligent_par2_downloading) {
... ...
1915 1922
        list = g_list_next(list);
1916 1923
    }
1917 1924
    g_list_free(par2files);
1925

                
1926
    /* We can't rely on the contents of the server positions cache, so reset it */
1927
    for (i = 0; i < MAX_NNTP_SERVERS; i++) {
1928
        reset_server_positions(i);
1929
    }
1918 1930
}
1919 1931

                
1920 1932
void
trunk/tests/test_download_queue_one_server.c (revision 1847)
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
void
30
test_download_queue_setup_one_server_before(void *data, gconstpointer user_data)
31
{
32
    char *errmsg = NULL;
33
    NGConfigServer server;
34

                
35
    g_assert(configuration_get_avail_servers(config) == NULL);
36

                
37
    memset(&server, 0, sizeof(server));
38
    strcpy(server.servername, "server1");
39
    strcpy(server.hostname, "host1");
40
    server.port = 119;
41
    server.enabled = TRUE;
42
    server.max_threads = 3;
43
    server.priority = SERVER_PRIORITY_HIGH;
44

                
45
    if (!configuration_add_server(config, server, &errmsg)) {
46
        FAIL_TEST("Unable to add server: %s\n", errmsg);
47
        g_free(errmsg);
48
        return;
49
    }
50

                
51
    fill_queue_with_dummy_data();
52
}
53

                
54
void
55
test_download_queue_setup_one_server_after(void *data, gconstpointer user_data)
56
{
57
    char *errmsg = NULL;
58
    NGConfigServer server;
59

                
60
    g_assert(configuration_get_avail_servers(config) == NULL);
61

                
62
    memset(&server, 0, sizeof(server));
63
    strcpy(server.servername, "server1");
64
    strcpy(server.hostname, "host1");
65
    server.port = 119;
66
    server.enabled = TRUE;
67
    server.max_threads = 1;
68
    server.priority = SERVER_PRIORITY_HIGH;
69

                
70
    fill_queue_with_dummy_data();
71

                
72
    if (!configuration_add_server(config, server, &errmsg)) {
73
        FAIL_TEST("Unable to add server: %s\n", errmsg);
74
        g_free(errmsg);
75
        return;
76
    }
77
}
78

                
79
void
80
test_download_queue_teardown_one_server(void *data, gconstpointer user_data)
81
{
82
    char *errmsg = NULL;
83

                
84
    g_assert(configuration_get_avail_servers(config) != NULL);
85

                
86
    drop_dummy_data_from_queue();
87

                
88
    if (!configuration_del_server(config, "server1", &errmsg)) {
89
        FAIL_TEST("Unable to remove server: %s\n", errmsg);
90
        g_free(errmsg);
91
        return;
92
    }
93
}
94
static void
95
test_download_queue_one_server_generic(gboolean all_available)
96
{
97
    /* There should be 10 files with 4 parts each in the download queue now */
98
    int i, j;
99

                
100
    NNTPCollection *prev_collection = NULL;
101
    NNTPFile *prev_file = NULL;
102

                
103
    NNTPCollection *collection = NULL;
104
    NNTPFile *file = NULL;
105
    NNTPPart *part = NULL;
106
    gboolean nothing_to_download_or_active = FALSE;
107

                
108
    GList *list, *files = NULL;
109

                
110
    for (i = 1; i <= 10; i++) {
111
        prev_file = NULL;
112

                
113
        for (j = 1; j <= 4; j++) {
114
            /* There is 1 server configured at the moment, so a request for the next part for server_id 0
115
             * should return TRUE and nothing_do_download should_or_active be FALSE */
116
            if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
117
                g_test_message("nothing_to_download = %i", nothing_to_download_or_active);
118
                FAIL_TEST("download_queue_get_next_part_to_download returned FALSE while it isn't expected");
119
                return;
120
            } else {
121
                char *expected_subject = g_strdup_printf("file %i", i);
122

                
123
                g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
124
                g_assert(collection != NULL);
125
                g_assert(file != NULL);
126
                g_assert(part != NULL);
127

                
128
                g_assert_cmpint(part->part_num, ==, j);
129
                g_assert_cmpstr(file->subject, ==, expected_subject);
130

                
131
                g_free(expected_subject);
132

                
133
                if (prev_collection == NULL) {
134
                    prev_collection = collection;
135
                } else {
136
                    g_assert(prev_collection == collection);
137
                }
138

                
139
                if (prev_file == NULL) {
140
                    prev_file = file;
141
                    files = g_list_append(files, file);
142
                } else {
143
                    g_assert(prev_file == file);
144
                }
145
            }
146

                
147
            /* Update the status of the part */
148
            if (!all_available && j % 2 == 0) {
149
                /* Indicate the every second part isn't available on the server and it shouldn't be retried again */
150
                download_queue_update_part_status("server1", 0, collection, file, part, 0, FALSE, FALSE, TRUE);
151
            } else {
152
                /* Indicate that the file was downloaded succesfully */
153
                download_queue_update_part_status("server1", 0, collection, file, part, 0, TRUE, FALSE, FALSE);
154
            }
155

                
156
            collection = NULL;
157
            file = NULL;
158
            part = NULL;
159
        }
160
    }
161

                
162
    /* We processed all files now. If we try to request another part it should indicate that there's nothing to download anymore */
163
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
164
        /* Nothing is returned which is good */
165
        /* The flag nothing_to_download_or_active should be FALSE as all files are downloaded, but not decoded yet */
166
        g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
167
        g_assert(collection == NULL);
168
        g_assert(file == NULL);
169
        g_assert(part == NULL);
170
    } else {
171
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
172
        return;
173
    }
174

                
175
    /* Mark all files as finished (downloaded+decoded) */
176
    list = files;
177
    while (list) {
178
        file = (NNTPFile*) list->data;
179

                
180
        if (!all_available && g_list_index(files, file) % 2 == 0) {
181
            /* Indicate that not all parts were available */
182
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_INCOMPLETE);
183
        } else {
184
            /* Indicate that all parts were decoded succesfully */
185
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_COMPLETE);
186
        }
187

                
188
        list = g_list_next(list);
189
    }
190
    g_list_free(files);
191

                
192
    /* Verify that nothing_to_download_or_active is TRUE now */
193
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
194
        /* Nothing is returned which is good */
195
        g_assert_cmpint(nothing_to_download_or_active, ==, TRUE);
196
        g_assert(collection == NULL);
197
        g_assert(file == NULL);
198
        g_assert(part == NULL);
199
    } else {
200
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
201
        return;
202
    }
203
}
204

                
205
void
206
test_download_queue_one_server_all_available(void *data, gconstpointer user_data)
207
{
208
    /* Assume for this testcase that all parts are available on the server */
209
    test_download_queue_one_server_generic(TRUE);
210
}
211

                
212
void
213
test_download_queue_one_server_some_available(void *data, gconstpointer user_data)
214
{
215
    /* Assume for this testcase that some parts are available on the server */
216
    test_download_queue_one_server_generic(FALSE);
217
}
trunk/tests/test_download_queue.c (revision 1847)
21 21
#include 
22 22

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

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

                
27
static Configuration *config = NULL;
28

                
29 29
/* Fake placeholders */
30 30
void
31 31
ng_plugin_emit_log_msg(NGPlugin *plugin_data, NGLogLevel log_level, const char *format, ...)
... ...
133 133
    ng_list_free(groups);
134 134
}
135 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

                
136 194
/* Testcases */
137 195
static void
138 196
test_download_queue_add_file_to_queue(void)
... ...
276 334
}
277 335

                
278 336
static void
279
test_download_queue_get_next_part_to_download_setup(void *data, gconstpointer user_data)
337
test_download_queue_setup_no_servers(void *data, gconstpointer user_data)
280 338
{
281
    int i;
282
    char *errmsg = NULL;
283
    char *collection_name = "some collection";
284

                
285
    for (i = 1; i <= 10; i++) {
286
        char *subject;
287
        char *poster;
288
        time_t stamp;
289
        guint64 file_size = 0;
290
        NGList *list_parts;
291
        NGList *list_groups;
292

                
293
        subject = g_strdup_printf("file %i", i);
294
        poster = "some poster";
295
        stamp = 1185657196;
296

                
297
        list_parts = generate_part_list(&file_size);
298
        list_groups = ng_list_append(NULL, g_strdup("alt.binaries.x"));
299
        list_groups = ng_list_append(list_groups, g_strdup("alt.binaries.nl"));
300

                
301
        if (!download_queue_add_file_to_queue(collection_name, subject, poster, stamp, file_size, list_groups, list_parts, &errmsg)) {
302
            FAIL_TEST("Unable to add file to download queue: %s\n", errmsg);
303
            g_free(errmsg);
304
            return;
305
        }
306

                
307
        free_part_list(list_parts);
308
        free_group_list(list_groups);
309

                
310
        g_free(subject);
311
    }
312
}
313

                
314
static void
315
test_download_queue_get_next_part_to_download_setup_no_servers(void *data, gconstpointer user_data)
316
{
317 339
    g_assert(configuration_get_avail_servers(config) == NULL);
318 340

                
319
    test_download_queue_get_next_part_to_download_setup(data, user_data);
341
    fill_queue_with_dummy_data();
320 342
}
321 343

                
322 344
static void
323
test_download_queue_get_next_part_to_download_setup_one_server_before(void *data, gconstpointer user_data)
345
test_download_queue_teardown_no_servers(void *data, gconstpointer user_data)
324 346
{
325
    char *errmsg = NULL;
326
    NGConfigServer server;
327

                
328 347
    g_assert(configuration_get_avail_servers(config) == NULL);
329 348

                
330
    memset(&server, 0, sizeof(server));
331
    strcpy(server.servername, "server1");
332
    strcpy(server.hostname, "host1");
333
    server.port = 119;
334
    server.enabled = TRUE;
335
    server.max_threads = 3;
336

                
337
    if (!configuration_add_server(config, server, &errmsg)) {
338
        FAIL_TEST("Unable to add server: %s\n", errmsg);
339
        g_free(errmsg);
340
        return;
341
    }
342

                
343
    test_download_queue_get_next_part_to_download_setup(data, user_data);
349
    drop_dummy_data_from_queue();
344 350
}
345 351

                
346 352
static void
347
test_download_queue_get_next_part_to_download_setup_one_server_after(void *data, gconstpointer user_data)
353
test_download_queue_no_servers(void *data, gconstpointer user_data)
348 354
{
349
    char *errmsg = NULL;
350
    NGConfigServer server;
351

                
352
    g_assert(configuration_get_avail_servers(config) == NULL);
353

                
354
    memset(&server, 0, sizeof(server));
355
    strcpy(server.servername, "server1");
356
    strcpy(server.hostname, "host1");
357
    server.port = 119;
358
    server.enabled = TRUE;
359
    server.max_threads = 1;
360

                
361
    test_download_queue_get_next_part_to_download_setup(data, user_data);
362

                
363
    if (!configuration_add_server(config, server, &errmsg)) {
364
        FAIL_TEST("Unable to add server: %s\n", errmsg);
365
        g_free(errmsg);
366
        return;
367
    }
368
}
369

                
370
static void
371
test_download_queue_get_next_part_to_download_teardown(void *data, gconstpointer user_data)
372
{
373
    int i;
374
    char *errmsg = NULL;
375
    char *collection_name = "some collection";
376

                
377
    for (i = 1; i <= 10; i++) {
378
        char *subject;
379

                
380
        subject = g_strdup_printf("file %i", i);
381

                
382
        if (!download_queue_del_file_from_queue(collection_name, subject, &errmsg)) {
383
            FAIL_TEST("Unable to remove file from download queue: %s\n", errmsg);
384
            g_free(errmsg);
385
            return;
386
        }
387

                
388
        g_free(subject);
389
    }
390
}
391

                
392
static void
393
test_download_queue_get_next_part_to_download_teardown_no_servers(void *data, gconstpointer user_data)
394
{
395
    g_assert(configuration_get_avail_servers(config) == NULL);
396

                
397
    test_download_queue_get_next_part_to_download_teardown(data, user_data);
398
}
399

                
400
static void
401
test_download_queue_get_next_part_to_download_teardown_one_server(void *data, gconstpointer user_data)
402
{
403
    char *errmsg = NULL;
404

                
405
    g_assert(configuration_get_avail_servers(config) != NULL);
406

                
407
    test_download_queue_get_next_part_to_download_teardown(data, user_data);
408

                
409
    if (!configuration_del_server(config, "server1", &errmsg)) {
410
        FAIL_TEST("Unable to remove server: %s\n", errmsg);
411
        g_free(errmsg);
412
        return;
413
    }
414
}
415

                
416
static void
417
test_download_queue_get_next_part_to_download_no_servers(void *data, gconstpointer user_data)
418
{
419 355
    NNTPCollection *collection = NULL;
420 356
    NNTPFile *file = NULL;
421 357
    NNTPPart *part = NULL;
... ...
433 369
    }
434 370
}
435 371

                
436
static void
437
test_download_queue_get_next_part_to_download_one_server_generic(gboolean all_available)
438
{
439
    /* There should be 10 files with 4 parts each in the download queue now */
440
    int i, j;
441

                
442
    NNTPCollection *prev_collection = NULL;
443
    NNTPFile *prev_file = NULL;
444

                
445
    NNTPCollection *collection = NULL;
446
    NNTPFile *file = NULL;
447
    NNTPPart *part = NULL;
448
    gboolean nothing_to_download_or_active = FALSE;
449

                
450
    GList *list, *files = NULL;
451

                
452
    for (i = 1; i <= 10; i++) {
453
        prev_file = NULL;
454

                
455
        for (j = 1; j <= 4; j++) {
456
            /* There 1 server configured at the moment, so a request for the next part for server_id 0
457
             * should return TRUE and nothing_do_download should_or_active be FALSE */
458
            if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
459
                g_test_message("nothing_to_download = %i", nothing_to_download_or_active);
460
                FAIL_TEST("download_queue_get_next_part_to_download returned FALSE while it isn't expected");
461
                return;
462
            } else {
463
                char *expected_subject = g_strdup_printf("file %i", i);
464

                
465
                g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
466
                g_assert(collection != NULL);
467
                g_assert(file != NULL);
468
                g_assert(part != NULL);
469

                
470
                g_assert_cmpint(part->part_num, ==, j);
471
                g_assert_cmpstr(file->subject, ==, expected_subject);
472

                
473
                g_free(expected_subject);
474

                
475
                if (prev_collection == NULL) {
476
                    prev_collection = collection;
477
                } else {
478
                    g_assert(prev_collection == collection);
479
                }
480

                
481
                if (prev_file == NULL) {
482
                    prev_file = file;
483
                    files = g_list_append(files, file);
484
                } else {
485
                    g_assert(prev_file == file);
486
                }
487
            }
488

                
489
            /* Update the status of the part */
490
            if (!all_available && j % 2 == 0) {
491
                /* Indicate the every second part isn't available on the server and it shouldn't be retried again */
492
                download_queue_update_part_status("server1", 0, collection, file, part, 0, FALSE, FALSE, TRUE);
493
            } else {
494
                /* Indicate that the file was downloaded succesfully */
495
                download_queue_update_part_status("server1", 0, collection, file, part, 0, TRUE, FALSE, FALSE);
496
            }
497

                
498
            collection = NULL;
499
            file = NULL;
500
            part = NULL;
501
        }
502
    }
503

                
504
    /* We processed all files now. If we try to request another part it should indicate that there's nothing to download anymore */
505
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
506
        /* Nothing is returned which is good */
507
        /* The flag nothing_to_download_or_active should be FALSE as all files are downloaded, but not decoded yet */
508
        g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
509
        g_assert(collection == NULL);
510
        g_assert(file == NULL);
511
        g_assert(part == NULL);
512
    } else {
513
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
514
        return;
515
    }
516

                
517
    /* Mark all files as finished (downloaded+decoded) */
518
    list = files;
519
    while (list) {
520
        file = (NNTPFile*) list->data;
521

                
522
        if (!all_available && g_list_index(files, file) % 2 == 0) {
523
            /* Indicate that not all parts were available */
524
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_INCOMPLETE);
525
        } else {
526
            /* Indicate that all parts were decoded succesfully */
527
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_COMPLETE);
528
        }
529

                
530
        list = g_list_next(list);
531
    }
532
    g_list_free(files);
533

                
534
    /* Verify that nothing_to_download_or_active is TRUE now */
535
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
536
        /* Nothing is returned which is good */
537
        g_assert_cmpint(nothing_to_download_or_active, ==, TRUE);
538
        g_assert(collection == NULL);
539
        g_assert(file == NULL);
540
        g_assert(part == NULL);
541
    } else {
542
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
543
        return;
544
    }
545
}
546

                
547
static void
548
test_download_queue_get_next_part_to_download_one_server_all_available(void *data, gconstpointer user_data)
549
{
550
    /* Assume for this testcase that all parts are available on the server */
551
    test_download_queue_get_next_part_to_download_one_server_generic(TRUE);
552
}
553

                
554
static void
555
test_download_queue_get_next_part_to_download_one_server_some_available(void *data, gconstpointer user_data)
556
{
557
    /* Assume for this testcase that some parts are available on the server */
558
    test_download_queue_get_next_part_to_download_one_server_generic(FALSE);
559
}
560

                
561 372
int
562 373
main(int argc, char **argv)
563 374
{
... ...
583 394
    g_test_add_func("/download_queue/add_file_to_queue", test_download_queue_add_file_to_queue);
584 395
    g_test_add_func("/download_queue/restart_file", test_download_queue_restart_file);
585 396
    g_test_add_func("/download_queue/del_file_from_queue", test_download_queue_del_file_from_queue);
586
    g_test_add("/download_queue/get_next_part_to_download/no_servers", void, NULL,
587
               test_download_queue_get_next_part_to_download_setup_no_servers,
588
               test_download_queue_get_next_part_to_download_no_servers,
589
               test_download_queue_get_next_part_to_download_teardown_no_servers);
590
    g_test_add("/download_queue/get_next_part_to_download/one_server/before/all_available", void, NULL,
591
               test_download_queue_get_next_part_to_download_setup_one_server_before,
592
               test_download_queue_get_next_part_to_download_one_server_all_available,
593
               test_download_queue_get_next_part_to_download_teardown_one_server);
594
    g_test_add("/download_queue/get_next_part_to_download/one_server/after/all_available", void, NULL,
595
               test_download_queue_get_next_part_to_download_setup_one_server_after,
596
               test_download_queue_get_next_part_to_download_one_server_all_available,
597
               test_download_queue_get_next_part_to_download_teardown_one_server);
598
    g_test_add("/download_queue/get_next_part_to_download/one_server/before/some_available", void, NULL,
599
               test_download_queue_get_next_part_to_download_setup_one_server_before,
600
               test_download_queue_get_next_part_to_download_one_server_some_available,
601
               test_download_queue_get_next_part_to_download_teardown_one_server);
602
    g_test_add("/download_queue/get_next_part_to_download/one_server/after/some_available", void, NULL,
603
               test_download_queue_get_next_part_to_download_setup_one_server_after,
604
               test_download_queue_get_next_part_to_download_one_server_all_available,
605
               test_download_queue_get_next_part_to_download_teardown_one_server);
606 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

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

                
trunk/tests/test_download_queue_two_servers.c (revision 1847)
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
static void
30
add_servers(gboolean add_server_before, gboolean equal_priority)
31
{
32
    char *errmsg = NULL;
33
    NGConfigServer server;
34

                
35
    g_assert(configuration_get_avail_servers(config) == NULL);
36

                
37
    if (!add_server_before) fill_queue_with_dummy_data();
38

                
39
    memset(&server, 0, sizeof(server));
40
    strcpy(server.servername, "server1");
41
    strcpy(server.hostname, "host1");
42
    server.port = 119;
43
    server.enabled = TRUE;
44
    server.max_threads = 3;
45
    server.priority = SERVER_PRIORITY_HIGH;
46

                
47
    if (!configuration_add_server(config, server, &errmsg)) {
48
        FAIL_TEST("Unable to add server: %s\n", errmsg);
49
        g_free(errmsg);
50
        return;
51
    }
52

                
53
    memset(&server, 0, sizeof(server));
54
    strcpy(server.servername, "server2");
55
    strcpy(server.hostname, "host2");
56
    server.port = 119;
57
    server.enabled = TRUE;
58
    server.max_threads = 3;
59
    server.priority = (equal_priority ? SERVER_PRIORITY_HIGH : SERVER_PRIORITY_NORMAL);
60

                
61
    if (!configuration_add_server(config, server, &errmsg)) {
62
        FAIL_TEST("Unable to add server: %s\n", errmsg);
63
        g_free(errmsg);
64
        return;
65
    }
66

                
67
    if (add_server_before) fill_queue_with_dummy_data();
68
}
69

                
70
void
71
test_download_queue_setup_two_servers_equal_prio_before(void *data, gconstpointer user_data)
72
{
73
    add_servers(TRUE, TRUE);
74
}
75

                
76
void
77
test_download_queue_setup_two_servers_different_prio_before(void *data, gconstpointer user_data)
78
{
79
    add_servers(TRUE, FALSE);
80
}
81

                
82
void
83
test_download_queue_setup_two_servers_equal_prio_after(void *data, gconstpointer user_data)
84
{
85
    add_servers(FALSE, TRUE);
86
}
87

                
88
void
89
test_download_queue_setup_two_servers_different_prio_after(void *data, gconstpointer user_data)
90
{
91
    add_servers(FALSE, FALSE);
92
}
93

                
94
void
95
test_download_queue_setup_two_servers_before_one_initial(void *data, gconstpointer user_data)
96
{
97
    test_download_queue_setup_one_server_before(data, user_data);
98
}
99

                
100
void
101
test_download_queue_setup_two_servers_after_one_initial(void *data, gconstpointer user_data)
102
{
103
    test_download_queue_setup_one_server_after(data, user_data);
104
}
105

                
106
void
107
test_download_queue_teardown_two_servers(void *data, gconstpointer user_data)
108
{
109
    char *errmsg = NULL;
110

                
111
    g_assert(configuration_get_avail_servers(config) != NULL);
112

                
113
    drop_dummy_data_from_queue();
114

                
115
    if (!configuration_del_server(config, "server2", &errmsg)) {
116
        FAIL_TEST("Unable to remove server: %s\n", errmsg);
117
        g_free(errmsg);
118
        return;
119
    }
120

                
121
    if (!configuration_del_server(config, "server1", &errmsg)) {
122
        FAIL_TEST("Unable to remove server: %s\n", errmsg);
123
        g_free(errmsg);
124
        return;
125
    }
126
}
127
static void
128
test_download_queue_two_servers_generic(gboolean all_available_on_one, gboolean all_available_on_two, gboolean equal_priority, gboolean server_added_between)
129
{
130
    /* There should be 10 files with 4 parts each in the download queue now */
131
    int i, server_id;
132
    int num_iterations, num_iterations_server1, num_servers;
133

                
134
    NNTPCollection *prev_collection = NULL;
135
    NNTPFile *prev_file = NULL;
136

                
137
    NNTPCollection *collection = NULL;
138
    NNTPFile *file = NULL;
139
    NNTPPart *part = NULL;
140
    gboolean nothing_to_download_or_active = FALSE;
141
    gboolean task_returned;
142

                
143
    gboolean server2_available = !server_added_between;
144
    GList *list, *files = NULL;
145

                
146
    if (equal_priority && all_available_on_one) {
147
        num_iterations = 40;
148
    } else if (equal_priority && !all_available_on_one) {
149
        num_iterations = 54;
150
    } else {
151
        num_iterations = 80;
152
    }
153

                
154
    num_iterations_server1 = 0;
155
    num_servers = (server_added_between ? 1 : 2);
156

                
157
    g_test_message("Num iterations for this testcase = %i", num_iterations);
158
    g_test_message("Server2 available = %i", server2_available);
159

                
160
    for (i = 0; i < num_iterations; i++) {
161
        g_test_message("Iteration %i", i);
162

                
163
        /* Try server 1 first, then server 2 (if it's available), then server 1, etc */
164
        if (num_iterations_server1 == 40) {     /* Don't try to consult server 1 anymore once it has been tried for all files+parts */
165
            server_id = 1;
166
        } else if (server2_available) {
167
            server_id = i % 2;
168
        } else {
169
            server_id = 0;
170
        }
171

                
172
        task_returned = download_queue_get_next_part_to_download(&collection, &file, &part, server_id, ¬hing_to_download_or_active);
173
        if (!task_returned) {
174
            if (server_id == 1) {
175
                /* This is okay */
176
                /* TODO: Implement */
177
                g_test_message("Nothing was returned for server_id %i", server_id);
178
                continue;
179
            } else {
180
                g_test_message("i = %i", i);
181
                g_test_message("server_id = %i", server_id);
182
                g_test_message("nothing_to_download = %i", nothing_to_download_or_active);
183
                FAIL_TEST("download_queue_get_next_part_to_download returned FALSE while it isn't expected");
184
                return;
185
            }
186
        } else {
187
            g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
188
            g_assert(collection != NULL);
189
            g_assert(file != NULL);
190
            g_assert(part != NULL);
191

                
192
            if (equal_priority) {
193
                if (all_available_on_one) {
194
                    char *expected_subject = g_strdup_printf("file %i", (int) (i / 4) + 1);
195
                    g_assert_cmpint(part->part_num, ==, (i % 4) + 1);
196
                    g_assert_cmpstr(file->subject, ==, expected_subject);
197
                    g_free(expected_subject);
198
                } else {
199
                    /* The first server has marked each 2nd file as being unavailable so it will
200
                     * be retried by the second server */
201
                    /* TODO: Implement */
202
                }
203
            } else {
204
                /* TODO: Implement */
205
            }
206

                
207
            if (prev_collection == NULL) {
208
                prev_collection = collection;
209
            } else {
210
                g_assert(prev_collection == collection);
211
            }
212

                
213
            if (prev_file != file) {
214
                prev_file = file;
215
                files = g_list_append(files, file);
216
            }
217
        }
218

                
219
        /* Update the status of the part */
220
        if ((server_id == 0 && !all_available_on_one && num_iterations_server1 % 2 == 0) ||
221
             (server_id == 1 && !all_available_on_two && i % 4 == 0)) {
222

                
223
            /* Indicate the every second part isn't available on the server and it shouldn't be retried again */
224
            g_test_message("Subject '%s' part %i was marked as being unavailable for server_id %i", file->subject, part->part_num, server_id);
225
            download_queue_update_part_status("dummy", 0, collection, file, part, server_id, FALSE, FALSE, TRUE);
226
        } else {
227
            /* Indicate that the file was downloaded succesfully */
228
            g_test_message("Subject '%s' part %i was marked as download successfully for server_id %i", file->subject, part->part_num, server_id);
229
            download_queue_update_part_status("dummy", 0, collection, file, part, server_id, TRUE, FALSE, FALSE);
230
        }
231

                
232
        /* If we're halfway, add a new server if necessary */
233
        if (server_added_between && i == 10) {
234
            char *errmsg = NULL;
235
            NGConfigServer server;
236

                
237
            memset(&server, 0, sizeof(server));
238
            strcpy(server.servername, "server2");
239
            strcpy(server.hostname, "host2");
240
            server.port = 119;
241
            server.enabled = TRUE;
242
            server.max_threads = 1;
243

                
244
            if (!configuration_add_server(config, server, &errmsg)) {
245
                FAIL_TEST("Unable to add server: %s\n", errmsg);
246
                g_free(errmsg);
247
                return;
248
            }
249
        }
250

                
251
        if (server_id == 0) {
252
            num_iterations_server1++;
253
        }
254
    }
255

                
256
    /* We processed all files now. If we try to request another part it should indicate that there's nothing to download anymore */
257
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
258
        /* Nothing is returned which is good */
259
        /* The flag nothing_to_download_or_active should be FALSE as all files are downloaded, but not decoded yet */
260
        g_assert_cmpint(nothing_to_download_or_active, ==, FALSE);
261
        g_assert(collection == NULL);
262
        g_assert(file == NULL);
263
        g_assert(part == NULL);
264
    } else {
265
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
266
        return;
267
    }
268

                
269
    /* Mark all files as finished (downloaded+decoded) */
270
    list = files;
271
    while (list) {
272
        file = (NNTPFile*) list->data;
273

                
274
        if (!all_available_on_one && g_list_index(files, file) % 2 == 0) {
275
            /* Indicate that not all parts were available */
276
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_INCOMPLETE);
277
        } else {
278
            /* Indicate that all parts were decoded succesfully */
279
            download_queue_mark_file_as_decoded_and_unref(prev_collection, file, "somefilename", TASK_STATE_FINISHED_COMPLETE);
280
        }
281

                
282
        list = g_list_next(list);
283
    }
284
    g_list_free(files);
285

                
286
    /* Verify that nothing_to_download_or_active is TRUE now */
287
    if (!download_queue_get_next_part_to_download(&collection, &file, &part, 0, ¬hing_to_download_or_active)) {
288
        /* Nothing is returned which is good */
289
        g_assert_cmpint(nothing_to_download_or_active, ==, TRUE);
290
        g_assert(collection == NULL);
291
        g_assert(file == NULL);
292
        g_assert(part == NULL);
293
    } else {
294
        FAIL_TEST("download_queue_get_next_part_to_download returned TRUE while it isn't expected");
295
        return;
296
    }
297
}
298

                
299
void
300
test_download_queue_two_servers_equal_prio_all_available_on_one(void *data, gconstpointer user_data)
301
{
302
    /* Assume for this testcase that all parts are available on server one.
303
     * Both servers have an equal priority */
304
    test_download_queue_two_servers_generic(TRUE, FALSE, TRUE, FALSE);
305
}
306

                
307
void
308
test_download_queue_two_servers_equal_prio_all_available_on_one_server_two_added_between(void *data, gconstpointer user_data)
309
{
310
    /* Assume for this testcase that all parts are available on server one
311
     * and that a new server is added halfway. Both servers have an equal priority */
312
    test_download_queue_two_servers_generic(TRUE, FALSE, TRUE, TRUE);
313
}
314

                
315
void
316
test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two(void *data, gconstpointer user_data)
317
{
318
    /* Assume for this testcase that some parts are available on server one
319
     * and the rest is all available on server two. Both servers have an equal priority */
320
    test_download_queue_two_servers_generic(FALSE, TRUE, TRUE, FALSE);
321
}
322

                
323
void
324
test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two_server_two_added_between(void *data, gconstpointer user_data)
325
{
326
    /* Assume for this testcase that some parts are available on server one
327
     * and the rest is available on server two which is added halfway.
328
     * Both servers have an equal priority */
329
    test_download_queue_two_servers_generic(FALSE, TRUE, TRUE, TRUE);
330
}
331

                
332
void
333
test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two(void *data, gconstpointer user_data)
334
{
335
    /* Assume for this testcase that some parts are available on server one
336
     * and some are available on server two. Both servers have an equal priority */
337
    test_download_queue_two_servers_generic(FALSE, FALSE, TRUE, FALSE);
338
}
339

                
340
void
341
test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two_server_two_added_between(void *data, gconstpointer user_data)
342
{
343
    /* Assume for this testcase that some parts are available on server one
344
     * and some are available on server two which is added halfway.
345
     * Both servers have an equal priority */
346
    test_download_queue_two_servers_generic(FALSE, FALSE, TRUE, TRUE);
347
}
348

                
349
void
350
test_download_queue_two_servers_different_prio_all_available_on_one(void *data, gconstpointer user_data)
351
{
352
    /* Assume for this testcase that all parts are available on server one.
353
     * Both servers have a different priority */
354
    test_download_queue_two_servers_generic(TRUE, FALSE, FALSE, FALSE);
355
}
356

                
357
void
358
test_download_queue_two_servers_different_prio_all_available_on_one_server_two_added_between(void *data, gconstpointer user_data)
359
{
360
    /* Assume for this testcase that all parts are available on server one
361
     * and that a new server is added halfway. Both servers have a different priority */
362
    test_download_queue_two_servers_generic(TRUE, FALSE, FALSE, TRUE);
363
}
364

                
365
void
366
test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two(void *data, gconstpointer user_data)
367
{
368
    /* Assume for this testcase that some parts are available on server one
369
     * and the rest is all available on server two. Both servers have a different priority */
370
    test_download_queue_two_servers_generic(FALSE, TRUE, FALSE, FALSE);
371
}
372

                
373
void
374
test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two_server_two_added_between(void *data, gconstpointer user_data)
375
{
376
    /* Assume for this testcase that some parts are available on server one
377
     * and the rest is available on server two which is added halfway.
378
     * Both servers have a different priority */
379
    test_download_queue_two_servers_generic(FALSE, TRUE, FALSE, TRUE);
380
}
381

                
382
void
383
test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two(void *data, gconstpointer user_data)
384
{
385
    /* Assume for this testcase that some parts are available on server one
386
     * and some are available on server two. Both servers have a different priority */
387
    test_download_queue_two_servers_generic(FALSE, FALSE, FALSE, FALSE);
388
}
389

                
390
void
391
test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two_server_two_added_between(void *data, gconstpointer user_data)
392
{
393
    /* Assume for this testcase that some parts are available on server one
394
     * and some are available on server two which is added halfway.
395
     * Both servers have a different priority */
396
    test_download_queue_two_servers_generic(FALSE, FALSE, FALSE, TRUE);
397
}
trunk/tests/test_download_queue.h (revision 1847)
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
#ifndef _TEST_DOWNLOAD_QUEUE_H_
20
#define _TEST_DOWNLOAD_QUEUE_H_
21

                
22
/* test_download_queue.c */
23
void fill_queue_with_dummy_data(void);
24
void drop_dummy_data_from_queue(void);
25

                
26
/* test_download_queue_one_server.c */
27
void test_download_queue_setup_one_server_before(void *data, gconstpointer user_data);
28
void test_download_queue_setup_one_server_after(void *data, gconstpointer user_data);
29
void test_download_queue_teardown_one_server(void *data, gconstpointer user_data);
30

                
31
void test_download_queue_one_server_all_available(void *data, gconstpointer user_data);
32
void test_download_queue_one_server_some_available(void *data, gconstpointer user_data);
33

                
34
/* test_download_queue_two_servers.c */
35
void test_download_queue_setup_two_servers_equal_prio_before(void *data, gconstpointer user_data);
36
void test_download_queue_setup_two_servers_equal_prio_after(void *data, gconstpointer user_data);
37

                
38
void test_download_queue_setup_two_servers_different_prio_before(void *data, gconstpointer user_data);
39
void test_download_queue_setup_two_servers_different_prio_after(void *data, gconstpointer user_data);
40

                
41
void test_download_queue_setup_two_servers_before_one_initial(void *data, gconstpointer user_data);
42
void test_download_queue_setup_two_servers_after_one_initial(void *data, gconstpointer user_data);
43

                
44
void test_download_queue_teardown_two_servers(void *data, gconstpointer user_data);
45

                
46
void test_download_queue_two_servers_equal_prio_all_available_on_one(void *data, gconstpointer user_data);
47
void test_download_queue_two_servers_equal_prio_all_available_on_one_server_two_added_between(void *data, gconstpointer user_data);
48

                
49
void test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two(void *data, gconstpointer user_data);
50
void test_download_queue_two_servers_equal_prio_some_available_on_one_all_on_two_server_two_added_between(void *data, gconstpointer user_data);
51

                
52
void test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two(void *data, gconstpointer user_data);
53
void test_download_queue_two_servers_equal_prio_some_available_on_one_some_on_two_server_two_added_between(void *data, gconstpointer user_data);
54

                
55
void test_download_queue_two_servers_different_prio_all_available_on_one(void *data, gconstpointer user_data);
56
void test_download_queue_two_servers_different_prio_all_available_on_one_server_two_added_between(void *data, gconstpointer user_data);
57

                
58
void test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two(void *data, gconstpointer user_data);
59
void test_download_queue_two_servers_different_prio_some_available_on_one_all_on_two_server_two_added_between(void *data, gconstpointer user_data);
60

                
61
void test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two(void *data, gconstpointer user_data);
62
void test_download_queue_two_servers_different_prio_some_available_on_one_some_on_two_server_two_added_between(void *data, gconstpointer user_data);
63

                
64
#endif /* _TEST_DOWNLOAD_QUEUE_H_ */
trunk/tests/common.c (revision 1847)
28 28
#include 
29 29
#endif
30 30

                
31
#include "common.h"
32

                
33
Configuration *config = NULL;
34

                
31 35
static char *
32 36
generate_tmpdir(void)
33 37
{
trunk/tests/Makefile.am (revision 1847)
66 66
test_download_queue_CFLAGS = -DDOWNLOAD_QUEUE_DONT_SET_TMP_FILENAME
67 67
test_download_queue_LDADD = $(GLIB_LIBS) $(top_srcdir)/base/libnntpgrab_utils.la
68 68
test_download_queue_SOURCES =  test_download_queue.c \
69
                               test_download_queue_one_server.c \
70
                               test_download_queue_two_servers.c \
69 71
                               common.c \
70 72
                               $(top_srcdir)/nntpgrab_core/core_signals.c \
71 73
                               $(top_srcdir)/nntpgrab_core/collection_alloc.c \
... ...
75 77

                
76 78
TEST_PROGS += test_nzbcreator test_nntpconnection_backend test_jsonrpc test_download_queue
77 79

                
80
noinst_HEADERS = common.h test_download_queue.h
trunk/tests/common.h (revision 1847)
19 19
#ifndef _TESTS_COMMON_H_
20 20
#define _TESTS_COMMON_H_
21 21

                
22
#include "configuration.h"
23

                
22 24
void initialize_tests(void);
23 25
void cleanup_tests(void);
24 26
char *get_location_of_download_queue(void);
... ...
32 34
    g_error(format, ## args);
33 35
#endif
34 36

                
37
extern Configuration *config;
38

                
35 39
#endif /* _TESTS_COMMON_H_ */
trunk/po/fr.po (revision 1847)
7 7
msgstr ""
8 8
"Project-Id-Version: nntpgrab 0.2.90\n"
9 9
"Report-Msgid-Bugs-To: \n"
10
"POT-Creation-Date: 2011-06-25 15:40+0200\n"
10
"POT-Creation-Date: 2011-07-08 18:11+0200\n"
11 11
"PO-Revision-Date: 2009-10-07 07:43+0100\n"
12 12
"Last-Translator: \n"
13 13
"Language-Team: French\n"
... ...
1657 1657
"configuration_save(): Erreur lors de l'ouverture du fichier '%s'\n"
1658 1658
"%s"
1659 1659

                
1660
#: ../nntpgrab_core/decoder_thread.c:55
1660
#: ../nntpgrab_core/decoder_thread.c:54
1661 1661
#, c-format
1662 1662
msgid "Trying to decode file with from collection '%s' with subject = '%s'"
1663 1663
msgstr ""
1664 1664
"Tentative de décodage du fichier de la collection '%s' ayant pour sujet = "
1665 1665
"'%s'"
1666 1666

                
1667
#: ../nntpgrab_core/decoder_thread.c:59
1667
#: ../nntpgrab_core/decoder_thread.c:58
1668 1668
#, c-format
1669 1669
msgid "Decoder returned %i"
1670 1670
msgstr "Le décodeur a retourné %i"
1671 1671

                
1672
#: ../nntpgrab_core/decoder_thread.c:139
1672
#: ../nntpgrab_core/decoder_thread.c:111
1673 1673
#, c-format
1674 1674
msgid "Unknown decode error occured, %s (%i)"
1675 1675
msgstr "Une erreur inconnue est survenue lors du décodage, %s (%i)"
1676 1676

                
1677
#: ../nntpgrab_core/download_queue.c:569
1677
#: ../nntpgrab_core/download_queue.c:881
1678 1678
#, c-format
1679 1679
msgid "There already is a file with subject '%s' part of collection '%s'"
1680 1680
msgstr ""
1681 1681
"Il existe déjà un fichier avec le sujet '%s' qui fait partie de la "
1682 1682
"collection '%s'"
1683 1683

                
1684
#: ../nntpgrab_core/download_queue.c:979
1685
#: ../nntpgrab_core/download_queue.c:1119
1684
#: ../nntpgrab_core/download_queue.c:1293
1685
#: ../nntpgrab_core/download_queue.c:1440
1686 1686
#, c-format
1687 1687
msgid "Subject '%s' was not found in collection '%s'"
1688 1688
msgstr "Le sujet '%s' n'a pu être trouvé dans la collection '%s'"
1689 1689

                
1690
#: ../nntpgrab_core/download_queue.c:1445
1690
#: ../nntpgrab_core/download_queue.c:1759
1691 1691
#, c-format
1692 1692
msgid "File '%s' of collection '%s' was marked optional"
1693 1693
msgstr ""
1694 1694

                
1695
#: ../nntpgrab_core/download_queue.c:1456
1695
#: ../nntpgrab_core/download_queue.c:1770
1696 1696
#, c-format
1697 1697
msgid "File '%s' of collection '%s' was marked non-optional"
1698 1698
msgstr ""
1699 1699

                
1700
#: ../nntpgrab_core/download_queue.c:1643
1700
#: ../nntpgrab_core/download_queue.c:1957
1701 1701
#, c-format
1702 1702
msgid "Collection '%s' has been completely downloaded without the PAR2 files"
1703 1703
msgstr ""
1704 1704

                
1705 1705
#. All files downloaded, allow other plugins to do post-processing (like automatic PAR2 repair and unpack)
1706
#: ../nntpgrab_core/download_queue.c:1650
1706
#: ../nntpgrab_core/download_queue.c:1964
1707 1707
#, c-format
1708 1708
msgid "Collection '%s' has been completely downloaded"
1709 1709
msgstr ""
1710 1710

                
1711
#: ../nntpgrab_core/download_queue.c:1686
1711
#: ../nntpgrab_core/download_queue.c:2000
1712 1712
#, fuzzy
1713 1713
msgid "All downloads are completed"
1714 1714
msgstr "Lorsque le téléchargement est terminé"
1715 1715

                
1716
#: ../nntpgrab_core/download_queue.c:1706
1716
#: ../nntpgrab_core/download_queue.c:2020
1717 1717
#, c-format
1718 1718
msgid ""
1719 1719
"%s:%i A PAR2 repair failure has occured but it's being ignored as the "
1720 1720
"configuration option 'Only download PAR2 files when needed' is disabled"
1721 1721
msgstr ""
1722 1722

                
1723
#: ../nntpgrab_core/download_queue.c:1711
1723
#: ../nntpgrab_core/download_queue.c:2025
1724 1724
#, c-format
1725 1725
msgid ""
1726 1726
"%s:%i No PAR2 files will be enabled automatically as the par2 recovery "
1727 1727
"failed due to an unknown error"
1728 1728
msgstr ""
1729 1729

                
1730
#: ../nntpgrab_core/download_queue.c:1719
1731
#: ../nntpgrab_core/download_queue.c:1762
1730
#: ../nntpgrab_core/download_queue.c:2033
1731
#: ../nntpgrab_core/download_queue.c:2076
1732 1732
#, fuzzy, c-format
1733 1733
msgid "%s:%i Unable to extract the name of the PAR2 set belonging to file '%s'"
1734 1734
msgstr "Échec de la sauvegarde de la partie dans le fichier '%s'"
1735 1735

                
1736
#: ../nntpgrab_core/download_queue.c:1754
1736
#: ../nntpgrab_core/download_queue.c:2068
1737 1737
#, fuzzy, c-format
1738 1738
msgid "%s:%i Unable to extract filename from subject '%s'"
1739 1739
msgstr "Échec de l'ajout du fichier : %s"
1740 1740

                
1741
#: ../nntpgrab_core/download_queue.c:1791
1741
#: ../nntpgrab_core/download_queue.c:2105
1742 1742
#, c-format
1743 1743
msgid "%s:%i %i PAR2 files were enabled by the intelligent PAR2 downloader"
1744 1744
msgstr ""
1745 1745

                
1746
#: ../nntpgrab_core/download_thread.c:504
1746
#: ../nntpgrab_core/download_thread.c:507
1747 1747
#, c-format
1748 1748
msgid "Unable to detect the IP address belonging to '%s' (servername = %s)"
1749 1749
msgstr ""
1750 1750
"Échec de la détection de l'adresse IP appartenant à '%s' (nom de serveur = "
1751 1751
"%s)"
1752 1752

                
1753
#: ../nntpgrab_core/download_thread.c:578
1753
#: ../nntpgrab_core/download_thread.c:581
1754 1754
#, fuzzy
1755 1755
msgid "Unexpected error occured while polling connection"
1756 1756
msgstr "Une erreur inconnue est survenue lors de l'exécution de la commande"
... ...
1844 1844
msgid "Unknown error occured while reading the download queue: %s"
1845 1845
msgstr "Une erreur inconnue est survenue lors de l'exécution de la commande"
1846 1846

                
1847
#: ../nntpgrab_core/queue_rawfile.c:368 ../nntpgrab_core/queue_rawfile.c:370
1847
#: ../nntpgrab_core/queue_rawfile.c:371 ../nntpgrab_core/queue_rawfile.c:373
1848 1848
#, c-format
1849 1849
msgid "Malformed download queue detected"
1850 1850
msgstr ""
... ...
1939 1939
"continue"
1940 1940
msgstr ""
1941 1941

                
1942
#: ../plugins/decoder/decoder.c:572 ../plugins/decoder/decoder.c:891
1942
#: ../plugins/decoder/decoder.c:572 ../plugins/decoder/decoder.c:892
1943 1943
#, fuzzy, c-format
1944 1944
msgid "%s:%i Unable to close file '%s': %s"
1945 1945
msgstr "Échec de l'ajout du fichier : %s"
... ...
1959 1959
msgid "%s:%i The decoder wasn't able to write to file '%s': %s"
1960 1960
msgstr ""
1961 1961

                
1962
#: ../plugins/decoder/decoder.c:797
1962
#: ../plugins/decoder/decoder.c:798
1963 1963
#, c-format
1964 1964
msgid "File '%s' of collection '%s' is now being decoded to directory '%s'"
1965 1965
msgstr ""
1966 1966

                
1967
#: ../plugins/decoder/decoder.c:800
1967
#: ../plugins/decoder/decoder.c:801
1968 1968
#, c-format
1969 1969
msgid "Creation of folder '%s' failed, errno = %i, %s\n"
1970 1970
msgstr "Échec de la création du dossier '%s', errno = %i, %s\n"
1971 1971

                
1972
#: ../plugins/decoder/decoder.c:807 ../plugins/decoder/decoder.c:811
1972
#: ../plugins/decoder/decoder.c:808 ../plugins/decoder/decoder.c:812
1973 1973
#, fuzzy, c-format
1974 1974
msgid "Unable to navigate to folder '%s': %s"
1975 1975
msgstr "Échec de la navigation vers le dossier '%s'"
1976 1976

                
1977
#: ../plugins/decoder/decoder.c:944
1977
#: ../plugins/decoder/decoder.c:945
1978 1978
msgid "No data to decode"
1979 1979
msgstr "Aucune donnée à décoder"
1980 1980

                
1981
#: ../plugins/decoder/decoder.c:966
1981
#: ../plugins/decoder/decoder.c:967
1982 1982
#, c-format
1983 1983
msgid "Decoding completed with return value %i"
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff