On Wed, Apr 18, 2012 at 12:42:04PM +0100, Bastien Nocera wrote:
> 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 <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)
> 
> Why do you need to do that? Seems to me that const is missing from a few
> function declarations then.

urgh, this was a rebase gone wrong and I had been staring at the patches for
too long to see anything. and that hunk above clearly belongs into the other
patch (4/8).

regarding const: we don't have const in a whole bunch of places. I started
adding it yesterday but didn't finish down that road. Constifying the API
will be a separate commit.

Cheers,
  Peter

> >  {
> >     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: */
> 
> 
> 

------------------------------------------------------------------------------
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

Reply via email to