From 4012539dd7013ec96bb1e9b07ca88b2a4eda1ad6 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Fri, 8 Jun 2018 10:08:17 +0300 Subject: [PATCH] Add ABI compliance test. To run it, run 'ninja test-abi' Signed-off-by: Jonathan Dieter --- .gitignore | 2 + test/abi.sh | 34 ++++ test/abi/stable/libzck.so.0.0.1 | Bin 0 -> 180416 bytes test/abi/stable/zck.h | 332 ++++++++++++++++++++++++++++++++ test/meson.build | 6 + test/new_abi.sh | 14 ++ 6 files changed, 388 insertions(+) create mode 100755 test/abi.sh create mode 100755 test/abi/stable/libzck.so.0.0.1 create mode 100644 test/abi/stable/zck.h create mode 100755 test/new_abi.sh diff --git a/.gitignore b/.gitignore index 378eac2..7e6710b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ build +test/abi/new +test/abi/stable/ABI.dump diff --git a/test/abi.sh b/test/abi.sh new file mode 100755 index 0000000..0a94f39 --- /dev/null +++ b/test/abi.sh @@ -0,0 +1,34 @@ +#!/bin/sh +cd "$(dirname "$0")" + +if [ ! -e ../build/src/lib/libzck.so.*.*.* ]; then + echo "No library exists" + exit 1 +fi + +# Copy latest build to abi/new and remove softlinks +rm abi/new -rf +mkdir -p abi/new +cp -a ../build/src/lib/libzck.so.* abi/new +cp -a ../include/zck.h abi/new +find abi -type l -delete + +# Redump abi/stable +cd abi/stable +abi-dumper libzck.so.* -lver `cat zck.h | grep ZCK_VERSION | head -n 1 | awk '{ print $3 }' | sed s/\"//g` +if [ "$?" -ne 0 ]; then + exit 1 +fi + +# Dump abi/new +cd ../new +abi-dumper libzck.so.* -lver `cat zck.h | grep ZCK_VERSION | head -n 1 | awk '{ print $3 }' | sed s/\"//g` +if [ "$?" -ne 0 ]; then + exit 1 +fi +cd ../../ + +# Remove any old reports and generate new abi compliance report +rm compat_reports -rf +abi-compliance-checker -l zchunk -old abi/stable/ABI.dump -new abi/new/ABI.dump +exit $? diff --git a/test/abi/stable/libzck.so.0.0.1 b/test/abi/stable/libzck.so.0.0.1 new file mode 100755 index 0000000000000000000000000000000000000000..8d1722a3f8680420cbf864d6553e7259f0418802 GIT binary patch literal 180416 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 literal 0 HcmV?d00001 diff --git a/test/abi/stable/zck.h b/test/abi/stable/zck.h new file mode 100644 index 0000000..2892b62 --- /dev/null +++ b/test/abi/stable/zck.h @@ -0,0 +1,332 @@ +#ifndef ZCK_H +#define ZCK_H + +#define ZCK_VERSION "0.6.2" +#define ZCK_VER_MAJOR 0 +#define ZCK_VER_MINOR 6 +#define ZCK_VER_REVISION 2 +#define ZCK_VER_SUBREVISION 0 + +#define True 1 +#define False 0 + +typedef enum zck_hash { + ZCK_HASH_SHA1, + ZCK_HASH_SHA256, + ZCK_HASH_UNKNOWN +} zck_hash; + +typedef enum zck_comp { + ZCK_COMP_NONE, + ZCK_COMP_GZIP, /* Not implemented yet */ + ZCK_COMP_ZSTD +} zck_comp; + +typedef enum zck_ioption { + ZCK_HASH_FULL_TYPE = 0, /* Set full file hash type, using zck_hash */ + ZCK_HASH_CHUNK_TYPE, /* Set chunk hash type using zck_hash */ + ZCK_VAL_HEADER_HASH_TYPE, /* Set what the header hash type *should* be */ + ZCK_VAL_HEADER_LENGTH, /* Set what the header length *should* be */ + ZCK_COMP_TYPE = 100, /* Set compression type using zck_comp */ + ZCK_ZSTD_COMP_LEVEL = 1000 /* Set zstd compression level */ +} zck_ioption; + +typedef enum zck_soption { + ZCK_VAL_HEADER_DIGEST = 0, /* Set what the header hash *should* be */ + ZCK_COMP_DICT = 100 /* Set compression dictionary */ +} zck_soption; + +typedef enum zck_log_type { + ZCK_LOG_DEBUG, + ZCK_LOG_INFO, + ZCK_LOG_WARNING, + ZCK_LOG_ERROR, + ZCK_LOG_NONE +} zck_log_type; + +typedef struct zckCtx zckCtx; +typedef struct zckHash zckHash; + +/* Contains an index item pointing to a chunk */ +typedef struct zckIndexItem { + char *digest; + int digest_size; + int valid; + size_t start; + size_t comp_length; + size_t length; + struct zckIndexItem *next; +} zckIndexItem; + +/* Contains everything about an index and a pointer to the first index item */ +typedef struct zckIndex { + size_t count; + size_t length; + int hash_type; + size_t digest_size; + zckIndexItem *first; +} zckIndex; + +/* Contains a single range */ +typedef struct zckRangeItem { + size_t start; + size_t end; + struct zckRangeItem *next; + struct zckRangeItem *prev; +} zckRangeItem; + +/* Contains a series of ranges, information about them, a link to the first + * range item, and an index describing what information is in the ranges */ +typedef struct zckRange { + unsigned int count; + zckRangeItem *first; + zckIndex index; +} zckRange; + +/******************************************************************* + * Reading a zchunk file + *******************************************************************/ +/* Initialize zchunk for reading */ +zckCtx *zck_init_read (int src_fd) + __attribute__ ((warn_unused_result)); +/* Decompress dst_size bytes from zchunk file to dst, while verifying hashes */ +ssize_t zck_read(zckCtx *zck, char *dst, size_t dst_size) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Writing a zchunk file + *******************************************************************/ +/* Initialize zchunk for writing */ +zckCtx *zck_init_write (int dst_fd) + __attribute__ ((warn_unused_result)); +/* Compress data src of size src_size, and write to zchunk file + * Due to the nature of zchunk files and how they are built, no data will + * actually appear in the zchunk file until zck_close() is called */ +ssize_t zck_write(zckCtx *zck, const char *src, const size_t src_size) + __attribute__ ((warn_unused_result)); +/* Create a chunk boundary */ +ssize_t zck_end_chunk(zckCtx *zck) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Common functions for finishing a zchunk file + *******************************************************************/ +/* Close a zchunk file so it may no longer be read from or written to. The + * context still contains information about the file */ +int zck_close(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Free a zchunk context. You must pass the address of the context, and the + * context will automatically be set to NULL after it is freed */ +void zck_free(zckCtx **zck); + + +/******************************************************************* + * Options + *******************************************************************/ +/* Set string option */ +int zck_set_soption(zckCtx *zck, zck_soption option, const char *value, + size_t length) + __attribute__ ((warn_unused_result)); +/* Set integer option */ +int zck_set_ioption(zckCtx *zck, zck_ioption option, ssize_t value) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Miscellaneous utilities + *******************************************************************/ +/* Set logging level */ +void zck_set_log_level(zck_log_type ll); +/* Validate the chunk and data checksums for the current file. + * Returns -1 for error, 0 for invalid checksum and 1 for valid checksum */ +int zck_validate_checksums(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Validate just the data checksum for the current file */ +int zck_validate_data_checksum(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Go through file and mark valid chunks as valid */ +int zck_find_valid_chunks(zckCtx *zck) + __attribute__ ((warn_unused_result)); + +/* Get a zckRange of ranges that need to still be downloaded. + * max_ranges is the maximum number of ranges supported in a single request + * by the server. If the server supports unlimited ranges, set to -1 + * Returns NULL if there's an error */ +zckRange *zck_get_dl_range(zckCtx *zck, int max_ranges) + __attribute__ ((warn_unused_result)); +/* Get a string representation of a zckRange */ +char *zck_get_range_char(zckRange *range) + __attribute__ ((warn_unused_result)); +/* Get file descriptor attached to zchunk context */ +int zck_get_fd(zckCtx *zck) + __attribute__ ((warn_unused_result)); + +/* Return number of missing chunks (-1 if error) */ +int zck_missing_chunks(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Return number of failed chunks (-1 if error) */ +int zck_failed_chunks(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Reset failed chunks to become missing */ +void zck_reset_failed_chunks(zckCtx *zck); + +/******************************************************************* + * The functions should be all you need to read and write a zchunk + * file. After this point are advanced functions with an unstable + * API, so use them with care. + *******************************************************************/ + + +/******************************************************************* + * Advanced miscellaneous zchunk functions + *******************************************************************/ +/* Initialize zchunk context */ +zckCtx *zck_create() + __attribute__ ((warn_unused_result)); +/* Get lead length */ +ssize_t zck_get_lead_length(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get header length (lead + preface + index + sigs) */ +ssize_t zck_get_header_length(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get data length */ +ssize_t zck_get_data_length(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get file length */ +ssize_t zck_get_length(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get index digest */ +char *zck_get_header_digest(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get data digest */ +char *zck_get_data_digest(zckCtx *zck) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Advanced compression functions + *******************************************************************/ +/* Get name of compression type */ +const char *zck_comp_name_from_type(int comp_type) + __attribute__ ((warn_unused_result)); +/* Initialize compression. Compression type and parameters *must* be done + * before this is called */ + + +/******************************************************************* + * Advanced zchunk reading functions + *******************************************************************/ +/* Initialize zchunk for reading using advanced options */ +zckCtx *zck_init_adv_read (int src_fd) + __attribute__ ((warn_unused_result)); +/* Read zchunk lead */ +int zck_read_lead(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Read zchunk header */ +int zck_read_header(zckCtx *zck) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Indexes + *******************************************************************/ +/* Get index count */ +ssize_t zck_get_index_count(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get index */ +zckIndex *zck_get_index(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get chunk digest */ +char *zck_get_chunk_digest(zckIndexItem *item) + __attribute__ ((warn_unused_result)); + + +/******************************************************************* + * Advanced hash functions + *******************************************************************/ +/* Get overall hash type */ +int zck_get_full_hash_type(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get digest size of overall hash type */ +ssize_t zck_get_full_digest_size(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get chunk hash type */ +int zck_get_chunk_hash_type(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get digest size of chunk hash type */ +ssize_t zck_get_chunk_digest_size(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Get name of hash type */ +const char *zck_hash_name_from_type(int hash_type) + __attribute__ ((warn_unused_result)); + + + +/******************************************************************* + * Downloading (should this go in a separate header and library?) + *******************************************************************/ + +typedef size_t (*zck_wcb)(void *ptr, size_t l, size_t c, void *dl_v); +typedef struct zckDLPriv zckDLPriv; + +/* Contains a zchunk download context */ +typedef struct zckDL { + size_t dl; + size_t ul; + zck_wcb write_cb; + void *wdata; + zck_wcb header_cb; + void *hdrdata; + zckRange *range; + zckDLPriv *priv; + struct zckCtx *zck; +} zckDL; + +/******************************************************************* + * Ranges + *******************************************************************/ +/* Get any matching chunks from src and put them in the right place in tgt */ +int zck_copy_chunks(zckCtx *src, zckCtx *tgt) + __attribute__ ((warn_unused_result)); +/* Free zckRange */ +void zck_range_free(zckRange **info); +/* Get range string from start and end location */ +char *zck_get_range(size_t start, size_t end) + __attribute__ ((warn_unused_result)); +/* Get the minimum size needed to download in order to know how large the header + * is */ +int zck_get_min_download_size() + __attribute__ ((warn_unused_result)); + +/******************************************************************* + * Downloading + *******************************************************************/ +/* Initialize zchunk download context */ +zckDL *zck_dl_init(zckCtx *zck) + __attribute__ ((warn_unused_result)); +/* Reset zchunk download context for reuse */ +void zck_dl_reset(zckDL *dl); +/* Free zchunk download context */ +void zck_dl_free(zckDL **dl); +/* Write callback. You *must* pass this and your initialized zchunk download + * context to the downloader when downloading a zchunk file. If you have your + * own callback, set dl->write_cb to your callback and dl->wdata to your + * callback data. */ +size_t zck_write_chunk_cb(void *ptr, size_t l, size_t c, void *dl_v); +size_t zck_write_zck_header_cb(void *ptr, size_t l, size_t c, void *dl_v); +size_t zck_header_cb(char *b, size_t l, size_t c, void *dl_v); +/* Clear regex used for extracting download ranges from multipart download */ +void zck_dl_clear_regex(zckDL *dl); +/* Download and process the header from url */ +int zck_dl_get_header(zckCtx *zck, zckDL *dl, char *url) + __attribute__ ((warn_unused_result)); +/* Get number of bytes downloaded using download context */ +size_t zck_dl_get_bytes_downloaded(zckDL *dl) + __attribute__ ((warn_unused_result)); +/* Get number of bytes uploaded using download context */ +size_t zck_dl_get_bytes_uploaded(zckDL *dl) + __attribute__ ((warn_unused_result)); + +#endif diff --git a/test/meson.build b/test/meson.build index c49ad0f..58c8107 100644 --- a/test/meson.build +++ b/test/meson.build @@ -5,3 +5,9 @@ empty = executable('empty', ['empty.c'] + util_sources, include_directories: inc file_path = join_paths(meson.source_root(), 'test/files') test('create and validate empty zchunk file', empty) + +run_target('test-abi', + command: 'abi.sh') + +run_target('new-abi', + command: 'new_abi.sh') diff --git a/test/new_abi.sh b/test/new_abi.sh new file mode 100755 index 0000000..1d848e5 --- /dev/null +++ b/test/new_abi.sh @@ -0,0 +1,14 @@ +#!/bin/sh +cd "$(dirname "$0")" + +if [ ! -e ../build/src/lib/libzck.so.*.*.* ]; then + echo "No library exists" + exit 1 +fi + +# Remove stable build and copy current build abi/stable +rm abi/stable -rf +mkdir -p abi/stable +cp -a ../build/src/lib/libzck.so.* abi/stable +cp -a ../include/zck.h abi/stable +find abi -type l -delete -- 2.30.2