1/*-
2 * Copyright (c) 2012 Michihiro NAKAJIMA
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "test.h"
27__FBSDID("$FreeBSD$");
28
29time_t __archive_get_date(time_t, const char *);
30
31static void
32test_newer_time(void)
33{
34	struct archive_entry *ae;
35	struct archive *m;
36
37	if (!assert((m = archive_match_new()) != NULL))
38		return;
39	if (!assert((ae = archive_entry_new()) != NULL)) {
40		archive_match_free(m);
41		return;
42	}
43
44	assertEqualIntA(m, 0, archive_match_include_time(m,
45	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
46	    ARCHIVE_MATCH_NEWER, 7880, 0));
47
48	archive_entry_copy_pathname(ae, "file1");
49	archive_entry_set_mtime(ae, 7880, 0);
50	archive_entry_set_ctime(ae, 7880, 0);
51	failure("Both Its mtime and ctime should be excluded");
52	assertEqualInt(1, archive_match_time_excluded(m, ae));
53	assertEqualInt(1, archive_match_excluded(m, ae));
54	archive_entry_set_mtime(ae, 7879, 999);
55	archive_entry_set_ctime(ae, 7879, 999);
56	failure("Both Its mtime and ctime should be excluded");
57	assertEqualInt(1, archive_match_time_excluded(m, ae));
58	assertEqualInt(1, archive_match_excluded(m, ae));
59
60	archive_entry_set_mtime(ae, 7881, 0);
61	archive_entry_set_ctime(ae, 7881, 0);
62	failure("Both Its mtime and ctime should not be excluded");
63	assertEqualInt(0, archive_match_time_excluded(m, ae));
64	assertEqualInt(0, archive_match_excluded(m, ae));
65
66	archive_entry_set_mtime(ae, 7880, 1);
67	archive_entry_set_ctime(ae, 7880, 0);
68	failure("Its mtime should be excluded");
69	assertEqualInt(1, archive_match_time_excluded(m, ae));
70	assertEqualInt(1, archive_match_excluded(m, ae));
71
72	archive_entry_set_mtime(ae, 7880, 0);
73	archive_entry_set_ctime(ae, 7880, 1);
74	failure("Its ctime should be excluded");
75	assertEqualInt(1, archive_match_time_excluded(m, ae));
76	assertEqualInt(1, archive_match_excluded(m, ae));
77
78	/* Clean up. */
79	archive_entry_free(ae);
80	archive_match_free(m);
81}
82
83static void
84test_newer_time_str(void)
85{
86	struct archive_entry *ae;
87	struct archive *m;
88	time_t now, t;
89
90	if (!assert((m = archive_match_new()) != NULL))
91		return;
92	if (!assert((ae = archive_entry_new()) != NULL)) {
93		archive_match_free(m);
94		return;
95	}
96
97	time(&now);
98
99	assertEqualIntA(m, 0, archive_match_include_date(m,
100	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
101	    ARCHIVE_MATCH_NEWER, "1980/2/1 0:0:0 UTC"));
102
103	/* Test1: Allow newer time. */
104	archive_entry_copy_pathname(ae, "file1");
105	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
106	archive_entry_set_mtime(ae, t, 0);
107	archive_entry_set_ctime(ae, t, 0);
108	failure("Both Its mtime and ctime should be excluded");
109	assertEqualInt(1, archive_match_time_excluded(m, ae));
110	assertEqualInt(1, archive_match_excluded(m, ae));
111	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
112	archive_entry_set_mtime(ae, t, 0);
113	archive_entry_set_ctime(ae, t, 0);
114	failure("Both Its mtime and ctime should be excluded");
115	assertEqualInt(1, archive_match_time_excluded(m, ae));
116	assertEqualInt(1, archive_match_excluded(m, ae));
117
118	t = __archive_get_date(now, "1980/2/1 0:0:1 UTC");
119	archive_entry_set_mtime(ae, t, 0);
120	archive_entry_set_ctime(ae, t, 0);
121	failure("Both Its mtime and ctime should not be excluded");
122	assertEqualInt(0, archive_match_time_excluded(m, ae));
123	assertEqualInt(0, archive_match_excluded(m, ae));
124
125	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
126	archive_entry_set_mtime(ae, t, 1);
127	archive_entry_set_ctime(ae, t, 0);
128	failure("Its mtime should be excluded");
129	assertEqualInt(1, archive_match_time_excluded(m, ae));
130	assertEqualInt(1, archive_match_excluded(m, ae));
131
132	archive_entry_set_mtime(ae, t, 0);
133	archive_entry_set_ctime(ae, t, 1);
134	failure("Its ctime should be excluded");
135	assertEqualInt(1, archive_match_time_excluded(m, ae));
136	assertEqualInt(1, archive_match_excluded(m, ae));
137
138
139	/* Test2: Allow equal or newer time. */
140	assertEqualIntA(m, 0, archive_match_include_date(m,
141	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
142	    ARCHIVE_MATCH_NEWER | ARCHIVE_MATCH_EQUAL,
143	    "1980/2/1 0:0:0 UTC"));
144
145	archive_entry_copy_pathname(ae, "file1");
146	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
147	archive_entry_set_mtime(ae, t, 0);
148	archive_entry_set_ctime(ae, t, 0);
149	failure("Both Its mtime and ctime should not be excluded");
150	assertEqualInt(0, archive_match_time_excluded(m, ae));
151	assertEqualInt(0, archive_match_excluded(m, ae));
152	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
153	archive_entry_set_mtime(ae, t, 0);
154	archive_entry_set_ctime(ae, t, 0);
155	failure("Both Its mtime and ctime should be excluded");
156	assertEqualInt(1, archive_match_time_excluded(m, ae));
157	assertEqualInt(1, archive_match_excluded(m, ae));
158
159	t = __archive_get_date(now, "1980/2/1 0:0:1 UTC");
160	archive_entry_set_mtime(ae, t, 0);
161	archive_entry_set_ctime(ae, t, 0);
162	failure("Both Its mtime and ctime should not be excluded");
163	assertEqualInt(0, archive_match_time_excluded(m, ae));
164	assertEqualInt(0, archive_match_excluded(m, ae));
165
166	/* Clean up. */
167	archive_entry_free(ae);
168	archive_match_free(m);
169}
170
171static void
172test_newer_time_str_w(void)
173{
174	struct archive_entry *ae;
175	struct archive *m;
176	time_t now, t;
177
178	if (!assert((m = archive_match_new()) != NULL))
179		return;
180	if (!assert((ae = archive_entry_new()) != NULL)) {
181		archive_match_free(m);
182		return;
183	}
184
185	time(&now);
186
187	assertEqualIntA(m, 0, archive_match_include_date_w(m,
188	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
189	    ARCHIVE_MATCH_NEWER, L"1980/2/1 0:0:0 UTC"));
190
191	/* Test1: Allow newer time. */
192	archive_entry_copy_pathname(ae, "file1");
193	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
194	archive_entry_set_mtime(ae, t, 0);
195	archive_entry_set_ctime(ae, t, 0);
196	failure("Both Its mtime and ctime should be excluded");
197	assertEqualInt(1, archive_match_time_excluded(m, ae));
198	assertEqualInt(1, archive_match_excluded(m, ae));
199	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
200	archive_entry_set_mtime(ae, t, 0);
201	archive_entry_set_ctime(ae, t, 0);
202	failure("Both Its mtime and ctime should be excluded");
203	assertEqualInt(1, archive_match_time_excluded(m, ae));
204	assertEqualInt(1, archive_match_excluded(m, ae));
205
206	t = __archive_get_date(now, "1980/2/1 0:0:1 UTC");
207	archive_entry_set_mtime(ae, t, 0);
208	archive_entry_set_ctime(ae, t, 0);
209	failure("Both Its mtime and ctime should not be excluded");
210	assertEqualInt(0, archive_match_time_excluded(m, ae));
211	assertEqualInt(0, archive_match_excluded(m, ae));
212
213	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
214	archive_entry_set_mtime(ae, t, 1);
215	archive_entry_set_ctime(ae, t, 0);
216	failure("Its mtime should be excluded");
217	assertEqualInt(1, archive_match_time_excluded(m, ae));
218	assertEqualInt(1, archive_match_excluded(m, ae));
219
220	archive_entry_set_mtime(ae, t, 0);
221	archive_entry_set_ctime(ae, t, 1);
222	failure("Its ctime should be excluded");
223	assertEqualInt(1, archive_match_time_excluded(m, ae));
224	assertEqualInt(1, archive_match_excluded(m, ae));
225
226
227	/* Test2: Allow equal or newer time. */
228	assertEqualIntA(m, 0, archive_match_include_date_w(m,
229	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
230	    ARCHIVE_MATCH_NEWER | ARCHIVE_MATCH_EQUAL,
231	    L"1980/2/1 0:0:0 UTC"));
232
233	archive_entry_copy_pathname(ae, "file1");
234	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
235	archive_entry_set_mtime(ae, t, 0);
236	archive_entry_set_ctime(ae, t, 0);
237	failure("Both Its mtime and ctime should not be excluded");
238	assertEqualInt(0, archive_match_time_excluded(m, ae));
239	assertEqualInt(0, archive_match_excluded(m, ae));
240	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
241	archive_entry_set_mtime(ae, t, 0);
242	archive_entry_set_ctime(ae, t, 0);
243	failure("Both Its mtime and ctime should be excluded");
244	assertEqualInt(1, archive_match_time_excluded(m, ae));
245	assertEqualInt(1, archive_match_excluded(m, ae));
246
247	t = __archive_get_date(now, "1980/2/1 0:0:1 UTC");
248	archive_entry_set_mtime(ae, t, 0);
249	archive_entry_set_ctime(ae, t, 0);
250	failure("Both Its mtime and ctime should not be excluded");
251	assertEqualInt(0, archive_match_time_excluded(m, ae));
252	assertEqualInt(0, archive_match_excluded(m, ae));
253
254	/* Clean up. */
255	archive_entry_free(ae);
256	archive_match_free(m);
257}
258
259static void
260test_newer_mtime_than_file_mbs(void)
261{
262	struct archive *a;
263	struct archive_entry *ae;
264	struct archive *m;
265
266	if (!assert((m = archive_match_new()) != NULL))
267		return;
268	if (!assert((ae = archive_entry_new()) != NULL)) {
269		archive_match_free(m);
270		return;
271	}
272	if (!assert((a = archive_read_disk_new()) != NULL)) {
273		archive_match_free(m);
274		archive_entry_free(ae);
275		return;
276	}
277
278	/*
279	 * Test: newer mtime than a file specified in MBS file name.
280	 */
281	assertEqualIntA(m, 0, archive_match_include_file_time(m,
282	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_NEWER, "mid_mtime"));
283
284	/* Verify 'old_mtime' file. */
285	archive_entry_copy_pathname(ae, "old_mtime");
286	assertEqualIntA(a, ARCHIVE_OK,
287	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
288	failure("old_mtime should be excluded");
289	assertEqualInt(1, archive_match_time_excluded(m, ae));
290	assertEqualInt(1, archive_match_excluded(m, ae));
291
292	/* Verify 'mid_mtime' file. */
293	archive_entry_clear(ae);
294	archive_entry_copy_pathname(ae, "mid_mtime");
295	assertEqualIntA(a, ARCHIVE_OK,
296	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
297	failure("mid_mtime should be excluded");
298	assertEqualInt(1, archive_match_time_excluded(m, ae));
299	assertEqualInt(1, archive_match_excluded(m, ae));
300
301	/* Verify 'new_mtime' file. */
302	archive_entry_clear(ae);
303	archive_entry_copy_pathname(ae, "new_mtime");
304	assertEqualIntA(a, ARCHIVE_OK,
305	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
306	failure("new_mtime should not be excluded");
307	assertEqualInt(0, archive_match_time_excluded(m, ae));
308	assertEqualInt(0, archive_match_excluded(m, ae));
309
310	/* Clean up. */
311	archive_read_free(a);
312	archive_entry_free(ae);
313	archive_match_free(m);
314}
315
316static void
317test_newer_ctime_than_file_mbs(void)
318{
319	struct archive *a;
320	struct archive_entry *ae;
321	struct archive *m;
322
323	if (!assert((m = archive_match_new()) != NULL))
324		return;
325	if (!assert((ae = archive_entry_new()) != NULL)) {
326		archive_match_free(m);
327		return;
328	}
329	if (!assert((a = archive_read_disk_new()) != NULL)) {
330		archive_match_free(m);
331		archive_entry_free(ae);
332		return;
333	}
334
335	/*
336	 * Test: newer ctime than a file specified in MBS file name.
337	 */
338	assertEqualIntA(m, 0, archive_match_include_file_time(m,
339	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_NEWER, "mid_ctime"));
340
341	/* Verify 'old_ctime' file. */
342	archive_entry_copy_pathname(ae, "old_ctime");
343	assertEqualIntA(a, ARCHIVE_OK,
344	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
345	failure("old_ctime should be excluded");
346	assertEqualInt(1, archive_match_time_excluded(m, ae));
347	assertEqualInt(1, archive_match_excluded(m, ae));
348
349	/* Verify 'mid_ctime' file. */
350	archive_entry_clear(ae);
351	archive_entry_copy_pathname(ae, "mid_ctime");
352	assertEqualIntA(a, ARCHIVE_OK,
353	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
354	failure("mid_ctime should be excluded");
355	assertEqualInt(1, archive_match_time_excluded(m, ae));
356	assertEqualInt(1, archive_match_excluded(m, ae));
357
358	/* Verify 'new_ctime' file. */
359	archive_entry_clear(ae);
360	archive_entry_copy_pathname(ae, "new_ctime");
361	assertEqualIntA(a, ARCHIVE_OK,
362	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
363	failure("new_ctime should not be excluded");
364	assertEqualInt(0, archive_match_time_excluded(m, ae));
365	assertEqualInt(0, archive_match_excluded(m, ae));
366
367	/* Clean up. */
368	archive_read_free(a);
369	archive_entry_free(ae);
370	archive_match_free(m);
371}
372
373static void
374test_newer_mtime_than_file_wcs(void)
375{
376	struct archive *a;
377	struct archive_entry *ae;
378	struct archive *m;
379
380	if (!assert((m = archive_match_new()) != NULL))
381		return;
382	if (!assert((ae = archive_entry_new()) != NULL)) {
383		archive_match_free(m);
384		return;
385	}
386	if (!assert((a = archive_read_disk_new()) != NULL)) {
387		archive_match_free(m);
388		archive_entry_free(ae);
389		return;
390	}
391
392	/*
393	 * Test: newer mtime than a file specified in WCS file name.
394	 */
395	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
396	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_NEWER, L"mid_mtime"));
397
398	/* Verify 'old_mtime' file. */
399	archive_entry_copy_pathname(ae, "old_mtime");
400	assertEqualIntA(a, ARCHIVE_OK,
401	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
402	failure("old_mtime should be excluded");
403	assertEqualInt(1, archive_match_time_excluded(m, ae));
404	assertEqualInt(1, archive_match_excluded(m, ae));
405
406	/* Verify 'mid_mtime' file. */
407	archive_entry_clear(ae);
408	archive_entry_copy_pathname(ae, "mid_mtime");
409	assertEqualIntA(a, ARCHIVE_OK,
410	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
411	failure("mid_mtime should be excluded");
412	assertEqualInt(1, archive_match_time_excluded(m, ae));
413	assertEqualInt(1, archive_match_excluded(m, ae));
414
415	/* Verify 'new_mtime' file. */
416	archive_entry_clear(ae);
417	archive_entry_copy_pathname(ae, "new_mtime");
418	assertEqualIntA(a, ARCHIVE_OK,
419	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
420	failure("new_mtime should not be excluded");
421	assertEqualInt(0, archive_match_time_excluded(m, ae));
422	assertEqualInt(0, archive_match_excluded(m, ae));
423
424	/* Clean up. */
425	archive_read_free(a);
426	archive_entry_free(ae);
427	archive_match_free(m);
428}
429
430static void
431test_newer_ctime_than_file_wcs(void)
432{
433	struct archive *a;
434	struct archive_entry *ae;
435	struct archive *m;
436
437	if (!assert((m = archive_match_new()) != NULL))
438		return;
439	if (!assert((ae = archive_entry_new()) != NULL)) {
440		archive_match_free(m);
441		return;
442	}
443	if (!assert((a = archive_read_disk_new()) != NULL)) {
444		archive_match_free(m);
445		archive_entry_free(ae);
446		return;
447	}
448
449	/*
450	 * Test: newer ctime than a file specified in WCS file name.
451	 */
452	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
453	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_NEWER, L"mid_ctime"));
454
455	/* Verify 'old_ctime' file. */
456	archive_entry_clear(ae);
457	archive_entry_copy_pathname(ae, "old_ctime");
458	assertEqualIntA(a, ARCHIVE_OK,
459	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
460	failure("old_ctime should be excluded");
461	assertEqualInt(1, archive_match_time_excluded(m, ae));
462	assertEqualInt(1, archive_match_excluded(m, ae));
463
464	/* Verify 'mid_ctime' file. */
465	archive_entry_clear(ae);
466	archive_entry_copy_pathname(ae, "mid_ctime");
467	assertEqualIntA(a, ARCHIVE_OK,
468	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
469	failure("mid_ctime should be excluded");
470	assertEqualInt(1, archive_match_time_excluded(m, ae));
471	assertEqualInt(1, archive_match_excluded(m, ae));
472
473	/* Verify 'new_ctime' file. */
474	archive_entry_clear(ae);
475	archive_entry_copy_pathname(ae, "new_ctime");
476	assertEqualIntA(a, ARCHIVE_OK,
477	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
478	failure("new_ctime should not be excluded");
479	assertEqualInt(0, archive_match_time_excluded(m, ae));
480	assertEqualInt(0, archive_match_excluded(m, ae));
481
482	/* Clean up. */
483	archive_read_free(a);
484	archive_entry_free(ae);
485	archive_match_free(m);
486}
487
488static void
489test_older_time(void)
490{
491	struct archive_entry *ae;
492	struct archive *m;
493
494	if (!assert((m = archive_match_new()) != NULL))
495		return;
496	if (!assert((ae = archive_entry_new()) != NULL)) {
497		archive_match_free(m);
498		return;
499	}
500
501	assertEqualIntA(m, 0, archive_match_include_time(m,
502	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
503	    ARCHIVE_MATCH_OLDER, 7880, 0));
504
505	archive_entry_copy_pathname(ae, "file1");
506	archive_entry_set_mtime(ae, 7880, 0);
507	archive_entry_set_ctime(ae, 7880, 0);
508	failure("Both Its mtime and ctime should be excluded");
509	assertEqualInt(1, archive_match_time_excluded(m, ae));
510	assertEqualInt(1, archive_match_excluded(m, ae));
511	archive_entry_set_mtime(ae, 7879, 999);
512	archive_entry_set_ctime(ae, 7879, 999);
513	failure("Both Its mtime and ctime should not be excluded");
514	assertEqualInt(0, archive_match_time_excluded(m, ae));
515	assertEqualInt(0, archive_match_excluded(m, ae));
516
517	archive_entry_set_mtime(ae, 7881, 0);
518	archive_entry_set_ctime(ae, 7881, 0);
519	failure("Both Its mtime and ctime should be excluded");
520	assertEqualInt(1, archive_match_time_excluded(m, ae));
521	assertEqualInt(1, archive_match_excluded(m, ae));
522
523	archive_entry_set_mtime(ae, 7880, 1);
524	archive_entry_set_ctime(ae, 7879, 0);
525	failure("Its mtime should be excluded");
526	assertEqualInt(1, archive_match_time_excluded(m, ae));
527	assertEqualInt(1, archive_match_excluded(m, ae));
528
529	archive_entry_set_mtime(ae, 7879, 0);
530	archive_entry_set_ctime(ae, 7880, 1);
531	failure("Its ctime should be excluded");
532	assertEqualInt(1, archive_match_time_excluded(m, ae));
533	assertEqualInt(1, archive_match_excluded(m, ae));
534
535	/* Clean up. */
536	archive_entry_free(ae);
537	archive_match_free(m);
538}
539
540static void
541test_older_time_str(void)
542{
543	struct archive_entry *ae;
544	struct archive *m;
545	time_t now, t;
546
547	if (!assert((m = archive_match_new()) != NULL))
548		return;
549	if (!assert((ae = archive_entry_new()) != NULL)) {
550		archive_match_free(m);
551		return;
552	}
553
554	time(&now);
555
556	/* Test1: Allow newer time. */
557	assertEqualIntA(m, 0, archive_match_include_date(m,
558	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
559	    ARCHIVE_MATCH_OLDER, "1980/2/1 0:0:0 UTC"));
560
561	archive_entry_copy_pathname(ae, "file1");
562	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
563	archive_entry_set_mtime(ae, t, 0);
564	archive_entry_set_ctime(ae, t, 0);
565	failure("Both Its mtime and ctime should be excluded");
566	assertEqualInt(1, archive_match_time_excluded(m, ae));
567	assertEqualInt(1, archive_match_excluded(m, ae));
568	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
569	archive_entry_set_mtime(ae, t, 0);
570	archive_entry_set_ctime(ae, t, 0);
571	failure("Both Its mtime and ctime should not be excluded");
572	assertEqualInt(0, archive_match_time_excluded(m, ae));
573	assertEqualInt(0, archive_match_excluded(m, ae));
574
575	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
576	archive_entry_set_mtime(ae, t, 0);
577	archive_entry_set_ctime(ae, t, 0);
578	failure("Both Its mtime and ctime should be excluded");
579	assertEqualInt(1, archive_match_time_excluded(m, ae));
580	assertEqualInt(1, archive_match_excluded(m, ae));
581
582	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
583	archive_entry_set_mtime(ae, t, 0);
584	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
585	archive_entry_set_ctime(ae, t, 0);
586	failure("Its mtime should be excluded");
587	assertEqualInt(1, archive_match_time_excluded(m, ae));
588	assertEqualInt(1, archive_match_excluded(m, ae));
589
590	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
591	archive_entry_set_mtime(ae, t, 0);
592	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
593	archive_entry_set_ctime(ae, t, 0);
594	failure("Its ctime should be excluded");
595	assertEqualInt(1, archive_match_time_excluded(m, ae));
596	assertEqualInt(1, archive_match_excluded(m, ae));
597
598	/* Test2: Allow equal or newer time. */
599	assertEqualIntA(m, 0, archive_match_include_date(m,
600	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
601	    ARCHIVE_MATCH_OLDER | ARCHIVE_MATCH_EQUAL,
602	    "1980/2/1 0:0:0 UTC"));
603
604	archive_entry_copy_pathname(ae, "file1");
605	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
606	archive_entry_set_mtime(ae, t, 0);
607	archive_entry_set_ctime(ae, t, 0);
608	failure("Both Its mtime and ctime should not be excluded");
609	assertEqualInt(0, archive_match_time_excluded(m, ae));
610	assertEqualInt(0, archive_match_excluded(m, ae));
611	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
612	archive_entry_set_mtime(ae, t, 0);
613	archive_entry_set_ctime(ae, t, 0);
614	failure("Both Its mtime and ctime should not be excluded");
615	assertEqualInt(0, archive_match_time_excluded(m, ae));
616	assertEqualInt(0, archive_match_excluded(m, ae));
617
618	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
619	archive_entry_set_mtime(ae, t, 0);
620	archive_entry_set_ctime(ae, t, 0);
621	failure("Both Its mtime and ctime should be excluded");
622	assertEqualInt(1, archive_match_time_excluded(m, ae));
623	assertEqualInt(1, archive_match_excluded(m, ae));
624
625	/* Clean up. */
626	archive_entry_free(ae);
627	archive_match_free(m);
628}
629
630static void
631test_older_time_str_w(void)
632{
633	struct archive_entry *ae;
634	struct archive *m;
635	time_t now, t;
636
637	if (!assert((m = archive_match_new()) != NULL))
638		return;
639	if (!assert((ae = archive_entry_new()) != NULL)) {
640		archive_match_free(m);
641		return;
642	}
643
644	time(&now);
645
646	/* Test1: Allow newer time. */
647	assertEqualIntA(m, 0, archive_match_include_date_w(m,
648	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
649	    ARCHIVE_MATCH_OLDER, L"1980/2/1 0:0:0 UTC"));
650
651	archive_entry_copy_pathname(ae, "file1");
652	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
653	archive_entry_set_mtime(ae, t, 0);
654	archive_entry_set_ctime(ae, t, 0);
655	failure("Both Its mtime and ctime should be excluded");
656	assertEqualInt(1, archive_match_time_excluded(m, ae));
657	assertEqualInt(1, archive_match_excluded(m, ae));
658	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
659	archive_entry_set_mtime(ae, t, 0);
660	archive_entry_set_ctime(ae, t, 0);
661	failure("Both Its mtime and ctime should not be excluded");
662	assertEqualInt(0, archive_match_time_excluded(m, ae));
663	assertEqualInt(0, archive_match_excluded(m, ae));
664
665	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
666	archive_entry_set_mtime(ae, t, 0);
667	archive_entry_set_ctime(ae, t, 0);
668	failure("Both Its mtime and ctime should be excluded");
669	assertEqualInt(1, archive_match_time_excluded(m, ae));
670	assertEqualInt(1, archive_match_excluded(m, ae));
671
672	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
673	archive_entry_set_mtime(ae, t, 0);
674	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
675	archive_entry_set_ctime(ae, t, 0);
676	failure("Its mtime should be excluded");
677	assertEqualInt(1, archive_match_time_excluded(m, ae));
678	assertEqualInt(1, archive_match_excluded(m, ae));
679
680	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
681	archive_entry_set_mtime(ae, t, 0);
682	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
683	archive_entry_set_ctime(ae, t, 0);
684	failure("Its ctime should be excluded");
685	assertEqualInt(1, archive_match_time_excluded(m, ae));
686	assertEqualInt(1, archive_match_excluded(m, ae));
687
688	/* Test2: Allow equal or newer time. */
689	assertEqualIntA(m, 0, archive_match_include_date_w(m,
690	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_CTIME |
691	    ARCHIVE_MATCH_OLDER | ARCHIVE_MATCH_EQUAL,
692	    L"1980/2/1 0:0:0 UTC"));
693
694	archive_entry_copy_pathname(ae, "file1");
695	t = __archive_get_date(now, "1980/2/1 0:0:0 UTC");
696	archive_entry_set_mtime(ae, t, 0);
697	archive_entry_set_ctime(ae, t, 0);
698	failure("Both Its mtime and ctime should not be excluded");
699	assertEqualInt(0, archive_match_time_excluded(m, ae));
700	assertEqualInt(0, archive_match_excluded(m, ae));
701	t = __archive_get_date(now, "1980/1/1 0:0:0 UTC");
702	archive_entry_set_mtime(ae, t, 0);
703	archive_entry_set_ctime(ae, t, 0);
704	failure("Both Its mtime and ctime should not be excluded");
705	assertEqualInt(0, archive_match_time_excluded(m, ae));
706	assertEqualInt(0, archive_match_excluded(m, ae));
707
708	t = __archive_get_date(now, "1980/3/1 0:0:0 UTC");
709	archive_entry_set_mtime(ae, t, 0);
710	archive_entry_set_ctime(ae, t, 0);
711	failure("Both Its mtime and ctime should be excluded");
712	assertEqualInt(1, archive_match_time_excluded(m, ae));
713	assertEqualInt(1, archive_match_excluded(m, ae));
714
715	/* Clean up. */
716	archive_entry_free(ae);
717	archive_match_free(m);
718}
719
720static void
721test_older_mtime_than_file_mbs(void)
722{
723	struct archive *a;
724	struct archive_entry *ae;
725	struct archive *m;
726
727	if (!assert((m = archive_match_new()) != NULL))
728		return;
729	if (!assert((ae = archive_entry_new()) != NULL)) {
730		archive_match_free(m);
731		return;
732	}
733	if (!assert((a = archive_read_disk_new()) != NULL)) {
734		archive_match_free(m);
735		archive_entry_free(ae);
736		return;
737	}
738
739	/*
740	 * Test: older mtime than a file specified in MBS file name.
741	 */
742	assertEqualIntA(m, 0, archive_match_include_file_time(m,
743	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER, "mid_mtime"));
744
745	/* Verify 'old_mtime' file. */
746	archive_entry_copy_pathname(ae, "old_mtime");
747	assertEqualIntA(a, ARCHIVE_OK,
748	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
749	failure("old_mtime should not be excluded");
750	assertEqualInt(0, archive_match_time_excluded(m, ae));
751	assertEqualInt(0, archive_match_excluded(m, ae));
752
753	/* Verify 'mid_mtime' file. */
754	archive_entry_clear(ae);
755	archive_entry_copy_pathname(ae, "mid_mtime");
756	assertEqualIntA(a, ARCHIVE_OK,
757	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
758	failure("mid_mtime should be excluded");
759	assertEqualInt(1, archive_match_time_excluded(m, ae));
760	assertEqualInt(1, archive_match_excluded(m, ae));
761
762	/* Verify 'new_mtime' file. */
763	archive_entry_clear(ae);
764	archive_entry_copy_pathname(ae, "new_mtime");
765	assertEqualIntA(a, ARCHIVE_OK,
766	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
767	failure("new_mtime should be excluded");
768	assertEqualInt(1, archive_match_time_excluded(m, ae));
769	assertEqualInt(1, archive_match_excluded(m, ae));
770
771	/* Clean up. */
772	archive_read_free(a);
773	archive_entry_free(ae);
774	archive_match_free(m);
775}
776
777static void
778test_older_ctime_than_file_mbs(void)
779{
780	struct archive *a;
781	struct archive_entry *ae;
782	struct archive *m;
783
784	if (!assert((m = archive_match_new()) != NULL))
785		return;
786	if (!assert((ae = archive_entry_new()) != NULL)) {
787		archive_match_free(m);
788		return;
789	}
790	if (!assert((a = archive_read_disk_new()) != NULL)) {
791		archive_match_free(m);
792		archive_entry_free(ae);
793		return;
794	}
795
796	/*
797	 * Test: older ctime than a file specified in MBS file name.
798	 */
799	assertEqualIntA(m, 0, archive_match_include_file_time(m,
800	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_OLDER, "mid_ctime"));
801
802	/* Verify 'old_ctime' file. */
803	archive_entry_clear(ae);
804	archive_entry_copy_pathname(ae, "old_ctime");
805	assertEqualIntA(a, ARCHIVE_OK,
806	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
807	failure("old_ctime should not be excluded");
808	assertEqualInt(0, archive_match_time_excluded(m, ae));
809	assertEqualInt(0, archive_match_excluded(m, ae));
810
811	/* Verify 'mid_ctime' file. */
812	archive_entry_clear(ae);
813	archive_entry_copy_pathname(ae, "mid_ctime");
814	assertEqualIntA(a, ARCHIVE_OK,
815	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
816	failure("mid_ctime should be excluded");
817	assertEqualInt(1, archive_match_time_excluded(m, ae));
818	assertEqualInt(1, archive_match_excluded(m, ae));
819
820	/* Verify 'new_ctime' file. */
821	archive_entry_clear(ae);
822	archive_entry_copy_pathname(ae, "new_ctime");
823	assertEqualIntA(a, ARCHIVE_OK,
824	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
825	failure("new_ctime should be excluded");
826	assertEqualInt(1, archive_match_time_excluded(m, ae));
827	assertEqualInt(1, archive_match_excluded(m, ae));
828
829	/* Clean up. */
830	archive_read_free(a);
831	archive_entry_free(ae);
832	archive_match_free(m);
833}
834
835static void
836test_older_mtime_than_file_wcs(void)
837{
838	struct archive *a;
839	struct archive_entry *ae;
840	struct archive *m;
841
842	if (!assert((m = archive_match_new()) != NULL))
843		return;
844	if (!assert((ae = archive_entry_new()) != NULL)) {
845		archive_match_free(m);
846		return;
847	}
848	if (!assert((a = archive_read_disk_new()) != NULL)) {
849		archive_match_free(m);
850		archive_entry_free(ae);
851		return;
852	}
853
854	/*
855	 * Test: older mtime than a file specified in WCS file name.
856	 */
857	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
858	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER, L"mid_mtime"));
859
860	/* Verify 'old_mtime' file. */
861	archive_entry_copy_pathname(ae, "old_mtime");
862	assertEqualIntA(a, ARCHIVE_OK,
863	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
864	failure("old_mtime should not be excluded");
865	assertEqualInt(0, archive_match_time_excluded(m, ae));
866	assertEqualInt(0, archive_match_excluded(m, ae));
867
868	/* Verify 'mid_mtime' file. */
869	archive_entry_clear(ae);
870	archive_entry_copy_pathname(ae, "mid_mtime");
871	assertEqualIntA(a, ARCHIVE_OK,
872	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
873	failure("mid_mtime should be excluded");
874	assertEqualInt(1, archive_match_time_excluded(m, ae));
875	assertEqualInt(1, archive_match_excluded(m, ae));
876
877	/* Verify 'new_mtime' file. */
878	archive_entry_clear(ae);
879	archive_entry_copy_pathname(ae, "new_mtime");
880	assertEqualIntA(a, ARCHIVE_OK,
881	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
882	failure("new_mtime should be excluded");
883	assertEqualInt(1, archive_match_time_excluded(m, ae));
884	assertEqualInt(1, archive_match_excluded(m, ae));
885
886	/* Clean up. */
887	archive_read_free(a);
888	archive_entry_free(ae);
889	archive_match_free(m);
890}
891
892static void
893test_older_ctime_than_file_wcs(void)
894{
895	struct archive *a;
896	struct archive_entry *ae;
897	struct archive *m;
898
899	if (!assert((m = archive_match_new()) != NULL))
900		return;
901	if (!assert((ae = archive_entry_new()) != NULL)) {
902		archive_match_free(m);
903		return;
904	}
905	if (!assert((a = archive_read_disk_new()) != NULL)) {
906		archive_match_free(m);
907		archive_entry_free(ae);
908		return;
909	}
910
911	/*
912	 * Test: older ctime than a file specified in WCS file name.
913	 */
914	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
915	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_OLDER, L"mid_ctime"));
916
917	/* Verify 'old_ctime' file. */
918	archive_entry_clear(ae);
919	archive_entry_copy_pathname(ae, "old_ctime");
920	assertEqualIntA(a, ARCHIVE_OK,
921	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
922	failure("old_ctime should not be excluded");
923	assertEqualInt(0, archive_match_time_excluded(m, ae));
924	assertEqualInt(0, archive_match_excluded(m, ae));
925
926	/* Verify 'mid_ctime' file. */
927	archive_entry_clear(ae);
928	archive_entry_copy_pathname(ae, "mid_ctime");
929	assertEqualIntA(a, ARCHIVE_OK,
930	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
931	failure("mid_ctime should be excluded");
932	assertEqualInt(1, archive_match_time_excluded(m, ae));
933	assertEqualInt(1, archive_match_excluded(m, ae));
934
935	/* Verify 'new_ctime' file. */
936	archive_entry_clear(ae);
937	archive_entry_copy_pathname(ae, "new_ctime");
938	assertEqualIntA(a, ARCHIVE_OK,
939	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
940	failure("new_ctime should be excluded");
941	assertEqualInt(1, archive_match_time_excluded(m, ae));
942	assertEqualInt(1, archive_match_excluded(m, ae));
943
944	/* Clean up. */
945	archive_read_free(a);
946	archive_entry_free(ae);
947	archive_match_free(m);
948}
949
950static void
951test_mtime_between_files_mbs(void)
952{
953	struct archive *a;
954	struct archive_entry *ae;
955	struct archive *m;
956
957	if (!assert((m = archive_match_new()) != NULL))
958		return;
959	if (!assert((ae = archive_entry_new()) != NULL)) {
960		archive_match_free(m);
961		return;
962	}
963	if (!assert((a = archive_read_disk_new()) != NULL)) {
964		archive_match_free(m);
965		archive_entry_free(ae);
966		return;
967	}
968
969	/*
970	 * Test: mtime between  file specified in MBS file name.
971	 */
972	assertEqualIntA(m, 0, archive_match_include_file_time(m,
973	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_NEWER, "old_mtime"));
974	assertEqualIntA(m, 0, archive_match_include_file_time(m,
975	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER, "new_mtime"));
976
977	/* Verify 'old_mtime' file. */
978	archive_entry_copy_pathname(ae, "old_mtime");
979	assertEqualIntA(a, ARCHIVE_OK,
980	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
981	failure("old_mtime should be excluded");
982	assertEqualInt(1, archive_match_time_excluded(m, ae));
983	assertEqualInt(1, archive_match_excluded(m, ae));
984
985	/* Verify 'mid_mtime' file. */
986	archive_entry_clear(ae);
987	archive_entry_copy_pathname(ae, "mid_mtime");
988	assertEqualIntA(a, ARCHIVE_OK,
989	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
990	failure("mid_mtime should not be excluded");
991	assertEqualInt(0, archive_match_time_excluded(m, ae));
992	assertEqualInt(0, archive_match_excluded(m, ae));
993
994	/* Verify 'new_mtime' file. */
995	archive_entry_clear(ae);
996	archive_entry_copy_pathname(ae, "new_mtime");
997	assertEqualIntA(a, ARCHIVE_OK,
998	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
999	failure("new_mtime should be excluded");
1000	assertEqualInt(1, archive_match_time_excluded(m, ae));
1001	assertEqualInt(1, archive_match_excluded(m, ae));
1002
1003	/* Clean up. */
1004	archive_read_free(a);
1005	archive_entry_free(ae);
1006	archive_match_free(m);
1007}
1008
1009static void
1010test_mtime_between_files_wcs(void)
1011{
1012	struct archive *a;
1013	struct archive_entry *ae;
1014	struct archive *m;
1015
1016	if (!assert((m = archive_match_new()) != NULL))
1017		return;
1018	if (!assert((ae = archive_entry_new()) != NULL)) {
1019		archive_match_free(m);
1020		return;
1021	}
1022	if (!assert((a = archive_read_disk_new()) != NULL)) {
1023		archive_match_free(m);
1024		archive_entry_free(ae);
1025		return;
1026	}
1027
1028	/*
1029	 * Test: mtime between  file specified in WCS file name.
1030	 */
1031	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
1032	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_NEWER, L"old_mtime"));
1033	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
1034	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER, L"new_mtime"));
1035
1036	/* Verify 'old_mtime' file. */
1037	archive_entry_copy_pathname(ae, "old_mtime");
1038	assertEqualIntA(a, ARCHIVE_OK,
1039	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1040	failure("old_mtime should be excluded");
1041	assertEqualInt(1, archive_match_time_excluded(m, ae));
1042	assertEqualInt(1, archive_match_excluded(m, ae));
1043
1044	/* Verify 'mid_mtime' file. */
1045	archive_entry_clear(ae);
1046	archive_entry_copy_pathname(ae, "mid_mtime");
1047	assertEqualIntA(a, ARCHIVE_OK,
1048	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1049	failure("mid_mtime should not be excluded");
1050	assertEqualInt(0, archive_match_time_excluded(m, ae));
1051	assertEqualInt(0, archive_match_excluded(m, ae));
1052
1053	/* Verify 'new_mtime' file. */
1054	archive_entry_clear(ae);
1055	archive_entry_copy_pathname(ae, "new_mtime");
1056	assertEqualIntA(a, ARCHIVE_OK,
1057	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1058	failure("new_mtime should be excluded");
1059	assertEqualInt(1, archive_match_time_excluded(m, ae));
1060	assertEqualInt(1, archive_match_excluded(m, ae));
1061
1062	/* Clean up. */
1063	archive_read_free(a);
1064	archive_entry_free(ae);
1065	archive_match_free(m);
1066}
1067
1068static void
1069test_ctime_between_files_mbs(void)
1070{
1071	struct archive *a;
1072	struct archive_entry *ae;
1073	struct archive *m;
1074
1075	if (!assert((m = archive_match_new()) != NULL))
1076		return;
1077	if (!assert((ae = archive_entry_new()) != NULL)) {
1078		archive_match_free(m);
1079		return;
1080	}
1081	if (!assert((a = archive_read_disk_new()) != NULL)) {
1082		archive_match_free(m);
1083		archive_entry_free(ae);
1084		return;
1085	}
1086
1087	/*
1088	 * Test: ctime between files specified in MBS file name.
1089	 */
1090	assertEqualIntA(m, 0, archive_match_include_file_time(m,
1091	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_NEWER, "old_ctime"));
1092	assertEqualIntA(m, 0, archive_match_include_file_time(m,
1093	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_OLDER, "new_ctime"));
1094
1095	/* Verify 'old_ctime' file. */
1096	archive_entry_copy_pathname(ae, "old_ctime");
1097	assertEqualIntA(a, ARCHIVE_OK,
1098	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1099	failure("old_ctime should be excluded");
1100	assertEqualInt(1, archive_match_time_excluded(m, ae));
1101	assertEqualInt(1, archive_match_excluded(m, ae));
1102
1103	/* Verify 'mid_ctime' file. */
1104	archive_entry_clear(ae);
1105	archive_entry_copy_pathname(ae, "mid_ctime");
1106	assertEqualIntA(a, ARCHIVE_OK,
1107	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1108	failure("mid_ctime should not be excluded");
1109	assertEqualInt(0, archive_match_time_excluded(m, ae));
1110	assertEqualInt(0, archive_match_excluded(m, ae));
1111
1112	/* Verify 'new_ctime' file. */
1113	archive_entry_clear(ae);
1114	archive_entry_copy_pathname(ae, "new_ctime");
1115	assertEqualIntA(a, ARCHIVE_OK,
1116	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1117	failure("new_ctime should be excluded");
1118	assertEqualInt(1, archive_match_time_excluded(m, ae));
1119	assertEqualInt(1, archive_match_excluded(m, ae));
1120
1121	/* Clean up. */
1122	archive_read_free(a);
1123	archive_entry_free(ae);
1124	archive_match_free(m);
1125}
1126
1127static void
1128test_ctime_between_files_wcs(void)
1129{
1130	struct archive *a;
1131	struct archive_entry *ae;
1132	struct archive *m;
1133
1134	if (!assert((m = archive_match_new()) != NULL))
1135		return;
1136	if (!assert((ae = archive_entry_new()) != NULL)) {
1137		archive_match_free(m);
1138		return;
1139	}
1140	if (!assert((a = archive_read_disk_new()) != NULL)) {
1141		archive_match_free(m);
1142		archive_entry_free(ae);
1143		return;
1144	}
1145
1146	/*
1147	 * Test: ctime between files specified in WCS file name.
1148	 */
1149	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
1150	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_NEWER, L"old_ctime"));
1151	assertEqualIntA(m, 0, archive_match_include_file_time_w(m,
1152	    ARCHIVE_MATCH_CTIME | ARCHIVE_MATCH_OLDER, L"new_ctime"));
1153
1154	/* Verify 'old_ctime' file. */
1155	archive_entry_copy_pathname(ae, "old_ctime");
1156	assertEqualIntA(a, ARCHIVE_OK,
1157	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1158	failure("old_ctime should be excluded");
1159	assertEqualInt(1, archive_match_time_excluded(m, ae));
1160	assertEqualInt(1, archive_match_excluded(m, ae));
1161
1162	/* Verify 'mid_ctime' file. */
1163	archive_entry_clear(ae);
1164	archive_entry_copy_pathname(ae, "mid_ctime");
1165	assertEqualIntA(a, ARCHIVE_OK,
1166	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1167	failure("mid_ctime should not be excluded");
1168	assertEqualInt(0, archive_match_time_excluded(m, ae));
1169	assertEqualInt(0, archive_match_excluded(m, ae));
1170
1171	/* Verify 'new_ctime' file. */
1172	archive_entry_clear(ae);
1173	archive_entry_copy_pathname(ae, "new_ctime");
1174	assertEqualIntA(a, ARCHIVE_OK,
1175	    archive_read_disk_entry_from_file(a, ae, -1, NULL));
1176	failure("new_ctime should be excluded");
1177	assertEqualInt(1, archive_match_time_excluded(m, ae));
1178	assertEqualInt(1, archive_match_excluded(m, ae));
1179
1180	/* Clean up. */
1181	archive_read_free(a);
1182	archive_entry_free(ae);
1183	archive_match_free(m);
1184}
1185
1186static void
1187excluded(struct archive *m)
1188{
1189	struct archive_entry *ae;
1190
1191	if (!assert((ae = archive_entry_new()) != NULL))
1192		return;
1193
1194	archive_entry_copy_pathname(ae, "file1");
1195	archive_entry_set_mtime(ae, 7879, 999);
1196	failure("It should be excluded");
1197	assertEqualInt(1, archive_match_time_excluded(m, ae));
1198	assertEqualInt(1, archive_match_excluded(m, ae));
1199	archive_entry_set_mtime(ae, 7880, 0);
1200	failure("It should be excluded");
1201	assertEqualInt(1, archive_match_time_excluded(m, ae));
1202	assertEqualInt(1, archive_match_excluded(m, ae));
1203	archive_entry_set_mtime(ae, 7880, 1);
1204	failure("It should not be excluded");
1205	assertEqualInt(0, archive_match_time_excluded(m, ae));
1206	assertEqualInt(0, archive_match_excluded(m, ae));
1207
1208	archive_entry_copy_pathname(ae, "file2");
1209	archive_entry_set_mtime(ae, 7879, 999);
1210	failure("It should not be excluded");
1211	assertEqualInt(0, archive_match_time_excluded(m, ae));
1212	assertEqualInt(0, archive_match_excluded(m, ae));
1213	archive_entry_set_mtime(ae, 7880, 0);
1214	failure("It should not be excluded");
1215	assertEqualInt(0, archive_match_time_excluded(m, ae));
1216	assertEqualInt(0, archive_match_excluded(m, ae));
1217	archive_entry_set_mtime(ae, 7880, 1);
1218	failure("It should not be excluded");
1219	assertEqualInt(0, archive_match_time_excluded(m, ae));
1220	assertEqualInt(0, archive_match_excluded(m, ae));
1221
1222	archive_entry_copy_pathname(ae, "file3");
1223	archive_entry_set_mtime(ae, 7879, 999);
1224	failure("It should be excluded");
1225	assertEqualInt(1, archive_match_time_excluded(m, ae));
1226	assertEqualInt(1, archive_match_excluded(m, ae));
1227	archive_entry_set_mtime(ae, 7880, 0);
1228	failure("It should be excluded");
1229	assertEqualInt(1, archive_match_time_excluded(m, ae));
1230	assertEqualInt(1, archive_match_excluded(m, ae));
1231	archive_entry_set_mtime(ae, 7880, 1);
1232	failure("It should be excluded");
1233	assertEqualInt(1, archive_match_time_excluded(m, ae));
1234	assertEqualInt(1, archive_match_excluded(m, ae));
1235
1236	/*
1237	 * "file4" is not registered, that sort of a file should not be
1238	 * excluded with any mtime.
1239	 */
1240	archive_entry_copy_pathname(ae, "file4");
1241	archive_entry_set_mtime(ae, 7879, 999);
1242	failure("It should not be excluded");
1243	assertEqualInt(0, archive_match_time_excluded(m, ae));
1244	assertEqualInt(0, archive_match_excluded(m, ae));
1245	archive_entry_set_mtime(ae, 7880, 0);
1246	failure("It should not be excluded");
1247	assertEqualInt(0, archive_match_time_excluded(m, ae));
1248	assertEqualInt(0, archive_match_excluded(m, ae));
1249	archive_entry_set_mtime(ae, 7880, 1);
1250	failure("It should not be excluded");
1251	assertEqualInt(0, archive_match_time_excluded(m, ae));
1252	assertEqualInt(0, archive_match_excluded(m, ae));
1253
1254
1255	/* Clean up. */
1256	archive_entry_free(ae);
1257}
1258
1259static void
1260test_pathname_newer_mtime(void)
1261{
1262	struct archive_entry *ae;
1263	struct archive *m;
1264
1265	if (!assert((m = archive_match_new()) != NULL))
1266		return;
1267	if (!assert((ae = archive_entry_new()) != NULL)) {
1268		archive_match_free(m);
1269		return;
1270	}
1271
1272	archive_entry_copy_pathname(ae, "file1");
1273	archive_entry_set_mtime(ae, 7880, 0);
1274	assertEqualIntA(m, 0, archive_match_exclude_entry(m,
1275	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER |
1276	    ARCHIVE_MATCH_EQUAL, ae));
1277	archive_entry_copy_pathname(ae, "file2");
1278	archive_entry_set_mtime(ae, 1, 0);
1279	assertEqualIntA(m, 0, archive_match_exclude_entry(m,
1280	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER |
1281	    ARCHIVE_MATCH_EQUAL, ae));
1282	archive_entry_copy_pathname(ae, "file3");
1283	archive_entry_set_mtime(ae, 99999, 0);
1284	assertEqualIntA(m, 0, archive_match_exclude_entry(m,
1285	    ARCHIVE_MATCH_MTIME | ARCHIVE_MATCH_OLDER |
1286	    ARCHIVE_MATCH_EQUAL, ae));
1287
1288	excluded(m);
1289
1290	/* Clean up. */
1291	archive_entry_free(ae);
1292	archive_match_free(m);
1293}
1294
1295DEFINE_TEST(test_archive_match_time)
1296{
1297	struct stat st;
1298
1299	/* Test: matching newer times. */
1300	test_newer_time();
1301	test_newer_time_str();
1302	test_newer_time_str_w();
1303	/* Test: matching older times. */
1304	test_older_time();
1305	test_older_time_str();
1306	test_older_time_str_w();
1307
1308	/*
1309	 * Create sample files for tests matching mtime.
1310	 * ctimes of those files may be all the same or the ctime of
1311	 * new_mtime may be older than old_mtime.
1312	 */
1313	assertMakeFile("new_mtime", 0666, "new");
1314	assertUtimes("new_mtime", 10002, 0, 10002, 0);
1315	assertMakeFile("mid_mtime", 0666, "mid");
1316	assertUtimes("mid_mtime", 10001, 0, 10001, 0);
1317	assertMakeFile("old_mtime", 0666, "old");
1318	assertUtimes("old_mtime", 10000, 0, 10000, 0);
1319
1320	/*
1321	 * Create sample files for tests matching ctime.
1322	 * the mtime of mid_ctime is older than old_ctime and also the mtime
1323	 * of new_ctime is older than both mid_ctime and old_ctime.
1324	 */
1325	assertMakeFile("old_ctime", 0666, "old");
1326	assertUtimes("old_ctime", 10002, 0, 10002, 0);
1327	assertEqualInt(0, stat("old_ctime", &st));
1328	sleepUntilAfter(st.st_ctime);
1329	assertMakeFile("mid_ctime", 0666, "mid");
1330	assertUtimes("mid_ctime", 10001, 0, 10001, 0);
1331	assertEqualInt(0, stat("mid_ctime", &st));
1332	sleepUntilAfter(st.st_ctime);
1333	assertMakeFile("new_ctime", 0666, "new");
1334	assertUtimes("new_ctime", 10000, 0, 10000, 0);
1335
1336	/*
1337	 * Test: matching mtime which indicated by files on the disk.
1338	 */
1339	test_newer_mtime_than_file_mbs();
1340	test_newer_mtime_than_file_wcs();
1341	test_older_mtime_than_file_mbs();
1342	test_older_mtime_than_file_wcs();
1343	test_mtime_between_files_mbs();
1344	test_mtime_between_files_wcs();
1345
1346	/*
1347	 * Test: matching ctime which indicated by files on the disk.
1348	 */
1349	test_newer_ctime_than_file_mbs();
1350	test_newer_ctime_than_file_wcs();
1351	test_older_ctime_than_file_mbs();
1352	test_older_ctime_than_file_wcs();
1353	test_ctime_between_files_mbs();
1354	test_ctime_between_files_wcs();
1355
1356	/* Test: matching both pathname and mtime. */
1357	test_pathname_newer_mtime();
1358}
1359