/[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.44 - (hide annotations)
Thu Nov 20 10:22:23 2025 UTC (3 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.43: +0 -4 lines
Content type: text/x-csrc
Restore test case on MSYS2

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

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