/[LeafOK_CVS]/lbbs/src/test_section_list.c
ViewVC logotype

Annotation of /lbbs/src/test_section_list.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.35 - (hide annotations)
Fri Oct 24 02:00:59 2025 UTC (4 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.34: +23 -0 lines
Content type: text/x-csrc
Update test case for section_list

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.30 test_section_list.c - description
3 sysadm 1.1 -------------------
4     Copyright : (C) 2004-2025 by Leaflet
5     Email : leaflet@leafok.com
6     ***************************************************************************/
7    
8     /***************************************************************************
9     * *
10     * This program is free software; you can redistribute it and/or modify *
11     * it under the terms of the GNU General Public License as published by *
12     * the Free Software Foundation; either version 3 of the License, or *
13     * (at your option) any later version. *
14     * *
15     ***************************************************************************/
16    
17 sysadm 1.31 #include "bbs.h"
18     #include "log.h"
19 sysadm 1.1 #include "section_list.h"
20 sysadm 1.21 #include "trie_dict.h"
21 sysadm 1.35 #include "user_list.h"
22 sysadm 1.31 #include <errno.h>
23 sysadm 1.1 #include <stdio.h>
24     #include <unistd.h>
25    
26 sysadm 1.17 #define ARTICLE_BLOCK_SHM_FILE "~article_block_shm.dat"
27     #define SECTION_LIST_SHM_FILE "~section_list_shm.dat"
28 sysadm 1.21 #define TRIE_DICT_SHM_FILE "~trie_dict_shm.dat"
29 sysadm 1.35 #define USER_LIST_SHM_FILE "~user_list_shm.dat"
30 sysadm 1.17
31 sysadm 1.1 const char *sname[] = {
32     "Test",
33     "ABCDEFG",
34 sysadm 1.2 "_1234_"};
35 sysadm 1.1
36     const char *stitle[] = {
37     " Test Section ",
38 sysadm 1.32 "字母组合ABC",
39     "_数字_123"};
40 sysadm 1.1
41     const char *master_name[] = {
42     "sysadm",
43     "SYSOP",
44 sysadm 1.2 ""};
45 sysadm 1.1
46 sysadm 1.2 int section_conf_count = 3;
47     int section_count = BBS_max_section;
48 sysadm 1.1
49     int main(int argc, char *argv[])
50     {
51 sysadm 1.9 SECTION_LIST *p_section[BBS_max_section];
52 sysadm 1.2 ARTICLE *p_article;
53 sysadm 1.14 ARTICLE *p_next;
54 sysadm 1.1 ARTICLE article;
55 sysadm 1.3 int block_count;
56 sysadm 1.1 int i, j;
57 sysadm 1.18 int sid;
58 sysadm 1.1 int last_aid;
59 sysadm 1.9 int current_tid;
60     int section_first_aid;
61 sysadm 1.10 int group_count = 100;
62 sysadm 1.3 int article_count;
63 sysadm 1.10 int step;
64     int32_t page;
65     int32_t offset;
66     int affected_count;
67 sysadm 1.17 FILE *fp;
68 sysadm 1.1
69     if (log_begin("../log/bbsd.log", "../log/error.log") < 0)
70     {
71     printf("Open log error\n");
72     return -1;
73     }
74    
75 sysadm 1.29 log_common_redir(STDOUT_FILENO);
76     log_error_redir(STDERR_FILENO);
77 sysadm 1.1
78 sysadm 1.9 // - 1 to make blocks allocated is less than required, to trigger error handling
79 sysadm 1.12 block_count = BBS_article_limit_per_section * BBS_max_section / ARTICLE_PER_BLOCK;
80 sysadm 1.3
81 sysadm 1.17 if ((fp = fopen(ARTICLE_BLOCK_SHM_FILE, "w")) == NULL)
82     {
83     log_error("fopen(%s) error\n", ARTICLE_BLOCK_SHM_FILE);
84     return -1;
85     }
86     fclose(fp);
87    
88     if ((fp = fopen(SECTION_LIST_SHM_FILE, "w")) == NULL)
89 sysadm 1.1 {
90 sysadm 1.17 log_error("fopen(%s) error\n", SECTION_LIST_SHM_FILE);
91     return -1;
92     }
93     fclose(fp);
94    
95 sysadm 1.21 if ((fp = fopen(TRIE_DICT_SHM_FILE, "w")) == NULL)
96     {
97     log_error("fopen(%s) error\n", TRIE_DICT_SHM_FILE);
98     return -1;
99     }
100     fclose(fp);
101    
102 sysadm 1.35 if ((fp = fopen(USER_LIST_SHM_FILE, "w")) == NULL)
103     {
104     log_error("fopen(%s) error\n", USER_LIST_SHM_FILE);
105     return -1;
106     }
107     fclose(fp);
108    
109 sysadm 1.22 if (trie_dict_init(TRIE_DICT_SHM_FILE, TRIE_NODE_PER_POOL) < 0)
110 sysadm 1.21 {
111     printf("trie_dict_init failed\n");
112     return -1;
113     }
114    
115 sysadm 1.17 if (article_block_init(ARTICLE_BLOCK_SHM_FILE, block_count) < 0)
116     {
117 sysadm 1.18 log_error("article_block_init(%s, %d) error\n", ARTICLE_BLOCK_SHM_FILE, block_count);
118 sysadm 1.17 return -2;
119     }
120    
121 sysadm 1.21 if (section_list_init(SECTION_LIST_SHM_FILE) < 0)
122 sysadm 1.17 {
123     log_error("section_list_pool_init(%s) error\n", SECTION_LIST_SHM_FILE);
124 sysadm 1.1 return -2;
125     }
126    
127 sysadm 1.35 // Load user_list and online_user_list
128     if (user_list_pool_init(USER_LIST_SHM_FILE) < 0)
129     {
130     log_error("user_list_pool_init() error\n");
131     return -2;
132     }
133    
134 sysadm 1.2 printf("Testing #1 ...\n");
135    
136 sysadm 1.1 last_aid = 0;
137    
138 sysadm 1.23 if (section_list_rw_lock(NULL) < 0)
139 sysadm 1.20 {
140 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", 0);
141 sysadm 1.20 }
142    
143 sysadm 1.1 for (i = 0; i < section_count; i++)
144     {
145 sysadm 1.18 sid = i * 3 + 1;
146     p_section[i] = section_list_create(sid,
147 sysadm 1.14 sname[i % section_conf_count],
148 sysadm 1.2 stitle[i % section_conf_count],
149     master_name[i % section_conf_count]);
150     if (p_section[i] == NULL)
151 sysadm 1.1 {
152 sysadm 1.19 printf("section_list_create(i = %d) error\n", i);
153     return -3;
154     }
155    
156     if (get_section_index(p_section[i]) != i)
157     {
158     printf("get_section_index(i = %d) error\n", i);
159 sysadm 1.1 return -3;
160     }
161 sysadm 1.7 }
162 sysadm 1.1
163 sysadm 1.10 for (i = 0; i < section_conf_count; i++)
164     {
165 sysadm 1.34 if (section_list_find_by_name(sname[i]) == NULL)
166 sysadm 1.10 {
167 sysadm 1.18 printf("section_list_find_by_name(%s) error\n", sname[i]);
168     return -3;
169     }
170     }
171    
172     for (i = 0; i < section_count; i++)
173     {
174     sid = i * 3 + 1;
175 sysadm 1.34 if (section_list_find_by_sid(sid) == NULL || section_list_find_by_sid(sid)->sid != sid)
176 sysadm 1.18 {
177     printf("section_list_find_by_sid(%d) error\n", sid);
178 sysadm 1.10 return -3;
179     }
180     }
181    
182 sysadm 1.20 if (section_list_rw_unlock(NULL) < 0)
183     {
184     printf("section_list_rw_unlock(sid = %d) error\n", 0);
185     }
186    
187 sysadm 1.9 for (j = 0; j < BBS_article_limit_per_section; j++)
188 sysadm 1.7 {
189     for (i = 0; i < section_count; i++)
190 sysadm 1.1 {
191     last_aid++;
192    
193     // Set article data
194     article.aid = last_aid;
195 sysadm 1.18 article.tid = 0;
196     article.sid = i * 3 + 1;
197 sysadm 1.1 article.cid = article.aid;
198 sysadm 1.28 article.uid = 1;
199 sysadm 1.1 article.visible = 1;
200     article.excerption = 0;
201     article.ontop = 0;
202     article.lock = 0;
203 sysadm 1.27 article.transship = 0;
204 sysadm 1.1
205 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
206 sysadm 1.20 {
207 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
208 sysadm 1.20 break;
209     }
210    
211 sysadm 1.9 if (section_list_append_article(p_section[i], &article) < 0)
212 sysadm 1.3 {
213 sysadm 1.9 printf("append article (aid = %d) error at section %d index %d\n", article.aid, i, j);
214 sysadm 1.3 break;
215     }
216 sysadm 1.20
217     if (section_list_rw_unlock(p_section[i]) < 0)
218     {
219     printf("section_list_rw_unlock(sid = %d) error %d\n", p_section[i]->sid, errno);
220     break;
221     }
222 sysadm 1.1 }
223 sysadm 1.7 }
224 sysadm 1.2
225 sysadm 1.7 for (i = 0; i < section_count; i++)
226     {
227 sysadm 1.9 // printf("Loaded %d articles into section %d\n", p_section[i]->article_count, i);
228 sysadm 1.2 }
229    
230 sysadm 1.25 if (last_aid != article_block_last_aid())
231     {
232     printf("last_aid != %d\n", article_block_last_aid());
233     }
234    
235 sysadm 1.26 if (article_block_article_count() != section_count * BBS_article_limit_per_section)
236     {
237     printf("article_block_article_count() error %d != %d * %d\n",
238     article_block_article_count(), section_count, BBS_article_limit_per_section);
239     }
240    
241 sysadm 1.9 last_aid = 0;
242    
243 sysadm 1.18 for (j = 0; j < BBS_article_limit_per_section; j++)
244 sysadm 1.2 {
245 sysadm 1.18 for (i = 0; i < section_count; i++)
246 sysadm 1.2 {
247 sysadm 1.9 last_aid++;
248    
249     p_article = article_block_find_by_aid(last_aid);
250 sysadm 1.2 if (p_article == NULL || p_article->aid != last_aid)
251     {
252 sysadm 1.9 printf("article_block_find_by_aid() at section %d index %d, %d != %d\n", i, j, p_article->aid, last_aid);
253 sysadm 1.2 }
254 sysadm 1.4
255 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
256 sysadm 1.20 {
257 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
258 sysadm 1.20 break;
259     }
260    
261 sysadm 1.9 if (section_list_set_article_visible(p_section[i], p_article->aid, 0) != 1)
262     {
263     printf("section_list_set_article_visible(aid = %d) error\n", p_article->aid);
264     }
265 sysadm 1.20
266     if (section_list_rw_unlock(p_section[i]) < 0)
267     {
268     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
269     break;
270     }
271 sysadm 1.2 }
272    
273 sysadm 1.9 // printf("Verified %d articles in section %d\n", p_section[i]->article_count, i);
274     }
275    
276     printf("Testing #2 ...\n");
277 sysadm 1.7
278 sysadm 1.23 if (section_list_rw_lock(NULL) < 0)
279 sysadm 1.20 {
280 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", 0);
281 sysadm 1.20 }
282    
283 sysadm 1.9 if (article_block_reset() != 0)
284     {
285 sysadm 1.18 log_error("article_block_reset() error\n");
286 sysadm 1.9 return -4;
287 sysadm 1.1 }
288    
289 sysadm 1.9 for (i = 0; i < section_count; i++)
290     {
291     section_list_reset_articles(p_section[i]);
292     }
293 sysadm 1.2
294 sysadm 1.20 if (section_list_rw_unlock(NULL) < 0)
295     {
296     printf("section_list_rw_unlock(sid = %d) error\n", 0);
297     }
298    
299 sysadm 1.9 last_aid = 0;
300 sysadm 1.2
301 sysadm 1.1 for (i = 0; i < section_count; i++)
302     {
303 sysadm 1.9 section_first_aid = last_aid + 1;
304 sysadm 1.2
305 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
306 sysadm 1.20 {
307 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
308 sysadm 1.20 break;
309     }
310    
311 sysadm 1.9 for (j = 0; j < BBS_article_limit_per_section; j++)
312 sysadm 1.2 {
313     last_aid++;
314    
315     // Set article data
316     article.aid = last_aid;
317 sysadm 1.9 // Group articles into group_count topics
318     article.tid = ((article.aid < section_first_aid + group_count) ? 0 : (section_first_aid + j % group_count));
319 sysadm 1.18 article.sid = i * 3 + 1;
320     article.cid = article.aid;
321 sysadm 1.28 article.uid = 1;
322 sysadm 1.2 article.visible = 1;
323     article.excerption = 0;
324     article.ontop = 0;
325     article.lock = 0;
326 sysadm 1.27 article.transship = 0;
327 sysadm 1.2
328 sysadm 1.9 if (section_list_append_article(p_section[i], &article) < 0)
329 sysadm 1.3 {
330 sysadm 1.9 printf("append article (aid = %d) error at section %d index %d\n", article.aid, i, j);
331 sysadm 1.3 break;
332     }
333 sysadm 1.2 }
334    
335 sysadm 1.20 if (section_list_rw_unlock(p_section[i]) < 0)
336     {
337     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
338     break;
339     }
340    
341 sysadm 1.9 // printf("Loaded %d articles into section %d\n", p_section[i]->article_count, i);
342 sysadm 1.2 }
343    
344     for (i = 0; i < section_count; i++)
345     {
346 sysadm 1.3 if (p_section[i]->article_count == 0)
347     {
348     continue;
349     }
350    
351 sysadm 1.7 article_count = 0;
352 sysadm 1.8 last_aid = 0;
353 sysadm 1.7
354 sysadm 1.23 if (section_list_rd_lock(p_section[i]) < 0)
355 sysadm 1.20 {
356 sysadm 1.23 printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
357 sysadm 1.20 break;
358     }
359    
360 sysadm 1.7 p_article = p_section[i]->p_article_head;
361    
362     do
363     {
364     article_count++;
365 sysadm 1.8
366     if (p_article->aid <= last_aid)
367     {
368 sysadm 1.9 printf("Non-ascending aid found %d <= %d at article\n", p_article->aid, last_aid);
369 sysadm 1.8 }
370     last_aid = p_article->aid;
371    
372 sysadm 1.7 p_article = p_article->p_next;
373     } while (p_article != p_section[i]->p_article_head);
374    
375     if (article_count != p_section[i]->article_count)
376     {
377     printf("Count of articles in section %d is different from expected %d != %d\n",
378     i, article_count, p_section[i]->article_count);
379 sysadm 1.9 break;
380 sysadm 1.7 }
381    
382 sysadm 1.20 if (section_list_rd_unlock(p_section[i]) < 0)
383     {
384     printf("section_list_rd_unlock(sid = %d) error\n", p_section[i]->sid);
385     break;
386     }
387    
388 sysadm 1.9 // printf("Verified %d articles in section %d\n", group_count, i);
389 sysadm 1.7 }
390    
391     for (i = 0; i < section_count; i++)
392     {
393     if (p_section[i]->article_count == 0)
394     {
395     continue;
396     }
397    
398 sysadm 1.23 if (section_list_rd_lock(p_section[i]) < 0)
399 sysadm 1.20 {
400 sysadm 1.23 printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
401 sysadm 1.20 break;
402     }
403    
404 sysadm 1.10 if (p_section[i]->topic_count != group_count)
405     {
406     printf("Inconsistent topic count in section %d, %d != %d\n", i, p_section[i]->topic_count, group_count);
407     }
408    
409 sysadm 1.2 for (j = 0; j < group_count; j++)
410     {
411 sysadm 1.9 last_aid = p_section[i]->p_article_head->aid + j;
412    
413     p_article = article_block_find_by_aid(last_aid);
414 sysadm 1.2 if (p_article == NULL)
415     {
416 sysadm 1.9 printf("NULL p_article at section %d index %d\n", i, j);
417 sysadm 1.2 break;
418     }
419 sysadm 1.9 if (p_article->aid != last_aid)
420 sysadm 1.2 {
421 sysadm 1.9 printf("Inconsistent aid at section %d index %d, %d != %d\n", i, j, p_article->aid, last_aid);
422 sysadm 1.2 break;
423     }
424    
425 sysadm 1.3 article_count = 1;
426 sysadm 1.8 last_aid = 0;
427 sysadm 1.9 current_tid = p_article->aid;
428 sysadm 1.3
429 sysadm 1.2 do
430     {
431 sysadm 1.8 if (p_article->aid <= last_aid)
432     {
433     printf("Non-ascending aid found %d <= %d\n", p_article->aid, last_aid);
434     }
435     last_aid = p_article->aid;
436    
437 sysadm 1.7 p_article = p_article->p_topic_next;
438 sysadm 1.8
439 sysadm 1.2 if (p_article == NULL)
440     {
441 sysadm 1.7 printf("NULL p_article found\n");
442 sysadm 1.2 break;
443     }
444     if (p_article->tid == 0) // loop
445     {
446     break;
447     }
448 sysadm 1.9 if (p_article->tid != current_tid)
449 sysadm 1.2 {
450 sysadm 1.9 printf("Inconsistent tid %d != %d\n", p_article->tid, current_tid);
451 sysadm 1.2 break;
452     }
453 sysadm 1.8
454 sysadm 1.3 article_count++;
455 sysadm 1.2 } while (1);
456 sysadm 1.3
457     if (article_count != p_section[i]->article_count / group_count)
458     {
459 sysadm 1.9 printf("Count of articles in topic %d is different from expected %d != %d\n",
460 sysadm 1.3 j + 1, article_count, p_section[i]->article_count / group_count);
461 sysadm 1.15 // break;
462 sysadm 1.3 }
463 sysadm 1.2 }
464    
465 sysadm 1.20 if (section_list_rd_unlock(p_section[i]) < 0)
466     {
467     printf("section_list_rd_unlock(sid = %d) error\n", p_section[i]->sid);
468     break;
469     }
470    
471 sysadm 1.9 // printf("Verified %d topics in section %d\n", group_count, i);
472 sysadm 1.1 }
473    
474 sysadm 1.6 printf("Testing #3 ...\n");
475    
476 sysadm 1.10 for (i = 0; i < section_count; i++)
477     {
478     last_aid = 0;
479    
480 sysadm 1.23 if (section_list_rd_lock(p_section[i]) < 0)
481 sysadm 1.20 {
482 sysadm 1.23 printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
483 sysadm 1.20 break;
484     }
485    
486 sysadm 1.10 for (j = 0; j < p_section[i]->page_count; j++)
487     {
488     if (p_section[i]->p_page_first_article[j]->aid <= last_aid)
489     {
490     printf("Non-ascending aid found at section %d page %d, %d <= %d\n", i, j, p_section[i]->p_page_first_article[j]->aid, last_aid);
491     }
492    
493     if (j > 0)
494     {
495     step = 0;
496    
497     for (p_article = p_section[i]->p_page_first_article[j];
498     p_article != p_section[i]->p_page_first_article[j - 1];
499     p_article = p_article->p_prior)
500     {
501     step++;
502     }
503    
504     if (step != BBS_article_limit_per_page)
505     {
506     printf("Incorrect page size %d at section %d page %d\n", step, i, j - 1);
507     }
508     }
509     }
510 sysadm 1.20
511     if (section_list_rd_unlock(p_section[i]) < 0)
512     {
513     printf("section_list_rd_unlock(sid = %d) error\n", p_section[i]->sid);
514     break;
515     }
516 sysadm 1.10 }
517    
518     printf("Testing #4 ...\n");
519    
520 sysadm 1.11 for (i = 0; i < section_count; i++)
521 sysadm 1.6 {
522 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
523 sysadm 1.20 {
524 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
525 sysadm 1.20 break;
526     }
527    
528 sysadm 1.10 step = i % 10 + 1;
529     for (j = group_count; j < BBS_article_limit_per_section; j += step)
530     {
531     last_aid = i * BBS_article_limit_per_section + j + 1;
532    
533 sysadm 1.14 p_article = section_list_find_article_with_offset(p_section[i], last_aid, &page, &offset, &p_next);
534 sysadm 1.10
535     if (p_article == NULL)
536     {
537     printf("Error find article %d in section %d offset %d\n", last_aid, i, j);
538     break;
539     }
540    
541     if (p_article->aid != last_aid)
542     {
543     printf("Inconsistent article aid in section %d page %d offset %d %d != %d\n", i, page, offset, p_article->aid, last_aid);
544     break;
545     }
546    
547     if (section_list_set_article_visible(p_section[i], last_aid, 0) != 1)
548     {
549     printf("Error set article %d invisible in section %d offset %d\n", last_aid, i, j);
550     break;
551     }
552     }
553    
554 sysadm 1.11 last_aid = p_section[i]->p_article_head->aid;
555     if (section_list_calculate_page(p_section[i], last_aid) < 0)
556     {
557     printf("section_list_calculate_page(aid = %d) error in section %d offset %d\n", last_aid, i, j);
558     break;
559     }
560    
561     if (p_section[i]->visible_article_count / BBS_article_limit_per_page +
562     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0) !=
563     p_section[i]->page_count)
564     {
565     printf("Inconsistent page count in section %d offset %d, %d != %d, "
566     "visible_article_count = %d, last_page_visible_count = %d\n",
567     i, j,
568     p_section[i]->visible_article_count / BBS_article_limit_per_page +
569     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0),
570     p_section[i]->page_count, p_section[i]->visible_article_count,
571     p_section[i]->last_page_visible_article_count);
572     break;
573     }
574    
575 sysadm 1.10 affected_count = (BBS_article_limit_per_section - group_count) / step + ((BBS_article_limit_per_section - group_count) % step ? 1 : 0);
576     if (p_section[i]->article_count - p_section[i]->visible_article_count != affected_count)
577     {
578     printf("Inconsistent set invisible count in section %d, %d != %d\n", i,
579     p_section[i]->article_count - p_section[i]->visible_article_count,
580     affected_count);
581     break;
582     }
583    
584     article_count = p_section[i]->visible_article_count;
585    
586     for (j = 0; j < group_count; j += 1)
587     {
588     last_aid = i * BBS_article_limit_per_section + j + 1;
589    
590 sysadm 1.14 p_article = section_list_find_article_with_offset(p_section[i], last_aid, &page, &offset, &p_next);
591 sysadm 1.10
592     if (p_article == NULL)
593     {
594     printf("Error find article %d in section %d offset %d\n", last_aid, i, j);
595     break;
596     }
597    
598     if (p_article->aid != last_aid)
599     {
600     printf("Inconsistent article aid in section %d page %d offset %d %d != %d\n", i, page, offset, p_article->aid, last_aid);
601     break;
602     }
603    
604     if (p_article->tid != 0)
605     {
606     printf("Non-topic article aid in section %d page %d offset %d %d != 0\n", i, page, offset, p_article->tid);
607     break;
608     }
609    
610     if ((affected_count = section_list_set_article_visible(p_section[i], last_aid, 0)) <= 0)
611     {
612     printf("Error set topic %d invisible in section %d offset %d\n", last_aid, i, j);
613     break;
614     }
615    
616     article_count -= affected_count;
617     }
618    
619     if (article_count != 0)
620     {
621     printf("Inconsistent total set invisible topic count in section %d, %d > 0\n", i, article_count);
622     break;
623     }
624    
625     if (p_section[i]->visible_article_count > 0)
626 sysadm 1.6 {
627 sysadm 1.13 printf("Inconsistent invisible article count in section %d, %d > 0\n", i, p_section[i]->visible_article_count);
628     break;
629     }
630    
631     if (p_section[i]->visible_topic_count > 0)
632     {
633     printf("Inconsistent invisible topic count in section %d, %d > 0\n", i, p_section[i]->visible_topic_count);
634     break;
635     }
636    
637     last_aid = p_section[i]->p_article_head->aid;
638     if (section_list_calculate_page(p_section[i], last_aid) < 0)
639     {
640     printf("section_list_calculate_page(aid = %d) error in section %d offset %d\n", last_aid, i, j);
641     break;
642     }
643    
644     if (p_section[i]->visible_article_count / BBS_article_limit_per_page +
645     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0) !=
646     p_section[i]->page_count)
647     {
648     printf("Inconsistent page count in section %d offset %d, %d != %d, "
649     "visible_article_count = %d, last_page_visible_count = %d\n",
650     i, j,
651     p_section[i]->visible_article_count / BBS_article_limit_per_page +
652     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0),
653     p_section[i]->page_count, p_section[i]->visible_article_count,
654     p_section[i]->last_page_visible_article_count);
655     break;
656     }
657 sysadm 1.20
658     if (section_list_rw_unlock(p_section[i]) < 0)
659     {
660     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
661     break;
662     }
663 sysadm 1.13 }
664    
665     for (i = 0; i < BBS_max_section; i++)
666     {
667 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
668 sysadm 1.20 {
669 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
670 sysadm 1.20 break;
671     }
672    
673 sysadm 1.13 affected_count = 0;
674    
675     for (j = 0; j < BBS_article_limit_per_section; j += 1)
676     {
677     last_aid = i * BBS_article_limit_per_section + j + 1;
678    
679     if (section_list_set_article_visible(p_section[i], last_aid, 1) <= 0)
680     {
681     printf("Error set article %d visible in section %d offset %d\n", last_aid, i, j);
682     break;
683     }
684    
685     affected_count++;
686     }
687    
688     if (affected_count != p_section[i]->article_count)
689     {
690     printf("Inconsistent total set visible article count in section %d, %d != %d\n", i, affected_count, p_section[i]->article_count);
691     break;
692     }
693    
694     if (p_section[i]->visible_article_count != p_section[i]->article_count)
695     {
696     printf("Inconsistent visible article count in section %d, %d != %d\n", i, p_section[i]->visible_article_count, p_section[i]->article_count);
697     break;
698     }
699    
700     if (p_section[i]->visible_topic_count != group_count)
701     {
702     printf("Inconsistent visible topic count in section %d, %d != %d\n", i, p_section[i]->visible_topic_count, group_count);
703 sysadm 1.10 break;
704 sysadm 1.6 }
705 sysadm 1.12
706     last_aid = p_section[i]->p_article_head->aid;
707     if (section_list_calculate_page(p_section[i], last_aid) < 0)
708     {
709     printf("section_list_calculate_page(aid = %d) error in section %d offset %d\n", last_aid, i, j);
710     break;
711     }
712    
713     if (p_section[i]->visible_article_count / BBS_article_limit_per_page +
714     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0) !=
715     p_section[i]->page_count)
716     {
717     printf("Inconsistent page count in section %d offset %d, %d != %d, "
718     "visible_article_count = %d, last_page_visible_count = %d\n",
719     i, j,
720     p_section[i]->visible_article_count / BBS_article_limit_per_page +
721     (p_section[i]->visible_article_count % BBS_article_limit_per_page ? 1 : 0),
722     p_section[i]->page_count, p_section[i]->visible_article_count,
723     p_section[i]->last_page_visible_article_count);
724     break;
725     }
726 sysadm 1.20
727     if (section_list_rw_unlock(p_section[i]) < 0)
728     {
729     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
730     break;
731     }
732 sysadm 1.6 }
733    
734 sysadm 1.14 printf("Testing #5 ...\n");
735    
736 sysadm 1.23 if (section_list_rw_lock(NULL) < 0)
737 sysadm 1.20 {
738 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", 0);
739 sysadm 1.20 }
740    
741 sysadm 1.14 if (article_block_reset() != 0)
742     {
743 sysadm 1.18 log_error("article_block_reset() error\n");
744 sysadm 1.14 return -4;
745     }
746    
747     for (i = 0; i < section_count; i++)
748     {
749     section_list_reset_articles(p_section[i]);
750     }
751    
752 sysadm 1.20 if (section_list_rw_unlock(NULL) < 0)
753     {
754     printf("section_list_rw_unlock(sid = %d) error\n", 0);
755     }
756    
757 sysadm 1.14 last_aid = 0;
758    
759     for (i = 0; i < section_count / 2; i++)
760     {
761 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
762 sysadm 1.20 {
763 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
764 sysadm 1.20 break;
765     }
766    
767 sysadm 1.14 section_first_aid = last_aid + 1;
768    
769     for (j = 0; j < BBS_article_limit_per_section; j++)
770     {
771     last_aid++;
772    
773     // Set article data
774     article.aid = last_aid;
775     // Group articles into group_count topics
776     article.tid = ((article.aid < section_first_aid + group_count) ? 0 : (section_first_aid + j % group_count));
777 sysadm 1.18 article.sid = i * 3 + 1;
778     article.cid = article.aid;
779 sysadm 1.28 article.uid = 1;
780 sysadm 1.14 article.visible = 1;
781     article.excerption = 0;
782     article.ontop = 0;
783     article.lock = 0;
784 sysadm 1.27 article.transship = 0;
785 sysadm 1.14
786     if (section_list_append_article(p_section[i], &article) < 0)
787     {
788     printf("append article (aid = %d) error at section %d index %d\n", article.aid, i, j);
789     break;
790     }
791     }
792    
793 sysadm 1.20 if (section_list_rw_unlock(p_section[i]) < 0)
794     {
795     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
796     break;
797     }
798    
799 sysadm 1.14 // printf("Loaded %d articles into section %d\n", p_section[i]->article_count, i);
800     }
801    
802     for (i = 0; i < section_count / 2; i++)
803     {
804 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
805 sysadm 1.20 {
806 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
807 sysadm 1.20 break;
808     }
809    
810 sysadm 1.14 section_first_aid = p_section[i]->p_article_head->aid;
811    
812 sysadm 1.16 for (j = 0; j < group_count; j += 2)
813 sysadm 1.14 {
814     p_article = section_list_find_article_with_offset(p_section[i], section_first_aid + j, &page, &offset, &p_next);
815     if (p_article == NULL)
816     {
817     printf("section_list_find_article_with_offset(aid = %d) not found in section %d\n",
818     section_first_aid + j, i);
819     break;
820     }
821 sysadm 1.16
822     if (section_list_set_article_visible(p_section[i], p_article->aid, 0) != BBS_article_limit_per_section / group_count)
823     {
824     printf("section_list_set_article_visible(aid = %d) error\n", p_article->aid);
825     }
826 sysadm 1.14 }
827 sysadm 1.20
828     if (section_list_rw_unlock(p_section[i]) < 0)
829     {
830     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
831     break;
832     }
833 sysadm 1.14 }
834    
835     for (i = 0; i < section_count / 2; i++)
836     {
837 sysadm 1.23 if (section_list_rw_lock(p_section[i]) < 0)
838 sysadm 1.20 {
839 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[i]->sid);
840 sysadm 1.20 break;
841     }
842    
843 sysadm 1.23 if (section_list_rw_lock(p_section[section_count / 2 + i]) < 0)
844 sysadm 1.20 {
845 sysadm 1.23 printf("section_list_rw_lock(sid = %d) error\n", p_section[section_count / 2 + i]->sid);
846 sysadm 1.20
847     if (section_list_rw_unlock(p_section[i]) < 0)
848     {
849     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
850     }
851     break;
852     }
853    
854 sysadm 1.14 section_first_aid = p_section[i]->p_article_head->aid;
855    
856     for (j = 0; j < group_count; j++)
857     {
858     affected_count = section_list_move_topic(p_section[i], p_section[section_count / 2 + i], section_first_aid + j);
859    
860     if (affected_count < 0)
861     {
862     printf("move topic (aid = %d) error from section %d to section %d\n", section_first_aid + j, i, section_count / 2 + i);
863     break;
864     }
865    
866     if (affected_count != BBS_article_limit_per_section / group_count)
867     {
868     printf("move topic (aid = %d) affected article count %d != %d\n",
869     section_first_aid + j, affected_count,
870     BBS_article_limit_per_section / group_count);
871 sysadm 1.15 // break;
872 sysadm 1.14 }
873     }
874 sysadm 1.20
875     if (section_list_rw_unlock(p_section[i]) < 0)
876     {
877     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
878     break;
879     }
880    
881     if (section_list_rw_unlock(p_section[section_count / 2 + i]) < 0)
882     {
883     printf("section_list_rw_unlock(sid = %d) error\n", p_section[section_count / 2 + i]->sid);
884    
885     if (section_list_rw_unlock(p_section[i]) < 0)
886     {
887     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
888     }
889     break;
890     }
891 sysadm 1.14 }
892    
893     for (i = 0; i < section_count; i++)
894     {
895 sysadm 1.23 if (section_list_rd_lock(p_section[i]) < 0)
896 sysadm 1.20 {
897 sysadm 1.23 printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
898 sysadm 1.20 break;
899     }
900    
901 sysadm 1.14 if (p_section[i]->topic_count != (i < section_count / 2 ? 0 : group_count))
902     {
903     printf("Topic count error in section %d, %d != %d\n", i,
904     p_section[i]->topic_count, (i < section_count / 2 ? 0 : group_count));
905     break;
906     }
907    
908 sysadm 1.16 if (p_section[i]->visible_topic_count != (i < section_count / 2 ? 0 : group_count / 2))
909     {
910     printf("Visible topic count error in section %d, %d != %d\n", i,
911     p_section[i]->visible_topic_count, (i < section_count / 2 ? 0 : group_count / 2));
912     break;
913     }
914    
915 sysadm 1.14 if (p_section[i]->article_count != (i < section_count / 2 ? 0 : BBS_article_limit_per_section))
916     {
917     printf("Article count error in section %d, %d != %d\n", i,
918     p_section[i]->article_count, (i < section_count / 2 ? 0 : BBS_article_limit_per_section));
919     break;
920     }
921    
922 sysadm 1.16 if (p_section[i]->visible_article_count != (i < section_count / 2 ? 0 : BBS_article_limit_per_section / 2))
923     {
924     printf("Visible article count error in section %d, %d != %d\n", i,
925     p_section[i]->visible_article_count, (i < section_count / 2 ? 0 : BBS_article_limit_per_section / 2));
926     break;
927     }
928    
929     if (p_section[i]->page_count != (i < section_count / 2 ? 0 : BBS_article_limit_per_section / 2 / BBS_article_limit_per_page))
930 sysadm 1.14 {
931     printf("Page count error in section %d, %d != %d\n", i,
932 sysadm 1.16 p_section[i]->page_count, (i < section_count / 2 ? 0 : BBS_article_limit_per_section / 2 / BBS_article_limit_per_page));
933 sysadm 1.14 break;
934     }
935 sysadm 1.20
936     if (section_list_rd_unlock(p_section[i]) < 0)
937     {
938     printf("section_list_rd_unlock(sid = %d) error\n", p_section[i]->sid);
939     break;
940     }
941 sysadm 1.14 }
942    
943 sysadm 1.24 printf("Testing #6 ...\n");
944    
945     for (i = 0; i < section_count; i++)
946     {
947     if (section_list_rd_lock(p_section[i]) < 0)
948     {
949     printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
950     break;
951     }
952     }
953    
954     printf("Try rw_lock for 5 sec...\n");
955     if (section_list_try_rw_lock(NULL, 5) == 0)
956     {
957     printf("section_list_try_rw_lock(sid = %d) error, expectation is timeout\n", p_section[i]->sid);
958     }
959    
960     for (i = 0; i < section_count; i++)
961     {
962     if (section_list_rd_unlock(p_section[i]) < 0)
963     {
964     printf("section_list_rd_unlock(sid = %d) error\n", p_section[i]->sid);
965     break;
966     }
967     }
968    
969     if (section_list_try_rw_lock(NULL, 5) < 0)
970     {
971     printf("section_list_rd_lock(sid = %d) error\n", p_section[i]->sid);
972     }
973    
974     for (i = 0; i < section_count; i++)
975     {
976     if (section_list_try_rd_lock(p_section[i], 0) == 0)
977     {
978     printf("section_list_try_rd_lock(sid = %d) error, expectation is timeout\n", p_section[i]->sid);
979     break;
980     }
981     }
982    
983     if (section_list_rw_unlock(NULL) < 0)
984     {
985     printf("section_list_rw_unlock(sid = %d) error\n", p_section[i]->sid);
986     }
987    
988 sysadm 1.5 printf("Press ENTER to exit...");
989     getchar();
990 sysadm 1.7
991 sysadm 1.35 user_list_pool_cleanup();
992 sysadm 1.21 section_list_cleanup();
993 sysadm 1.9 article_block_cleanup();
994 sysadm 1.21 trie_dict_cleanup();
995    
996 sysadm 1.35 if (unlink(USER_LIST_SHM_FILE) < 0)
997     {
998     log_error("unlink(%s) error\n", USER_LIST_SHM_FILE);
999     return -1;
1000     }
1001    
1002 sysadm 1.21 if (unlink(TRIE_DICT_SHM_FILE) < 0)
1003     {
1004     log_error("unlink(%s) error\n", TRIE_DICT_SHM_FILE);
1005     return -1;
1006     }
1007 sysadm 1.17
1008     if (unlink(ARTICLE_BLOCK_SHM_FILE) < 0)
1009     {
1010     log_error("unlink(%s) error\n", ARTICLE_BLOCK_SHM_FILE);
1011     return -1;
1012     }
1013    
1014     if (unlink(SECTION_LIST_SHM_FILE) < 0)
1015     {
1016     log_error("unlink(%s) error\n", SECTION_LIST_SHM_FILE);
1017     return -1;
1018     }
1019 sysadm 1.1
1020     log_end();
1021    
1022     return 0;
1023     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1