On Wed, 2012-04-18 at 15:00 +1000, Peter Hutterer wrote:
> 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 <[email protected]>
> ---
> 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)
Why do you need to do that? Seems to me that const is missing from a few
function declarations then.
> {
> 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 ([email protected])
> + */
> +
> +#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: */
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel