commit 8704c7cea5c81c45015529a58461bf8b49f9c4d9 from: Stefan Sperling date: Wed Mar 10 22:49:21 2021 UTC add a simple deltify test commit - 69aa0e90839745f70c6fc7e33c78bbe949f3500d commit + 8704c7cea5c81c45015529a58461bf8b49f9c4d9 blob - 5c2026319bf17285a069070e877b8280c58877a5 blob + f03727dc8b09d97a93d6ee86cc68c916c3f792ad --- regress/Makefile +++ regress/Makefile @@ -1,3 +1,3 @@ -SUBDIR = cmdline delta idset path fetch +SUBDIR = cmdline delta deltify idset path fetch .include blob - /dev/null blob + b903bbecf5905f866e82fb63306b28d3e7b6366e (mode 644) --- /dev/null +++ regress/deltify/Makefile @@ -0,0 +1,14 @@ +.PATH:${.CURDIR}/../../lib + +PROG = deltify_test +SRCS = deltify.c error.c opentemp.c sha1.c deltify_test.c + +CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib +LDADD = -lz + +NOMAN = yes + +run-regress-deltify_test: + ${.OBJDIR}/deltify_test -q + +.include blob - /dev/null blob + 5fa89910676821b58b5c98fe4828ced3e50f3e97 (mode 644) --- /dev/null +++ regress/deltify/deltify_test.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021 Stefan Sperling + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "got_error.h" +#include "got_opentemp.h" + +#include "got_lib_deltify.h" + +#ifndef nitems +#define nitems(_a) (sizeof(_a) / sizeof((_a)[0])) +#endif + +static int +deltify_abc_axc(void) +{ + const struct got_error *err = NULL; + size_t i; + FILE *base_file, *derived_file, *result_file; + struct got_delta_table *dt; + struct got_delta_instruction *deltas; + int ndeltas; + int have_nblocks = 0; + + base_file = got_opentemp(); + if (base_file == NULL) + return 1; + + derived_file = got_opentemp(); + if (derived_file == NULL) + return 1; + + result_file = got_opentemp(); + if (result_file == NULL) + return 1; + + for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) { + fputc('a', base_file); + fputc('a', derived_file); + } + for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) { + fputc('b', base_file); + fputc('x', derived_file); + } + for (i = 0; i < GOT_DELTIFY_MAXCHUNK; i++) { + fputc('c', base_file); + fputc('c', derived_file); + } + + rewind(base_file); + rewind(derived_file); + + err = got_deltify_init(&dt, base_file, 0, 3 * GOT_DELTIFY_MAXCHUNK); + if (err) + goto done; + + for (i = 0; i < dt->nalloc; i++) { + if (dt->blocks[i].len > 0) + have_nblocks++; + } + if (have_nblocks != dt->nblocks) { + err = got_error(GOT_ERR_BAD_DELTA); + goto done; + } + + err = got_deltify(&deltas, &ndeltas, derived_file, 0, + 3 * GOT_DELTIFY_MAXCHUNK, dt, base_file, 3 * GOT_DELTIFY_MAXCHUNK); + if (err) + goto done; + + if (ndeltas != 3) { + err = got_error(GOT_ERR_BAD_DELTA); + goto done; + } + /* Copy 'aaaa...' from base file. */ + if (!(deltas[0].copy == 1 && deltas[0].offset == 0 && + deltas[0].len == GOT_DELTIFY_MAXCHUNK)) { + err = got_error(GOT_ERR_BAD_DELTA); + goto done; + } + /* Copy 'xxxx...' from derived file. */ + if (!(deltas[1].copy == 0 && deltas[1].offset == GOT_DELTIFY_MAXCHUNK && + deltas[1].len == GOT_DELTIFY_MAXCHUNK)) { + err = got_error(GOT_ERR_BAD_DELTA); + goto done; + } + /* Copy 'ccccc...' from base file. */ + if (!(deltas[2].copy == 1 && + deltas[2].offset == 2 * GOT_DELTIFY_MAXCHUNK && + deltas[2].len == GOT_DELTIFY_MAXCHUNK)) { + err = got_error(GOT_ERR_BAD_DELTA); + goto done; + } + +done: + got_deltify_free(dt); + fclose(base_file); + fclose(derived_file); + fclose(result_file); + return (err == NULL); +} + +static int quiet; + +#define RUN_TEST(expr, name) \ + { test_ok = (expr); \ + if (!quiet) printf("test_%s %s\n", (name), test_ok ? "ok" : "failed"); \ + failure = (failure || !test_ok); } + +static void +usage(void) +{ + fprintf(stderr, "usage: delta_test [-q]\n"); +} + +int +main(int argc, char *argv[]) +{ + int test_ok; + int failure = 0; + int ch; + + while ((ch = getopt(argc, argv, "q")) != -1) { + switch (ch) { + case 'q': + quiet = 1; + break; + default: + usage(); + return 1; + } + } + + argc -= optind; + argv += optind; + + if (argc != 0) { + usage(); + return 1; + } + +#ifndef PROFILE + if (pledge("stdio rpath wpath cpath unveil", NULL) == -1) + err(1, "pledge"); +#endif + if (unveil(GOT_TMPDIR_STR, "rwc") != 0) + err(1, "unveil"); + + if (unveil(NULL, NULL) != 0) + err(1, "unveil"); + + RUN_TEST(deltify_abc_axc(), "deltify_abc_axc"); + + return failure ? 1 : 0; +}