Reads in all files, writes them out to a tmp directory. Re-reads them in and compares the new database with the old database.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- libwacom/libwacom.c | 28 +++++++- libwacom/libwacom.h | 2 +- test/Makefile.am | 3 +- test/dbverify.c | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 test/dbverify.c diff --git a/libwacom/libwacom.c b/libwacom/libwacom.c index 686a23e..4d9142c 100644 --- a/libwacom/libwacom.c +++ b/libwacom/libwacom.c @@ -224,14 +224,36 @@ libwacom_copy(const WacomDevice *device) static int -compare_matches(const WacomDevice *a, const WacomDevice *b) +compare_matches(WacomDevice *a, WacomDevice *b) { - /* FIXME: fill this in */ + WacomMatch **ma, **mb; + int nmatches_a, nmatches_b; + int i, j; + + ma = libwacom_get_matches(a, &nmatches_a); + mb = libwacom_get_matches(b, &nmatches_b); + + if (nmatches_a != nmatches_b) + return 1; + + for (i = 0; i < nmatches_a; i++) { + int found = 0; + WacomMatch *match_a = ma[i]; + for (j = 0; !found && j < nmatches_b; j++) { + WacomMatch *match_b = mb[j]; + + if (strcmp(match_a->match, match_b->match) == 0) + found = 1; + } + if (!found) + return 1; + } + return 0; } int -libwacom_compare(const WacomDevice *a, const WacomDevice *b, WacomCompareFlags flags) +libwacom_compare(WacomDevice *a, WacomDevice *b, WacomCompareFlags flags) { if ((a && !b) || (b && !a)) return 1; diff --git a/libwacom/libwacom.h b/libwacom/libwacom.h index 806510a..f5f23b2 100644 --- a/libwacom/libwacom.h +++ b/libwacom/libwacom.h @@ -303,7 +303,7 @@ void libwacom_destroy(WacomDevice *device); * * @return 0 if the devices are identical, nonzero otherwise */ -int libwacom_compare(const WacomDevice *a, const WacomDevice *b, WacomCompareFlags flags); +int libwacom_compare(WacomDevice *a, WacomDevice *b, WacomCompareFlags flags); /** * @param device The tablet to query diff --git a/test/Makefile.am b/test/Makefile.am index a402022..7ef0e52 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,8 @@ -noinst_PROGRAMS=load +noinst_PROGRAMS=load dbverify TESTS=$(noinst_PROGRAMS) INCLUDES=-I$(top_srcdir)/libwacom -DTOPSRCDIR="\"$(top_srcdir)\"" load_LDADD=$(top_builddir)/libwacom/libwacom.la +dbverify_LDADD=$(top_builddir)/libwacom/libwacom.la diff --git a/test/dbverify.c b/test/dbverify.c new file mode 100644 index 0000000..fa3c34d --- /dev/null +++ b/test/dbverify.c @@ -0,0 +1,188 @@ +/* + * Copyright © 2012 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + udo y and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Red Hat + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. Red + * Hat makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, 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. + * + * Authors: + * Peter Hutterer (peter.hutte...@redhat.com) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dirent.h> +#include "libwacom.h" +#include <assert.h> +#include <unistd.h> + + +static int +scandir_filter(const struct dirent *entry) +{ + return strncmp(entry->d_name, ".", 1); +} + +static void +rmtmpdir(const char *dir) +{ + int nfiles; + struct dirent **files; + char *path = NULL; + + nfiles = scandir(dir, &files, scandir_filter, alphasort); + while(nfiles--) + { + asprintf(&path, "%s/%s", dir, files[nfiles]->d_name); + assert(path); + remove(path); + free(files[nfiles]); + free(path); + path = NULL; + } + + free(files); + remove(dir); +} + + +static void +compare_databases(WacomDeviceDatabase *orig, WacomDeviceDatabase *new) +{ + int ndevices = 0, i; + WacomDevice **oldall, **o; + WacomDevice **newall, **n; + char *old_matched; + + oldall = libwacom_list_devices_from_database(orig, NULL); + newall = libwacom_list_devices_from_database(new, NULL); + + for (o = oldall; *o; o++) + ndevices++; + + old_matched = calloc(ndevices, sizeof(char)); + assert(old_matched); + + for (n = newall; *n; n++) + { + int found = 0; + printf("Matching %s\n", libwacom_get_name(*n)); + for (o = oldall, i = 0; *o && !found; o++, i++) + /* devices with multiple matches will have multiple + * devices in the list */ + if (old_matched[i] == 0 && + libwacom_compare(*n, *o, WCOMPARE_MATCHES) == 0) { + found = 1; + old_matched[i] = 1; + } + + if (!found) + printf("Failed to match '%s'\n", libwacom_get_name(*n)); + assert(found); + } + + for (i = 0; i < ndevices; i++) { + if (!old_matched[i]) + printf("No match for %s\n", + libwacom_get_name(oldall[i])); + assert(old_matched[i]); + } + +} + +/* write out the current db, read it back in, compare */ +static void +compare_written_database(WacomDeviceDatabase *db) +{ + char *dirname; + WacomDeviceDatabase *db_new; + WacomDevice **device, **devices; + int i; + + devices = libwacom_list_devices_from_database(db, NULL); + assert(devices); + assert(*devices); + + dirname = strdup("tmp.dbverify.XXXXXX"); + dirname = mkdtemp(dirname); + assert(dirname); + + for (device = devices, i = 0; *device; device++, i++) { + int i; + FILE *fp; + char *path = NULL; + int nstyli, *styli; + + asprintf(&path, "%s/%d-%04x-%04x.tablet", dirname, + libwacom_get_bustype(*device), + libwacom_get_vendor_id(*device), + libwacom_get_product_id(*device)); + assert(path); + fp = fopen(path, "w"); + assert(fp); + libwacom_print_device_description(fp, *device); + fclose(fp); + free(path); + + styli = libwacom_get_supported_styli(*device, &nstyli); + for (i = 0; i < nstyli; i++) { + FILE *fp_stylus; + const WacomStylus *stylus; + + asprintf(&path, "%s/%#x.stylus", dirname, styli[i]); + stylus = libwacom_stylus_get_for_id(db, styli[i]); + assert(stylus); + fp_stylus = fopen(path, "w"); + assert(fp_stylus); + libwacom_print_stylus_description(fp_stylus, stylus); + } + } + + db_new = libwacom_database_new_for_path(dirname); + assert(db_new); + compare_databases(db, db_new); + libwacom_database_destroy(db_new); + + rmtmpdir(dirname); + free(dirname); +} + + +int main(int argc, char **argv) +{ + WacomDeviceDatabase *db; + + db = libwacom_database_new_for_path(TOPSRCDIR"/data"); + if (!db) + printf("Failed to load data from %s", TOPSRCDIR"/data"); + assert(db); + + + compare_written_database(db); + libwacom_database_destroy (db); + + return 0; +} + +/* vim: set noexpandtab tabstop=8 shiftwidth=8: */ -- 1.7.10 ------------------------------------------------------------------------------ Better than sec? Nothing is better than sec when it comes to monitoring Big Data applications. Try Boundary one-second resolution app monitoring today. Free. http://p.sf.net/sfu/Boundary-dev2dev _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel