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 d6a28ffe 2022-05-20 op uint32_t seed;
46 8704c7ce 2021-03-10 stsp
47 d6a28ffe 2022-05-20 op seed = arc4random();
48 d6a28ffe 2022-05-20 op
49 8704c7ce 2021-03-10 stsp base_file = got_opentemp();
50 8704c7ce 2021-03-10 stsp if (base_file == NULL)
51 8704c7ce 2021-03-10 stsp return 1;
52 8704c7ce 2021-03-10 stsp
53 8704c7ce 2021-03-10 stsp derived_file = got_opentemp();
54 8704c7ce 2021-03-10 stsp if (derived_file == NULL)
55 8704c7ce 2021-03-10 stsp return 1;
56 8704c7ce 2021-03-10 stsp
57 8704c7ce 2021-03-10 stsp result_file = got_opentemp();
58 8704c7ce 2021-03-10 stsp if (result_file == NULL)
59 8704c7ce 2021-03-10 stsp return 1;
60 8704c7ce 2021-03-10 stsp
61 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
62 8704c7ce 2021-03-10 stsp fputc('a', base_file);
63 8704c7ce 2021-03-10 stsp fputc('a', derived_file);
64 8704c7ce 2021-03-10 stsp }
65 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
66 8704c7ce 2021-03-10 stsp fputc('b', base_file);
67 8704c7ce 2021-03-10 stsp fputc('x', derived_file);
68 8704c7ce 2021-03-10 stsp }
69 8704c7ce 2021-03-10 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
70 8704c7ce 2021-03-10 stsp fputc('c', base_file);
71 8704c7ce 2021-03-10 stsp fputc('c', derived_file);
72 8704c7ce 2021-03-10 stsp }
73 8704c7ce 2021-03-10 stsp
74 8704c7ce 2021-03-10 stsp rewind(base_file);
75 8704c7ce 2021-03-10 stsp rewind(derived_file);
76 8704c7ce 2021-03-10 stsp
77 d6a28ffe 2022-05-20 op err = got_deltify_init(&dt, base_file, 0, 3 * GOT_DELTIFY_MAXCHUNK,
78 d6a28ffe 2022-05-20 op seed);
79 8704c7ce 2021-03-10 stsp if (err)
80 8704c7ce 2021-03-10 stsp goto done;
81 8704c7ce 2021-03-10 stsp
82 8704c7ce 2021-03-10 stsp for (i = 0; i < dt->nalloc; i++) {
83 8704c7ce 2021-03-10 stsp if (dt->blocks[i].len > 0)
84 8704c7ce 2021-03-10 stsp have_nblocks++;
85 8704c7ce 2021-03-10 stsp }
86 8704c7ce 2021-03-10 stsp if (have_nblocks != dt->nblocks) {
87 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
88 8704c7ce 2021-03-10 stsp goto done;
89 8704c7ce 2021-03-10 stsp }
90 8704c7ce 2021-03-10 stsp
91 8704c7ce 2021-03-10 stsp err = got_deltify(&deltas, &ndeltas, derived_file, 0,
92 d6a28ffe 2022-05-20 op 3 * GOT_DELTIFY_MAXCHUNK, seed, dt, base_file, 0,
93 f34b169e 2021-06-18 stsp 3 * GOT_DELTIFY_MAXCHUNK);
94 8704c7ce 2021-03-10 stsp if (err)
95 8704c7ce 2021-03-10 stsp goto done;
96 8704c7ce 2021-03-10 stsp
97 8704c7ce 2021-03-10 stsp if (ndeltas != 3) {
98 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
99 8704c7ce 2021-03-10 stsp goto done;
100 8704c7ce 2021-03-10 stsp }
101 8704c7ce 2021-03-10 stsp /* Copy 'aaaa...' from base file. */
102 8704c7ce 2021-03-10 stsp if (!(deltas[0].copy == 1 && deltas[0].offset == 0 &&
103 8704c7ce 2021-03-10 stsp deltas[0].len == GOT_DELTIFY_MAXCHUNK)) {
104 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
105 8704c7ce 2021-03-10 stsp goto done;
106 8704c7ce 2021-03-10 stsp }
107 8704c7ce 2021-03-10 stsp /* Copy 'xxxx...' from derived file. */
108 8704c7ce 2021-03-10 stsp if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK &&
109 8704c7ce 2021-03-10 stsp deltas[1].len == GOT_DELTIFY_MAXCHUNK)) {
110 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
111 8704c7ce 2021-03-10 stsp goto done;
112 8704c7ce 2021-03-10 stsp }
113 8704c7ce 2021-03-10 stsp /* Copy 'ccccc...' from base file. */
114 8704c7ce 2021-03-10 stsp if (!(deltas[2].copy == 1 &&
115 8704c7ce 2021-03-10 stsp deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK &&
116 8704c7ce 2021-03-10 stsp deltas[2].len == GOT_DELTIFY_MAXCHUNK)) {
117 8704c7ce 2021-03-10 stsp err = got_error(GOT_ERR_BAD_DELTA);
118 8704c7ce 2021-03-10 stsp goto done;
119 8704c7ce 2021-03-10 stsp }
120 8704c7ce 2021-03-10 stsp
121 8704c7ce 2021-03-10 stsp done:
122 8704c7ce 2021-03-10 stsp got_deltify_free(dt);
123 8704c7ce 2021-03-10 stsp fclose(base_file);
124 8704c7ce 2021-03-10 stsp fclose(derived_file);
125 64a8571e 2022-01-07 stsp fclose(result_file);
126 64a8571e 2022-01-07 stsp return (err == NULL);
127 64a8571e 2022-01-07 stsp }
128 64a8571e 2022-01-07 stsp
129 64a8571e 2022-01-07 stsp static int
130 64a8571e 2022-01-07 stsp deltify_abc_axc_file_mem(void)
131 64a8571e 2022-01-07 stsp {
132 64a8571e 2022-01-07 stsp const struct got_error *err = NULL;
133 64a8571e 2022-01-07 stsp size_t i;
134 64a8571e 2022-01-07 stsp uint8_t base_data[3 * GOT_DELTIFY_MAXCHUNK];
135 64a8571e 2022-01-07 stsp FILE *derived_file, *result_file;
136 64a8571e 2022-01-07 stsp struct got_delta_table *dt;
137 64a8571e 2022-01-07 stsp struct got_delta_instruction *deltas;
138 64a8571e 2022-01-07 stsp int ndeltas;
139 64a8571e 2022-01-07 stsp int have_nblocks = 0;
140 d6a28ffe 2022-05-20 op uint32_t seed;
141 64a8571e 2022-01-07 stsp
142 d6a28ffe 2022-05-20 op seed = arc4random();
143 d6a28ffe 2022-05-20 op
144 64a8571e 2022-01-07 stsp derived_file = got_opentemp();
145 64a8571e 2022-01-07 stsp if (derived_file == NULL)
146 64a8571e 2022-01-07 stsp return 1;
147 64a8571e 2022-01-07 stsp
148 64a8571e 2022-01-07 stsp result_file = got_opentemp();
149 64a8571e 2022-01-07 stsp if (result_file == NULL)
150 64a8571e 2022-01-07 stsp return 1;
151 64a8571e 2022-01-07 stsp
152 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
153 64a8571e 2022-01-07 stsp base_data[i] = 'a';
154 64a8571e 2022-01-07 stsp fputc('a', derived_file);
155 64a8571e 2022-01-07 stsp }
156 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
157 64a8571e 2022-01-07 stsp base_data[GOT_DELTIFY_MAXCHUNK + i] = 'b';
158 64a8571e 2022-01-07 stsp fputc('x', derived_file);
159 64a8571e 2022-01-07 stsp }
160 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
161 64a8571e 2022-01-07 stsp base_data[2 * GOT_DELTIFY_MAXCHUNK + i] = 'c';
162 64a8571e 2022-01-07 stsp fputc('c', derived_file);
163 64a8571e 2022-01-07 stsp }
164 64a8571e 2022-01-07 stsp
165 64a8571e 2022-01-07 stsp rewind(derived_file);
166 64a8571e 2022-01-07 stsp
167 d6a28ffe 2022-05-20 op err = got_deltify_init_mem(&dt, base_data, 0, 3 * GOT_DELTIFY_MAXCHUNK,
168 d6a28ffe 2022-05-20 op seed);
169 64a8571e 2022-01-07 stsp if (err)
170 64a8571e 2022-01-07 stsp goto done;
171 64a8571e 2022-01-07 stsp
172 64a8571e 2022-01-07 stsp for (i = 0; i < dt->nalloc; i++) {
173 64a8571e 2022-01-07 stsp if (dt->blocks[i].len > 0)
174 64a8571e 2022-01-07 stsp have_nblocks++;
175 64a8571e 2022-01-07 stsp }
176 64a8571e 2022-01-07 stsp if (have_nblocks != dt->nblocks) {
177 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
178 64a8571e 2022-01-07 stsp goto done;
179 64a8571e 2022-01-07 stsp }
180 64a8571e 2022-01-07 stsp
181 64a8571e 2022-01-07 stsp err = got_deltify_file_mem(&deltas, &ndeltas, derived_file, 0,
182 d6a28ffe 2022-05-20 op 3 * GOT_DELTIFY_MAXCHUNK, seed, dt, base_data, 0,
183 64a8571e 2022-01-07 stsp 3 * GOT_DELTIFY_MAXCHUNK);
184 64a8571e 2022-01-07 stsp if (err)
185 64a8571e 2022-01-07 stsp goto done;
186 64a8571e 2022-01-07 stsp
187 64a8571e 2022-01-07 stsp if (ndeltas != 3) {
188 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
189 64a8571e 2022-01-07 stsp goto done;
190 64a8571e 2022-01-07 stsp }
191 64a8571e 2022-01-07 stsp /* Copy 'aaaa...' from base file. */
192 64a8571e 2022-01-07 stsp if (!(deltas[0].copy == 1 && deltas[0].offset == 0 &&
193 64a8571e 2022-01-07 stsp deltas[0].len == GOT_DELTIFY_MAXCHUNK)) {
194 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
195 64a8571e 2022-01-07 stsp goto done;
196 64a8571e 2022-01-07 stsp }
197 64a8571e 2022-01-07 stsp /* Copy 'xxxx...' from derived file. */
198 64a8571e 2022-01-07 stsp if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK &&
199 64a8571e 2022-01-07 stsp deltas[1].len == GOT_DELTIFY_MAXCHUNK)) {
200 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
201 64a8571e 2022-01-07 stsp goto done;
202 64a8571e 2022-01-07 stsp }
203 64a8571e 2022-01-07 stsp /* Copy 'ccccc...' from base file. */
204 64a8571e 2022-01-07 stsp if (!(deltas[2].copy == 1 &&
205 64a8571e 2022-01-07 stsp deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK &&
206 64a8571e 2022-01-07 stsp deltas[2].len == GOT_DELTIFY_MAXCHUNK)) {
207 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
208 64a8571e 2022-01-07 stsp goto done;
209 64a8571e 2022-01-07 stsp }
210 64a8571e 2022-01-07 stsp
211 64a8571e 2022-01-07 stsp done:
212 64a8571e 2022-01-07 stsp got_deltify_free(dt);
213 64a8571e 2022-01-07 stsp fclose(derived_file);
214 64a8571e 2022-01-07 stsp fclose(result_file);
215 64a8571e 2022-01-07 stsp return (err == NULL);
216 64a8571e 2022-01-07 stsp }
217 64a8571e 2022-01-07 stsp
218 64a8571e 2022-01-07 stsp static int
219 64a8571e 2022-01-07 stsp deltify_abc_axc_mem_file(void)
220 64a8571e 2022-01-07 stsp {
221 64a8571e 2022-01-07 stsp const struct got_error *err = NULL;
222 64a8571e 2022-01-07 stsp size_t i;
223 64a8571e 2022-01-07 stsp FILE *base_file, *result_file;
224 64a8571e 2022-01-07 stsp uint8_t derived_file[3 * GOT_DELTIFY_MAXCHUNK];
225 64a8571e 2022-01-07 stsp struct got_delta_table *dt;
226 64a8571e 2022-01-07 stsp struct got_delta_instruction *deltas;
227 64a8571e 2022-01-07 stsp int ndeltas;
228 64a8571e 2022-01-07 stsp int have_nblocks = 0;
229 d6a28ffe 2022-05-20 op uint32_t seed;
230 64a8571e 2022-01-07 stsp
231 d6a28ffe 2022-05-20 op seed = arc4random();
232 d6a28ffe 2022-05-20 op
233 64a8571e 2022-01-07 stsp base_file = got_opentemp();
234 64a8571e 2022-01-07 stsp if (base_file == NULL)
235 64a8571e 2022-01-07 stsp return 1;
236 64a8571e 2022-01-07 stsp
237 64a8571e 2022-01-07 stsp result_file = got_opentemp();
238 64a8571e 2022-01-07 stsp if (result_file == NULL)
239 64a8571e 2022-01-07 stsp return 1;
240 64a8571e 2022-01-07 stsp
241 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
242 64a8571e 2022-01-07 stsp fputc('a', base_file);
243 64a8571e 2022-01-07 stsp derived_file[i] = 'a';
244 64a8571e 2022-01-07 stsp }
245 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
246 64a8571e 2022-01-07 stsp fputc('b', base_file);
247 64a8571e 2022-01-07 stsp derived_file[GOT_DELTIFY_MAXCHUNK + i] = 'x';
248 64a8571e 2022-01-07 stsp }
249 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
250 64a8571e 2022-01-07 stsp fputc('c', base_file);
251 64a8571e 2022-01-07 stsp derived_file[2 * GOT_DELTIFY_MAXCHUNK + i] = 'c';
252 64a8571e 2022-01-07 stsp }
253 64a8571e 2022-01-07 stsp
254 64a8571e 2022-01-07 stsp rewind(base_file);
255 64a8571e 2022-01-07 stsp
256 d6a28ffe 2022-05-20 op err = got_deltify_init(&dt, base_file, 0, 3 * GOT_DELTIFY_MAXCHUNK,
257 d6a28ffe 2022-05-20 op seed);
258 64a8571e 2022-01-07 stsp if (err)
259 64a8571e 2022-01-07 stsp goto done;
260 64a8571e 2022-01-07 stsp
261 64a8571e 2022-01-07 stsp for (i = 0; i < dt->nalloc; i++) {
262 64a8571e 2022-01-07 stsp if (dt->blocks[i].len > 0)
263 64a8571e 2022-01-07 stsp have_nblocks++;
264 64a8571e 2022-01-07 stsp }
265 64a8571e 2022-01-07 stsp if (have_nblocks != dt->nblocks) {
266 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
267 64a8571e 2022-01-07 stsp goto done;
268 64a8571e 2022-01-07 stsp }
269 64a8571e 2022-01-07 stsp
270 64a8571e 2022-01-07 stsp err = got_deltify_mem_file(&deltas, &ndeltas, derived_file, 0,
271 d6a28ffe 2022-05-20 op 3 * GOT_DELTIFY_MAXCHUNK, seed, dt, base_file, 0,
272 64a8571e 2022-01-07 stsp 3 * GOT_DELTIFY_MAXCHUNK);
273 64a8571e 2022-01-07 stsp if (err)
274 64a8571e 2022-01-07 stsp goto done;
275 64a8571e 2022-01-07 stsp
276 64a8571e 2022-01-07 stsp if (ndeltas != 3) {
277 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
278 64a8571e 2022-01-07 stsp goto done;
279 64a8571e 2022-01-07 stsp }
280 64a8571e 2022-01-07 stsp /* Copy 'aaaa...' from base file. */
281 64a8571e 2022-01-07 stsp if (!(deltas[0].copy == 1 && deltas[0].offset == 0 &&
282 64a8571e 2022-01-07 stsp deltas[0].len == GOT_DELTIFY_MAXCHUNK)) {
283 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
284 64a8571e 2022-01-07 stsp goto done;
285 64a8571e 2022-01-07 stsp }
286 64a8571e 2022-01-07 stsp /* Copy 'xxxx...' from derived file. */
287 64a8571e 2022-01-07 stsp if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK &&
288 64a8571e 2022-01-07 stsp deltas[1].len == GOT_DELTIFY_MAXCHUNK)) {
289 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
290 64a8571e 2022-01-07 stsp goto done;
291 64a8571e 2022-01-07 stsp }
292 64a8571e 2022-01-07 stsp /* Copy 'ccccc...' from base file. */
293 64a8571e 2022-01-07 stsp if (!(deltas[2].copy == 1 &&
294 64a8571e 2022-01-07 stsp deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK &&
295 64a8571e 2022-01-07 stsp deltas[2].len == GOT_DELTIFY_MAXCHUNK)) {
296 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
297 64a8571e 2022-01-07 stsp goto done;
298 64a8571e 2022-01-07 stsp }
299 64a8571e 2022-01-07 stsp
300 64a8571e 2022-01-07 stsp done:
301 64a8571e 2022-01-07 stsp got_deltify_free(dt);
302 64a8571e 2022-01-07 stsp fclose(base_file);
303 8704c7ce 2021-03-10 stsp fclose(result_file);
304 8704c7ce 2021-03-10 stsp return (err == NULL);
305 8704c7ce 2021-03-10 stsp }
306 8704c7ce 2021-03-10 stsp
307 64a8571e 2022-01-07 stsp static int
308 64a8571e 2022-01-07 stsp deltify_abc_axc_mem_mem(void)
309 64a8571e 2022-01-07 stsp {
310 64a8571e 2022-01-07 stsp const struct got_error *err = NULL;
311 64a8571e 2022-01-07 stsp size_t i;
312 64a8571e 2022-01-07 stsp FILE *result_file;
313 64a8571e 2022-01-07 stsp uint8_t base_file[3 * GOT_DELTIFY_MAXCHUNK];
314 64a8571e 2022-01-07 stsp uint8_t derived_file[3 * GOT_DELTIFY_MAXCHUNK];
315 64a8571e 2022-01-07 stsp struct got_delta_table *dt;
316 64a8571e 2022-01-07 stsp struct got_delta_instruction *deltas;
317 64a8571e 2022-01-07 stsp int ndeltas;
318 64a8571e 2022-01-07 stsp int have_nblocks = 0;
319 d6a28ffe 2022-05-20 op uint32_t seed;
320 64a8571e 2022-01-07 stsp
321 d6a28ffe 2022-05-20 op seed = arc4random();
322 d6a28ffe 2022-05-20 op
323 64a8571e 2022-01-07 stsp result_file = got_opentemp();
324 64a8571e 2022-01-07 stsp if (result_file == NULL)
325 64a8571e 2022-01-07 stsp return 1;
326 64a8571e 2022-01-07 stsp
327 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
328 64a8571e 2022-01-07 stsp base_file[i] = 'a';
329 64a8571e 2022-01-07 stsp derived_file[i] = 'a';
330 64a8571e 2022-01-07 stsp }
331 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
332 64a8571e 2022-01-07 stsp base_file[GOT_DELTIFY_MAXCHUNK + i] = 'b';
333 64a8571e 2022-01-07 stsp derived_file[GOT_DELTIFY_MAXCHUNK + i] = 'x';
334 64a8571e 2022-01-07 stsp }
335 64a8571e 2022-01-07 stsp for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) {
336 64a8571e 2022-01-07 stsp base_file[2 * GOT_DELTIFY_MAXCHUNK + i] = 'c';
337 64a8571e 2022-01-07 stsp derived_file[2 * GOT_DELTIFY_MAXCHUNK + i] = 'c';
338 64a8571e 2022-01-07 stsp }
339 64a8571e 2022-01-07 stsp
340 d6a28ffe 2022-05-20 op err = got_deltify_init_mem(&dt, base_file, 0, 3 * GOT_DELTIFY_MAXCHUNK,
341 d6a28ffe 2022-05-20 op seed);
342 64a8571e 2022-01-07 stsp if (err)
343 64a8571e 2022-01-07 stsp goto done;
344 64a8571e 2022-01-07 stsp
345 64a8571e 2022-01-07 stsp for (i = 0; i < dt->nalloc; i++) {
346 64a8571e 2022-01-07 stsp if (dt->blocks[i].len > 0)
347 64a8571e 2022-01-07 stsp have_nblocks++;
348 64a8571e 2022-01-07 stsp }
349 64a8571e 2022-01-07 stsp if (have_nblocks != dt->nblocks) {
350 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
351 64a8571e 2022-01-07 stsp goto done;
352 64a8571e 2022-01-07 stsp }
353 64a8571e 2022-01-07 stsp
354 64a8571e 2022-01-07 stsp err = got_deltify_mem_mem(&deltas, &ndeltas, derived_file, 0,
355 d6a28ffe 2022-05-20 op 3 * GOT_DELTIFY_MAXCHUNK, seed, dt, base_file, 0,
356 64a8571e 2022-01-07 stsp 3 * GOT_DELTIFY_MAXCHUNK);
357 64a8571e 2022-01-07 stsp if (err)
358 64a8571e 2022-01-07 stsp goto done;
359 64a8571e 2022-01-07 stsp
360 64a8571e 2022-01-07 stsp if (ndeltas != 3) {
361 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
362 64a8571e 2022-01-07 stsp goto done;
363 64a8571e 2022-01-07 stsp }
364 64a8571e 2022-01-07 stsp /* Copy 'aaaa...' from base file. */
365 64a8571e 2022-01-07 stsp if (!(deltas[0].copy == 1 && deltas[0].offset == 0 &&
366 64a8571e 2022-01-07 stsp deltas[0].len == GOT_DELTIFY_MAXCHUNK)) {
367 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
368 64a8571e 2022-01-07 stsp goto done;
369 64a8571e 2022-01-07 stsp }
370 64a8571e 2022-01-07 stsp /* Copy 'xxxx...' from derived file. */
371 64a8571e 2022-01-07 stsp if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK &&
372 64a8571e 2022-01-07 stsp deltas[1].len == GOT_DELTIFY_MAXCHUNK)) {
373 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
374 64a8571e 2022-01-07 stsp goto done;
375 64a8571e 2022-01-07 stsp }
376 64a8571e 2022-01-07 stsp /* Copy 'ccccc...' from base file. */
377 64a8571e 2022-01-07 stsp if (!(deltas[2].copy == 1 &&
378 64a8571e 2022-01-07 stsp deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK &&
379 64a8571e 2022-01-07 stsp deltas[2].len == GOT_DELTIFY_MAXCHUNK)) {
380 64a8571e 2022-01-07 stsp err = got_error(GOT_ERR_BAD_DELTA);
381 64a8571e 2022-01-07 stsp goto done;
382 64a8571e 2022-01-07 stsp }
383 64a8571e 2022-01-07 stsp
384 64a8571e 2022-01-07 stsp done:
385 64a8571e 2022-01-07 stsp got_deltify_free(dt);
386 64a8571e 2022-01-07 stsp fclose(result_file);
387 64a8571e 2022-01-07 stsp return (err == NULL);
388 64a8571e 2022-01-07 stsp }
389 64a8571e 2022-01-07 stsp
390 8704c7ce 2021-03-10 stsp static int quiet;
391 8704c7ce 2021-03-10 stsp
392 8704c7ce 2021-03-10 stsp #define RUN_TEST(expr, name) \
393 8704c7ce 2021-03-10 stsp { test_ok = (expr); \
394 8704c7ce 2021-03-10 stsp if (!quiet) printf("test_%s %s\n", (name), test_ok ? "ok" : "failed"); \
395 8704c7ce 2021-03-10 stsp failure = (failure || !test_ok); }
396 8704c7ce 2021-03-10 stsp
397 8704c7ce 2021-03-10 stsp static void
398 8704c7ce 2021-03-10 stsp usage(void)
399 8704c7ce 2021-03-10 stsp {
400 8704c7ce 2021-03-10 stsp fprintf(stderr, "usage: delta_test [-q]\n");
401 8704c7ce 2021-03-10 stsp }
402 8704c7ce 2021-03-10 stsp
403 8704c7ce 2021-03-10 stsp int
404 8704c7ce 2021-03-10 stsp main(int argc, char *argv[])
405 8704c7ce 2021-03-10 stsp {
406 8704c7ce 2021-03-10 stsp int test_ok;
407 8704c7ce 2021-03-10 stsp int failure = 0;
408 8704c7ce 2021-03-10 stsp int ch;
409 8704c7ce 2021-03-10 stsp
410 8704c7ce 2021-03-10 stsp while ((ch = getopt(argc, argv, "q")) != -1) {
411 8704c7ce 2021-03-10 stsp switch (ch) {
412 8704c7ce 2021-03-10 stsp case 'q':
413 8704c7ce 2021-03-10 stsp quiet = 1;
414 8704c7ce 2021-03-10 stsp break;
415 8704c7ce 2021-03-10 stsp default:
416 8704c7ce 2021-03-10 stsp usage();
417 8704c7ce 2021-03-10 stsp return 1;
418 8704c7ce 2021-03-10 stsp }
419 8704c7ce 2021-03-10 stsp }
420 8704c7ce 2021-03-10 stsp
421 8704c7ce 2021-03-10 stsp argc -= optind;
422 8704c7ce 2021-03-10 stsp argv += optind;
423 8704c7ce 2021-03-10 stsp
424 8704c7ce 2021-03-10 stsp if (argc != 0) {
425 8704c7ce 2021-03-10 stsp usage();
426 8704c7ce 2021-03-10 stsp return 1;
427 8704c7ce 2021-03-10 stsp }
428 8704c7ce 2021-03-10 stsp
429 8704c7ce 2021-03-10 stsp #ifndef PROFILE
430 8704c7ce 2021-03-10 stsp if (pledge("stdio rpath wpath cpath unveil", NULL) == -1)
431 8704c7ce 2021-03-10 stsp err(1, "pledge");
432 8704c7ce 2021-03-10 stsp #endif
433 8704c7ce 2021-03-10 stsp if (unveil(GOT_TMPDIR_STR, "rwc") != 0)
434 8704c7ce 2021-03-10 stsp err(1, "unveil");
435 8704c7ce 2021-03-10 stsp
436 8704c7ce 2021-03-10 stsp if (unveil(NULL, NULL) != 0)
437 8704c7ce 2021-03-10 stsp err(1, "unveil");
438 8704c7ce 2021-03-10 stsp
439 8704c7ce 2021-03-10 stsp RUN_TEST(deltify_abc_axc(), "deltify_abc_axc");
440 64a8571e 2022-01-07 stsp RUN_TEST(deltify_abc_axc_file_mem(), "deltify_abc_axc_file_mem");
441 64a8571e 2022-01-07 stsp RUN_TEST(deltify_abc_axc_mem_file(), "deltify_abc_axc_mem_file");
442 64a8571e 2022-01-07 stsp RUN_TEST(deltify_abc_axc_mem_mem(), "deltify_abc_axc_mem_mem");
443 8704c7ce 2021-03-10 stsp
444 8704c7ce 2021-03-10 stsp return failure ? 1 : 0;
445 8704c7ce 2021-03-10 stsp }