Blame


1 8704c7ce 2021-03-10 stsp /*
2 8704c7ce 2021-03-10 stsp * Copyright (c) 2021 Stefan Sperling <stsp@openbsd.org>
3 8704c7ce 2021-03-10 stsp *
4 8704c7ce 2021-03-10 stsp * Permission to use, copy, modify, and distribute this software for any
5 8704c7ce 2021-03-10 stsp * purpose with or without fee is hereby granted, provided that the above
6 8704c7ce 2021-03-10 stsp * copyright notice and this permission notice appear in all copies.
7 8704c7ce 2021-03-10 stsp *
8 8704c7ce 2021-03-10 stsp * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 8704c7ce 2021-03-10 stsp * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 8704c7ce 2021-03-10 stsp * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 8704c7ce 2021-03-10 stsp * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 8704c7ce 2021-03-10 stsp * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 8704c7ce 2021-03-10 stsp * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 8704c7ce 2021-03-10 stsp * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 8704c7ce 2021-03-10 stsp */
16 8704c7ce 2021-03-10 stsp
17 8704c7ce 2021-03-10 stsp #include <sys/queue.h>
18 8704c7ce 2021-03-10 stsp
19 8704c7ce 2021-03-10 stsp #include <stdio.h>
20 8704c7ce 2021-03-10 stsp #include <stdlib.h>
21 8704c7ce 2021-03-10 stsp #include <string.h>
22 8704c7ce 2021-03-10 stsp #include <err.h>
23 8704c7ce 2021-03-10 stsp #include <unistd.h>
24 8704c7ce 2021-03-10 stsp #include <getopt.h>
25 8704c7ce 2021-03-10 stsp
26 8704c7ce 2021-03-10 stsp #include "got_error.h"
27 8704c7ce 2021-03-10 stsp #include "got_opentemp.h"
28 8704c7ce 2021-03-10 stsp
29 8704c7ce 2021-03-10 stsp #include "got_lib_deltify.h"
30 8704c7ce 2021-03-10 stsp
31 8704c7ce 2021-03-10 stsp #ifndef nitems
32 8704c7ce 2021-03-10 stsp #define nitems(_a) (sizeof(_a) / sizeof((_a)[0]))
33 8704c7ce 2021-03-10 stsp #endif
34 8704c7ce 2021-03-10 stsp
35 8704c7ce 2021-03-10 stsp static int
36 8704c7ce 2021-03-10 stsp deltify_abc_axc(void)
37 8704c7ce 2021-03-10 stsp {
38 8704c7ce 2021-03-10 stsp const struct got_error *err = NULL;
39 8704c7ce 2021-03-10 stsp size_t i;
40 8704c7ce 2021-03-10 stsp FILE *base_file, *derived_file, *result_file;
41 8704c7ce 2021-03-10 stsp struct got_delta_table *dt;
42 8704c7ce 2021-03-10 stsp struct got_delta_instruction *deltas;
43 8704c7ce 2021-03-10 stsp int ndeltas;
44 8704c7ce 2021-03-10 stsp int have_nblocks = 0;
45 8704c7ce 2021-03-10 stsp
46 8704c7ce 2021-03-10 stsp base_file = got_opentemp();
47 8704c7ce 2021-03-10 stsp if (base_file == NULL)
48 8704c7ce 2021-03-10 stsp return 1;
49 8704c7ce 2021-03-10 stsp
50 8704c7ce 2021-03-10 stsp derived_file = got_opentemp();
51 8704c7ce 2021-03-10 stsp if (derived_file == NULL)
52 8704c7ce 2021-03-10 stsp return 1;
53 8704c7ce 2021-03-10 stsp
54 8704c7ce 2021-03-10 stsp result_file = got_opentemp();
55 8704c7ce 2021-03-10 stsp if (result_file == NULL)
56 8704c7ce 2021-03-10 stsp return 1;
57 8704c7ce 2021-03-10 stsp
58 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
59 8704c7ce 2021-03-10 stsp fputc('a', base_file);
60 8704c7ce 2021-03-10 stsp fputc('a', derived_file);
61 8704c7ce 2021-03-10 stsp }
62 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
63 8704c7ce 2021-03-10 stsp fputc('b', base_file);
64 8704c7ce 2021-03-10 stsp fputc('x', derived_file);
65 8704c7ce 2021-03-10 stsp }
66 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
67 8704c7ce 2021-03-10 stsp fputc('c', base_file);
68 8704c7ce 2021-03-10 stsp fputc('c', derived_file);
69 8704c7ce 2021-03-10 stsp }
70 8704c7ce 2021-03-10 stsp
71 8704c7ce 2021-03-10 stsp rewind(base_file);
72 8704c7ce 2021-03-10 stsp rewind(derived_file);
73 8704c7ce 2021-03-10 stsp
74 8704c7ce 2021-03-10 stsp err = got_deltify_init(&dt, base_file, 0, 3 * GOT_DELTIFY_MAXCHUNK);
75 8704c7ce 2021-03-10 stsp if (err)
76 8704c7ce 2021-03-10 stsp goto done;
77 8704c7ce 2021-03-10 stsp
78 8704c7ce 2021-03-10 stsp for (i = 0; i < dt->nalloc; i++) {
79 8704c7ce 2021-03-10 stsp if (dt->blocks[i].len > 0)
80 8704c7ce 2021-03-10 stsp have_nblocks++;
81 8704c7ce 2021-03-10 stsp }
82 8704c7ce 2021-03-10 stsp if (have_nblocks != dt->nblocks) {
83 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
84 8704c7ce 2021-03-10 stsp goto done;
85 8704c7ce 2021-03-10 stsp }
86 8704c7ce 2021-03-10 stsp
87 8704c7ce 2021-03-10 stsp err = got_deltify(&deltas, &ndeltas, derived_file, 0,
88 f34b169e 2021-06-18 stsp 3 * GOT_DELTIFY_MAXCHUNK, dt, base_file, 0,
89 f34b169e 2021-06-18 stsp 3 * GOT_DELTIFY_MAXCHUNK);
90 8704c7ce 2021-03-10 stsp if (err)
91 8704c7ce 2021-03-10 stsp goto done;
92 8704c7ce 2021-03-10 stsp
93 8704c7ce 2021-03-10 stsp if (ndeltas != 3) {
94 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
95 8704c7ce 2021-03-10 stsp goto done;
96 8704c7ce 2021-03-10 stsp }
97 8704c7ce 2021-03-10 stsp /* Copy 'aaaa...' from base file. */
98 8704c7ce 2021-03-10 stsp if (!(deltas[0].copy == 1 && deltas[0].offset == 0 &&
99 8704c7ce 2021-03-10 stsp deltas[0].len == GOT_DELTIFY_MAXCHUNK)) {
100 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
101 8704c7ce 2021-03-10 stsp goto done;
102 8704c7ce 2021-03-10 stsp }
103 8704c7ce 2021-03-10 stsp /* Copy 'xxxx...' from derived file. */
104 8704c7ce 2021-03-10 stsp if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK &&
105 8704c7ce 2021-03-10 stsp deltas[1].len == GOT_DELTIFY_MAXCHUNK)) {
106 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
107 8704c7ce 2021-03-10 stsp goto done;
108 8704c7ce 2021-03-10 stsp }
109 8704c7ce 2021-03-10 stsp /* Copy 'ccccc...' from base file. */
110 8704c7ce 2021-03-10 stsp if (!(deltas[2].copy == 1 &&
111 8704c7ce 2021-03-10 stsp deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK &&
112 8704c7ce 2021-03-10 stsp deltas[2].len == GOT_DELTIFY_MAXCHUNK)) {
113 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
114 8704c7ce 2021-03-10 stsp goto done;
115 8704c7ce 2021-03-10 stsp }
116 8704c7ce 2021-03-10 stsp
117 8704c7ce 2021-03-10 stsp done:
118 8704c7ce 2021-03-10 stsp got_deltify_free(dt);
119 8704c7ce 2021-03-10 stsp fclose(base_file);
120 8704c7ce 2021-03-10 stsp fclose(derived_file);
121 8704c7ce 2021-03-10 stsp fclose(result_file);
122 8704c7ce 2021-03-10 stsp return (err == NULL);
123 8704c7ce 2021-03-10 stsp }
124 8704c7ce 2021-03-10 stsp
125 8704c7ce 2021-03-10 stsp static int quiet;
126 8704c7ce 2021-03-10 stsp
127 8704c7ce 2021-03-10 stsp #define RUN_TEST(expr, name) \
128 8704c7ce 2021-03-10 stsp { test_ok = (expr); \
129 8704c7ce 2021-03-10 stsp if (!quiet) printf("test_%s %s\n", (name), test_ok ? "ok" : "failed"); \
130 8704c7ce 2021-03-10 stsp failure = (failure || !test_ok); }
131 8704c7ce 2021-03-10 stsp
132 8704c7ce 2021-03-10 stsp static void
133 8704c7ce 2021-03-10 stsp usage(void)
134 8704c7ce 2021-03-10 stsp {
135 8704c7ce 2021-03-10 stsp fprintf(stderr, "usage: delta_test [-q]\n");
136 8704c7ce 2021-03-10 stsp }
137 8704c7ce 2021-03-10 stsp
138 8704c7ce 2021-03-10 stsp int
139 8704c7ce 2021-03-10 stsp main(int argc, char *argv[])
140 8704c7ce 2021-03-10 stsp {
141 8704c7ce 2021-03-10 stsp int test_ok;
142 8704c7ce 2021-03-10 stsp int failure = 0;
143 8704c7ce 2021-03-10 stsp int ch;
144 8704c7ce 2021-03-10 stsp
145 8704c7ce 2021-03-10 stsp while ((ch = getopt(argc, argv, "q")) != -1) {
146 8704c7ce 2021-03-10 stsp switch (ch) {
147 8704c7ce 2021-03-10 stsp case 'q':
148 8704c7ce 2021-03-10 stsp quiet = 1;
149 8704c7ce 2021-03-10 stsp break;
150 8704c7ce 2021-03-10 stsp default:
151 8704c7ce 2021-03-10 stsp usage();
152 8704c7ce 2021-03-10 stsp return 1;
153 8704c7ce 2021-03-10 stsp }
154 8704c7ce 2021-03-10 stsp }
155 8704c7ce 2021-03-10 stsp
156 8704c7ce 2021-03-10 stsp argc -= optind;
157 8704c7ce 2021-03-10 stsp argv += optind;
158 8704c7ce 2021-03-10 stsp
159 8704c7ce 2021-03-10 stsp if (argc != 0) {
160 8704c7ce 2021-03-10 stsp usage();
161 8704c7ce 2021-03-10 stsp return 1;
162 8704c7ce 2021-03-10 stsp }
163 8704c7ce 2021-03-10 stsp
164 8704c7ce 2021-03-10 stsp #ifndef PROFILE
165 8704c7ce 2021-03-10 stsp if (pledge("stdio rpath wpath cpath unveil", NULL) == -1)
166 8704c7ce 2021-03-10 stsp err(1, "pledge");
167 8704c7ce 2021-03-10 stsp #endif
168 8704c7ce 2021-03-10 stsp if (unveil(GOT_TMPDIR_STR, "rwc") != 0)
169 8704c7ce 2021-03-10 stsp err(1, "unveil");
170 8704c7ce 2021-03-10 stsp
171 8704c7ce 2021-03-10 stsp if (unveil(NULL, NULL) != 0)
172 8704c7ce 2021-03-10 stsp err(1, "unveil");
173 8704c7ce 2021-03-10 stsp
174 8704c7ce 2021-03-10 stsp RUN_TEST(deltify_abc_axc(), "deltify_abc_axc");
175 8704c7ce 2021-03-10 stsp
176 8704c7ce 2021-03-10 stsp return failure ? 1 : 0;
177 8704c7ce 2021-03-10 stsp }