[evolution-data-server/openismus-work-3-8: 117/121] Bug 709198 - Add regression test for contacts database migrations
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/openismus-work-3-8: 117/121] Bug 709198 - Add regression test for contacts database migrations
- Date: Thu, 3 Oct 2013 22:28:48 +0000 (UTC)
commit 4de40cda94021dc7ba8c0da4b484b68d62794698
Author: Tristan Van Berkom <tristanvb openismus com>
Date: Wed Sep 25 19:54:07 2013 +0200
Bug 709198 - Add regression test for contacts database migrations
The migration tests come with a few components:
o tests/book-migration/vcards/*.vcf:
The vcards which the test case expects to find in the migrated
databases.
o tests/book-migration/db/[various versions]/[File backend files]:
Various sandboxes created from the vcards, each one created
with a different stable version of EDS
o tests/book-migration/test-migration.c:
The actual test, this automatically loops over the available
test directories and runs the migration suite for each version
o tests/book-migration/setup-migration-test.c:
A simple program used to inject the test contacts into EDS,
this program can be used to generate the test sandbox from
EDS version 3.0 onward.
o The makefile also contains a 'setup-migration' target which
can be used to generate a new repository automatically in
the tests/book-migration/db/ directory with the current version,
this can only be used to generate the sandbox from 3.10 and
above.
Makefile.am | 2 +-
configure.ac | 15 +
tests/Makefile.am | 2 +-
tests/book-migration/Makefile.am | 102 ++++++
tests/book-migration/db/3.0/addressbook.db.summary | Bin 0 -> 2208 bytes
tests/book-migration/db/3.0/addressbook.dump | 49 +++
tests/book-migration/db/3.2/addressbook.dump | 49 +++
tests/book-migration/db/3.2/contacts.db | Bin 0 -> 15360 bytes
tests/book-migration/db/3.4/addressbook.dump | 50 +++
tests/book-migration/db/3.4/contacts.db | Bin 0 -> 15360 bytes
tests/book-migration/db/3.6/addressbook.dump | 50 +++
tests/book-migration/db/3.6/contacts.db | Bin 0 -> 15360 bytes
tests/book-migration/db/3.8/contacts.db | Bin 0 -> 23552 bytes
tests/book-migration/db/Makefile.am | 33 ++
tests/book-migration/setup-migration-test.c | 360 +++++++++++++++++++
tests/book-migration/test-migration.c | 374 ++++++++++++++++++++
tests/book-migration/vcards/migrate-1.vcf | 6 +
tests/book-migration/vcards/migrate-10.vcf | 6 +
tests/book-migration/vcards/migrate-11.vcf | 6 +
tests/book-migration/vcards/migrate-12.vcf | 7 +
tests/book-migration/vcards/migrate-13.vcf | 6 +
tests/book-migration/vcards/migrate-14.vcf | 6 +
tests/book-migration/vcards/migrate-15.vcf | 6 +
tests/book-migration/vcards/migrate-16.vcf | 6 +
tests/book-migration/vcards/migrate-17.vcf | 6 +
tests/book-migration/vcards/migrate-18.vcf | 6 +
tests/book-migration/vcards/migrate-19.vcf | 6 +
tests/book-migration/vcards/migrate-2.vcf | 7 +
tests/book-migration/vcards/migrate-20.vcf | 6 +
tests/book-migration/vcards/migrate-3.vcf | 7 +
tests/book-migration/vcards/migrate-4.vcf | 6 +
tests/book-migration/vcards/migrate-5.vcf | 6 +
tests/book-migration/vcards/migrate-6.vcf | 5 +
tests/book-migration/vcards/migrate-7.vcf | 5 +
tests/book-migration/vcards/migrate-8.vcf | 6 +
tests/book-migration/vcards/migrate-9.vcf | 6 +
36 files changed, 1205 insertions(+), 2 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index cd4a274..c363e69 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
ACLOCAL_AMFLAGS=-I m4
-DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-private-docs --with-krb5=/usr --enable-introspection
--disable-uoa
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-private-docs --with-krb5=/usr --enable-introspection
--disable-uoa --disable-goa
SUBDIRS = camel data private libedataserver libebackend addressbook calendar modules services tests docs art
po
diff --git a/configure.ac b/configure.ac
index 3d173c4..0cadb5e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -630,6 +630,19 @@ AC_SUBST(DB_CFLAGS)
AC_SUBST(DB_LIBS)
dnl ******************************
+dnl db_load checking
+dnl ******************************
+have_db_load=no
+AC_PATH_PROG(DB_LOAD, [db_load])
+if test -z "$DB_LOAD"; then
+ AC_MSG_WARN([db_load not found, some unit tests will not be run.])
+else
+ have_db_load=yes
+fi
+
+AM_CONDITIONAL(HAVE_DB_LOAD, test x"$have_db_load" = "xyes")
+
+dnl ******************************
dnl iconv checking
dnl ******************************
have_iconv="no"
@@ -1796,6 +1809,8 @@ tests/libebook/Makefile
tests/libebook-contacts/Makefile
tests/libebook/client/Makefile
tests/libebook/vcard/Makefile
+tests/book-migration/Makefile
+tests/book-migration/db/Makefile
tests/libecal/Makefile
tests/libecal/client/Makefile
tests/libedata-cal/Makefile
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c77168b..14fb8f7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = test-server-utils libedataserver libebook-contacts libedata-book libebook libecal libedata-cal
+SUBDIRS = test-server-utils libedataserver libebook-contacts libedata-book libebook book-migration libecal
libedata-cal
if BUILD_EXAMPLES
SUBDIRS += cursor-example
diff --git a/tests/book-migration/Makefile.am b/tests/book-migration/Makefile.am
new file mode 100644
index 0000000..ad8005f
--- /dev/null
+++ b/tests/book-migration/Makefile.am
@@ -0,0 +1,102 @@
+SUBDIRS = db
+
+noinst_PROGRAMS = \
+ setup-migration-test \
+ $(TESTS) \
+ $(NULL)
+
+TEST_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ -I$(top_srcdir)/addressbook \
+ -I$(top_builddir)/addressbook \
+ -I$(top_srcdir)/calendar \
+ -I$(top_builddir)/calendar \
+ -I$(top_srcdir)/tests/test-server-utils \
+ -I$(top_builddir)/tests/test-server-utils \
+ -I$(top_srcdir)/tests/libebook/client \
+ -I$(top_builddir)/tests/libebook/client \
+ -I$(top_srcdir)/private \
+ -I$(top_builddir)/private \
+ -DEDS_TEST_WORK_DIR=\""$(abs_top_builddir)/tests/test-server-utils/cache"\" \
+ -DEDS_TEST_SQLITE_BOOKS=\""$(abs_top_srcdir)/tests/book-migration/db"\" \
+ -DEDS_TEST_BUILT_BOOKS=\""$(abs_top_builddir)/tests/book-migration/db"\" \
+ $(EVOLUTION_ADDRESSBOOK_CFLAGS) \
+ $(CAMEL_CFLAGS) \
+ $(NULL)
+
+# If db_load is detected at configure time, then we've built
+# an addressbook.db to test the migration from 3.6 -> Current.
+#
+# Instead of committing a BDB file directly which might have
+# compatibility issues, we use a text dump (for SQLite we
+# rely on compatilbility).
+if HAVE_DB_LOAD
+TEST_CPPFLAGS += -DTEST_VERSIONS_WITH_BDB
+endif
+
+TEST_LIBS = \
+ $(top_builddir)/addressbook/libebook/libebook-1.2.la \
+ $(top_builddir)/tests/test-server-utils/libetestserverutils.la \
+ $(top_builddir)/tests/libebook/client/libclient-test-utils.la \
+ $(top_builddir)/private/libedbus-private.la \
+ $(EVOLUTION_ADDRESSBOOK_LIBS) \
+ $(CAMEL_LIBS) \
+ $(NULL)
+
+# Should be kept ordered approximately from least to most difficult/complex
+TESTS = \
+ test-migration \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(srcdir)/vcards/migrate-1.vcf \
+ $(srcdir)/vcards/migrate-2.vcf \
+ $(srcdir)/vcards/migrate-3.vcf \
+ $(srcdir)/vcards/migrate-4.vcf \
+ $(srcdir)/vcards/migrate-5.vcf \
+ $(srcdir)/vcards/migrate-6.vcf \
+ $(srcdir)/vcards/migrate-7.vcf \
+ $(srcdir)/vcards/migrate-8.vcf \
+ $(srcdir)/vcards/migrate-9.vcf \
+ $(srcdir)/vcards/migrate-10.vcf \
+ $(srcdir)/vcards/migrate-11.vcf \
+ $(srcdir)/vcards/migrate-12.vcf \
+ $(srcdir)/vcards/migrate-13.vcf \
+ $(srcdir)/vcards/migrate-14.vcf \
+ $(srcdir)/vcards/migrate-15.vcf \
+ $(srcdir)/vcards/migrate-16.vcf \
+ $(srcdir)/vcards/migrate-17.vcf \
+ $(srcdir)/vcards/migrate-18.vcf \
+ $(srcdir)/vcards/migrate-19.vcf \
+ $(srcdir)/vcards/migrate-20.vcf \
+ $(NULL)
+
+# This rule should be run once every stable release and then the
+# newly created 'contacts.db' file added to git.
+#
+# For instance, when the EDS version is 3.12, the file:
+# $(top_srcdir)/tests/book-migration/db/3.12/contacts.db
+# will be created as a result of running 'make setup-migration'.
+#
+# Note that the 'setup-migration-test' program can be compiled
+# with EDS versions back to 3.0. If you really need to rebuild
+# the older test sandboxes, then setup-migration-test can be
+# manually compiled and used with older builds of EDS.
+setup-migration: setup-migration-test
+ @echo -n "Setting up new migration sandbox in
$(top_srcdir)/tests/book-migration/db/$(EDS_MAJOR_VERSION).$(EDS_MINOR_VERSION)... " && \
+ $(top_builddir)/tests/book-migration/setup-migration-test \
+ --use-test-sandbox --book-id $(EDS_MAJOR_VERSION).$(EDS_MINOR_VERSION) \
+ --contacts-directory $(top_srcdir)/tests/book-migration/vcards && \
+ mkdir -p $(top_srcdir)/tests/book-migration/db/$(EDS_MAJOR_VERSION).$(EDS_MINOR_VERSION) &&
\
+ cp
$(top_builddir)/tests/test-server-utils/cache/evolution/addressbook/$(EDS_MAJOR_VERSION).$(EDS_MINOR_VERSION)/contacts.db
\
+ $(top_srcdir)/tests/book-migration/db/$(EDS_MAJOR_VERSION).$(EDS_MINOR_VERSION) && echo "Done."
+
+test_migration_LDADD=$(TEST_LIBS)
+test_migration_CPPFLAGS=$(TEST_CPPFLAGS)
+
+setup_migration_test_LDADD=$(TEST_LIBS)
+setup_migration_test_CPPFLAGS=$(TEST_CPPFLAGS)
+
+-include $(top_srcdir)/git.mk
diff --git a/tests/book-migration/db/3.0/addressbook.db.summary
b/tests/book-migration/db/3.0/addressbook.db.summary
new file mode 100644
index 0000000..ee0d9e4
Binary files /dev/null and b/tests/book-migration/db/3.0/addressbook.db.summary differ
diff --git a/tests/book-migration/db/3.0/addressbook.dump b/tests/book-migration/db/3.0/addressbook.dump
new file mode 100644
index 0000000..2569ba7
--- /dev/null
+++ b/tests/book-migration/db/3.0/addressbook.dump
@@ -0,0 +1,49 @@
+VERSION=3
+format=bytevalue
+type=hash
+h_nelem=21
+db_pagesize=4096
+HEADER=END
+ 5041532d44422d56455253494f4e00
+ 302e3200
+ 7061732d69642d3532343546394333303030303030303000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030300d0a4e3a6261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d69636865616c406a61636b736f6e2e636f6d0d0a464e3a4669727374204e616d65206261640d0a582d45564f4c5554494f4e2d46494c452d41533a6261645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030320d0a4e3a4dc3bc6c6c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a464e3a4669727374204e616d65204dc3bc6c6c65720d0a582d45564f4c5554494f4e2d46494c452d41533a4dc3bc6c6c65725c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030340d0a4e3a4261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a373635343332310d0a454d41494c3a6a616e6574406a61636b736f6e2e636f6d0d0a454d41494c3a6a616e6e79406a61636b736f6e2e636f6d0d0a464e3a4669727374204e616d65204261640d0a582d45564f4c5554494f4e2d46494c452d41533a4261645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030360d0a4e3a63c3b474653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a464e3a4669727374204e616d652063c3b474650d0a582d45564f4c5554494f4e2d46494c452d41533a63c3b474655c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303800
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030380d0a4e3a62c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b363636363636360d0a454d41494c3b545950453d686f6d652c776f726b3ae69591e591bd4062726f776e2e636f6d0d0a464e3a4669727374204e616d652062c3a4640d0a582d45564f4c5554494f4e2d46494c452d41533a62c3a4645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030420d0a4e3a42c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a61736b204a656e6e7920666f72204c6973612773206e756d6265720d0a464e3a4669727374204e616d652042c3a4640d0a582d45564f4c5554494f4e2d46494c452d41533a42c3a4645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030440d0a4e3a433b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d6973746572406a61636b736f6e2e636f6d0d0a464e3a4669727374204e616d6520430d0a582d45564f4c5554494f4e2d46494c452d41533a435c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030460d0a4e3a42c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b33312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a707572706c6540706f6e792e636f6d0d0a464e3a4669727374204e616d652042c3a4740d0a582d45564f4c5554494f4e2d46494c452d41533a42c3a4745c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030313100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303031310d0a4e3a626c61636b2d626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a464e3a4669727374204e616d6520626c61636b2d626972640d0a582d45564f4c5554494f4e2d46494c452d41533a626c61636b2d626972645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030313300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303031330d0a4e3a626c61636b62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a464e3a4669727374204e616d6520626c61636b62697264730d0a582d45564f4c5554494f4e2d46494c452d41533a626c61636b62697264735c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030310d0a4e3a4261743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b393939393939390d0a454d41494c3b545950453d776f726b3a626f6262794062726f776e2e6f72670d0a454d41494c3b545950453d686f6d652c776f726b3a626f6262794062726f776e2e636f6d0d0a464e3a4669727374204e616d65204261740d0a582d45564f4c5554494f4e2d46494c452d41533a4261745c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030330d0a464e3a5965204e616d656c657373204f6e650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6e616d65406c6573732e636f6d0d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030350d0a4e3a63c3b474c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a6a696d406d6f727269736f6e2e636f6d0d0a464e3a4669727374204e616d652063c3b474c3a90d0a582d45564f4c5554494f4e2d46494c452d41533a63c3b474c3a95c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303700
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030370d0a4e3a626c61636b2d62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a464e3a4669727374204e616d6520626c61636b2d62697264730d0a582d45564f4c5554494f4e2d46494c452d41533a626c61636b2d62697264735c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030303900
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030390d0a4e3a636f74653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a464e3a4669727374204e616d6520636f74650d0a582d45564f4c5554494f4e2d46494c452d41533a636f74655c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030410d0a4e3a62c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b34392d38392d373838382039390d0a464e3a4669727374204e616d652062c3a4740d0a582d45564f4c5554494f4e2d46494c452d41533a62c3a4745c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030430d0a4e3a636f74c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a464e3a4669727374204e616d6520636f74c3a90d0a582d45564f4c5554494f4e2d46494c452d41533a636f74c3a95c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030304500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303030450d0a4e3a4d7566666c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a464e3a4669727374204e616d65204d7566666c65720d0a582d45564f4c5554494f4e2d46494c452d41533a4d7566666c65725c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030313000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303031300d0a4e3a626c61636b626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a464e3a4669727374204e616d6520626c61636b626972640d0a582d45564f4c5554494f4e2d46494c452d41533a626c61636b626972645c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+ 7061732d69642d3532343546394333303030303030313200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354639433330303030303031320d0a4e3a6261743b4669727374204e616d650d0a54454c3b545950453d776f726b2c707265663a2b393939393939390d0a454d41494c3ae8ada6e5af9f4062726f776e2e6f72670d0a464e3a4669727374204e616d65206261740d0a582d45564f4c5554494f4e2d46494c452d41533a6261745c2c204669727374204e616d650d0a5245563a323031332d30392d32375432313a33333a35355a0d0a454e443a564341524400
+DATA=END
diff --git a/tests/book-migration/db/3.2/addressbook.dump b/tests/book-migration/db/3.2/addressbook.dump
new file mode 100644
index 0000000..191cfa8
--- /dev/null
+++ b/tests/book-migration/db/3.2/addressbook.dump
@@ -0,0 +1,49 @@
+VERSION=3
+format=bytevalue
+type=hash
+h_nelem=21
+db_pagesize=4096
+HEADER=END
+ 5041532d44422d56455253494f4e00
+ 302e3200
+ 7061732d69642d3532343546443033303030303030303000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030300d0a4e3a6261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d69636865616c406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030320d0a4e3a4dc3bc6c6c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030340d0a4e3a4261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a373635343332310d0a454d41494c3a6a616e6574406a61636b736f6e2e636f6d0d0a454d41494c3a6a616e6e79406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030360d0a4e3a63c3b474653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303800
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030380d0a4e3a62c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b363636363636360d0a454d41494c3b545950453d686f6d652c776f726b3ae69591e591bd4062726f776e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030304200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030420d0a4e3a42c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a61736b204a656e6e7920666f72204c6973612773206e756d6265720d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030304500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303030450d0a4e3a4d7566666c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030313000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303031300d0a4e3a626c61636b626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030313200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303031320d0a4e3a6261743b4669727374204e616d650d0a54454c3b545950453d776f726b2c707265663a2b393939393939390d0a454d41494c3ae8ada6e5af9f4062726f776e2e6f72670d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030310d0a4e3a4261743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b393939393939390d0a454d41494c3b545950453d776f726b3a626f6262794062726f776e2e6f72670d0a454d41494c3b545950453d686f6d652c776f726b3a626f6262794062726f776e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030330d0a464e3a5965204e616d656c657373204f6e650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6e616d65406c6573732e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030350d0a4e3a63c3b474c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a6a696d406d6f727269736f6e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303700
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030370d0a4e3a626c61636b2d62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030303900
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030390d0a4e3a636f74653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030304100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030410d0a4e3a62c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b34392d38392d373838382039390d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443033303030303030304300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303330303030303030430d0a4e3a636f74c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34375a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030304400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303030440d0a4e3a433b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d6973746572406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030304600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303030460d0a4e3a42c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b33312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a707572706c6540706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030313100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303031310d0a4e3a626c61636b2d626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+ 7061732d69642d3532343546443034303030303030313300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234354644303430303030303031330d0a4e3a626c61636b62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432313a34373a34385a0d0a454e443a564341524400
+DATA=END
diff --git a/tests/book-migration/db/3.2/contacts.db b/tests/book-migration/db/3.2/contacts.db
new file mode 100644
index 0000000..34abc23
Binary files /dev/null and b/tests/book-migration/db/3.2/contacts.db differ
diff --git a/tests/book-migration/db/3.4/addressbook.dump b/tests/book-migration/db/3.4/addressbook.dump
new file mode 100644
index 0000000..aadafcb
--- /dev/null
+++ b/tests/book-migration/db/3.4/addressbook.dump
@@ -0,0 +1,50 @@
+VERSION=3
+format=bytevalue
+type=hash
+db_pagesize=4096
+HEADER=END
+ 5041532d44422d56455253494f4e00
+ 302e3200
+ 7061732d69642d3532343630313846303030303030303100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031384630303030303030310d0a4e3a4261743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b393939393939390d0a454d41494c3b545950453d776f726b3a626f6262794062726f776e2e6f72670d0a454d41494c3b545950453d686f6d652c776f726b3a626f6262794062726f776e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31315a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030340d0a4e3a4261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a373635343332310d0a454d41494c3a6a616e6574406a61636b736f6e2e636f6d0d0a454d41494c3a6a616e6e79406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030360d0a4e3a63c3b474653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303800
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030380d0a4e3a62c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b363636363636360d0a454d41494c3b545950453d686f6d652c776f726b3ae69591e591bd4062726f776e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030304200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030420d0a4e3a42c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a61736b204a656e6e7920666f72204c6973612773206e756d6265720d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030304400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030440d0a4e3a433b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d6973746572406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030304500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303030450d0a4e3a4d7566666c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030313000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303031300d0a4e3a626c61636b626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030313200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303031320d0a4e3a6261743b4669727374204e616d650d0a54454c3b545950453d776f726b2c707265663a2b393939393939390d0a454d41494c3ae8ada6e5af9f4062726f776e2e6f72670d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+ 5041532d44422d5245564953494f4e00
+ 323031332d30392d32375432323a30373a31335a2832302900
+ 7061732d69642d3532343630313846303030303030303000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031384630303030303030300d0a4e3a6261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d69636865616c406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31315a0d0a454e443a564341524400
+ 7061732d69642d3532343630313846303030303030303200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031384630303030303030320d0a4e3a4dc3bc6c6c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432323a30373a31315a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030330d0a464e3a5965204e616d656c657373204f6e650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6e616d65406c6573732e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030350d0a4e3a63c3b474c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a6a696d406d6f727269736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303700
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030370d0a4e3a626c61636b2d62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030303900
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030390d0a4e3a636f74653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030304100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030410d0a4e3a62c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b34392d38392d373838382039390d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313930303030303030304300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393030303030303030430d0a4e3a636f74c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030304600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303030460d0a4e3a42c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b33312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a707572706c6540706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030313100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303031310d0a4e3a626c61636b2d626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+ 7061732d69642d3532343630313931303030303030313300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363031393130303030303031330d0a4e3a626c61636b62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a30373a31335a0d0a454e443a564341524400
+DATA=END
diff --git a/tests/book-migration/db/3.4/contacts.db b/tests/book-migration/db/3.4/contacts.db
new file mode 100644
index 0000000..20c20e9
Binary files /dev/null and b/tests/book-migration/db/3.4/contacts.db differ
diff --git a/tests/book-migration/db/3.6/addressbook.dump b/tests/book-migration/db/3.6/addressbook.dump
new file mode 100644
index 0000000..a83fbcf
--- /dev/null
+++ b/tests/book-migration/db/3.6/addressbook.dump
@@ -0,0 +1,50 @@
+VERSION=3
+format=bytevalue
+type=hash
+db_pagesize=4096
+HEADER=END
+ 5041532d44422d56455253494f4e00
+ 302e3200
+ 7061732d69642d3532343630344438303030303030303000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030300d0a4e3a6261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d69636865616c406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030320d0a4e3a4dc3bc6c6c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030340d0a4e3a4261643b4669727374204e616d650d0a54454c3b545950453d484f4d453a373635343332310d0a454d41494c3a6a616e6574406a61636b736f6e2e636f6d0d0a454d41494c3a6a616e6e79406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030360d0a4e3a63c3b474653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303800
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030380d0a4e3a62c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b363636363636360d0a454d41494c3b545950453d686f6d652c776f726b3ae69591e591bd4062726f776e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030420d0a4e3a42c3a4643b4669727374204e616d650d0a54454c3b545950453d484f4d453a61736b204a656e6e7920666f72204c6973612773206e756d6265720d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304400
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030440d0a4e3a433b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6d6973746572406a61636b736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304600
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030460d0a4e3a42c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b33312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a707572706c6540706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030313100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303031310d0a4e3a626c61636b2d626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6f72670d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030313300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303031330d0a4e3a626c61636b62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 5041532d44422d5245564953494f4e00
+ 323031332d30392d32375432323a32313a31325a28312900
+ 7061732d69642d3532343630344438303030303030303100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030310d0a4e3a4261743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b393939393939390d0a454d41494c3b545950453d776f726b3a626f6262794062726f776e2e6f72670d0a454d41494c3b545950453d686f6d652c776f726b3a626f6262794062726f776e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030330d0a464e3a5965204e616d656c657373204f6e650d0a54454c3b545950453d484f4d453a2b312d3232312d353432333738390d0a454d41494c3b545950453d686f6d652c776f726b3a6e616d65406c6573732e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030350d0a4e3a63c3b474c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a6a696d406d6f727269736f6e2e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303700
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030370d0a4e3a626c61636b2d62697264733b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030303900
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030390d0a4e3a636f74653b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304100
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030410d0a4e3a62c3a4743b4669727374204e616d650d0a54454c3b545950453d484f4d453a2b34392d38392d373838382039390d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304300
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030430d0a4e3a636f74c3a93b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030304500
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303030450d0a4e3a4d7566666c65723b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e6e65740d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030313000
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303031300d0a4e3a626c61636b626972643b4669727374204e616d650d0a54454c3b545950453d484f4d453a3531342d3834352d383433360d0a454d41494c3b545950453d686f6d652c776f726b3a70696e6b40706f6e792e636f6d0d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+ 7061732d69642d3532343630344438303030303030313200
+
424547494e3a56434152440d0a56455253494f4e3a332e300d0a5549443a7061732d69642d353234363034443830303030303031320d0a4e3a6261743b4669727374204e616d650d0a54454c3b545950453d776f726b2c707265663a2b393939393939390d0a454d41494c3ae8ada6e5af9f4062726f776e2e6f72670d0a5245563a323031332d30392d32375432323a32313a31325a0d0a454e443a564341524400
+DATA=END
diff --git a/tests/book-migration/db/3.6/contacts.db b/tests/book-migration/db/3.6/contacts.db
new file mode 100644
index 0000000..341da03
Binary files /dev/null and b/tests/book-migration/db/3.6/contacts.db differ
diff --git a/tests/book-migration/db/3.8/contacts.db b/tests/book-migration/db/3.8/contacts.db
new file mode 100644
index 0000000..e9ef88a
Binary files /dev/null and b/tests/book-migration/db/3.8/contacts.db differ
diff --git a/tests/book-migration/db/Makefile.am b/tests/book-migration/db/Makefile.am
new file mode 100644
index 0000000..5fc012d
--- /dev/null
+++ b/tests/book-migration/db/Makefile.am
@@ -0,0 +1,33 @@
+
+EXTRA_DIST = \
+ 3.0/addressbook.dump 3.0/addressbook.db.summary \
+ 3.2/addressbook.dump 3.2/contacts.db \
+ 3.4/addressbook.dump 3.4/contacts.db \
+ 3.6/addressbook.dump 3.6/contacts.db \
+ 3.8/contacts.db
+
+# Use db_load with our BDB dump text file
+if HAVE_DB_LOAD
+
+GENERATED_DBS = \
+ $(top_builddir)/tests/book-migration/db/3.0/addressbook.db \
+ $(top_builddir)/tests/book-migration/db/3.2/addressbook.db \
+ $(top_builddir)/tests/book-migration/db/3.4/addressbook.db \
+ $(top_builddir)/tests/book-migration/db/3.6/addressbook.db
+
+noinst_DATA = $(GENERATED_DBS)
+CLEANFILES = $(GENERATED_DBS)
+
+$(top_builddir)/tests/book-migration/db/3.0/addressbook.db:
$(top_srcdir)/tests/book-migration/db/3.0/addressbook.dump
+ $(AM_V_GEN) mkdir -p $(top_builddir)/tests/book-migration/db/3.0 && $(DB_LOAD) -f $< $@
+
+$(top_builddir)/tests/book-migration/db/3.2/addressbook.db:
$(top_srcdir)/tests/book-migration/db/3.2/addressbook.dump
+ $(AM_V_GEN) mkdir -p $(top_builddir)/tests/book-migration/db/3.2 && $(DB_LOAD) -f $< $@
+
+$(top_builddir)/tests/book-migration/db/3.4/addressbook.db:
$(top_srcdir)/tests/book-migration/db/3.4/addressbook.dump
+ $(AM_V_GEN) mkdir -p $(top_builddir)/tests/book-migration/db/3.4 && $(DB_LOAD) -f $< $@
+
+$(top_builddir)/tests/book-migration/db/3.6/addressbook.db:
$(top_srcdir)/tests/book-migration/db/3.6/addressbook.dump
+ $(AM_V_GEN) mkdir -p $(top_builddir)/tests/book-migration/db/3.6 && $(DB_LOAD) -f $< $@
+
+endif
diff --git a/tests/book-migration/setup-migration-test.c b/tests/book-migration/setup-migration-test.c
new file mode 100644
index 0000000..46dd142
--- /dev/null
+++ b/tests/book-migration/setup-migration-test.c
@@ -0,0 +1,360 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU Lesser General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Authors: Tristan Van Berkom <tristanvb openismus com>
+ */
+
+#include <glib.h>
+
+#include <libedataserver/eds-version.h>
+
+#if EDS_CHECK_VERSION(3,6,0)
+# include <libebook/libebook.h>
+/* In 3.10, we support the --use-test-sandbox option */
+# if EDS_CHECK_VERSION(3,10,0)
+# include "client-test-utils.h"
+# include "e-test-server-utils.h"
+# endif
+#else
+# include <libebook/e-contact.h>
+# include <libebook/e-book.h>
+#endif
+
+#if EDS_CHECK_VERSION(3,6,0)
+typedef EBookClient Book;
+#else
+typedef EBook Book;
+#endif
+
+static Book *create_book (const gchar *book_id);
+static void add_contacts (Book *book, GSList *contacts);
+
+static gchar *book_id = NULL;
+static gchar *contacts_directory = NULL;
+static gboolean test_sandbox = FALSE;
+
+static GOptionEntry option_entries[] = {
+ {"book-id", 'b', 0, G_OPTION_ARG_STRING, &book_id,
+ "The book identifier string", NULL },
+ {"contacts-directory", 'd', 0, G_OPTION_ARG_FILENAME, &contacts_directory,
+ "The directory from where to read the contact files", NULL },
+ {"use-test-sandbox", 't', 0, G_OPTION_ARG_NONE, &test_sandbox,
+ "Whether to use the test case sandbox to create the test book "
+ "(Only available after EDS 3.10)", NULL },
+ { NULL }
+};
+
+/********************************************************
+ * Loading contacts from directory *
+ ********************************************************/
+static EContact *
+contact_from_file (const gchar *vcard_file)
+{
+ EContact *contact;
+ GError *error;
+ gchar *vcard = NULL;
+
+ if (!g_file_get_contents (vcard_file, &vcard, NULL, &error))
+ g_error ("Failed to load vcard: %s", error->message);
+
+ contact = e_contact_new_from_vcard (vcard);
+ g_free (vcard);
+
+ return contact;
+}
+
+static GSList *
+load_contacts (const gchar *vcard_directory)
+{
+ GDir *dir;
+ GError *error = NULL;
+ const gchar *filename;
+ GSList *contacts = NULL;
+
+ dir = g_dir_open (vcard_directory, 0, &error);
+ if (!dir)
+ g_error ("Failed to open vcard directory '%s': %s", vcard_directory, error->message);
+
+ while ((filename = g_dir_read_name (dir)) != NULL) {
+
+ if (g_str_has_suffix (filename, ".vcf")) {
+ gchar *fullpath = g_build_filename (vcard_directory, filename, NULL);
+ EContact *contact;
+
+ contact = contact_from_file (fullpath);
+ contacts = g_slist_prepend (contacts, contact);
+
+ g_free (fullpath);
+ }
+ }
+
+ g_dir_close (dir);
+
+ return g_slist_reverse (contacts);
+}
+
+/********************************************************
+ * Creating the Book *
+ ********************************************************/
+#if EDS_CHECK_VERSION(3,6,0)
+
+typedef struct {
+ GMainLoop *loop;
+ const gchar *book_id;
+ EBookClient *book;
+} SourceAddedData;
+
+static void
+source_added (ESourceRegistry *registry,
+ ESource *source,
+ gpointer data)
+{
+ SourceAddedData *added_data = (SourceAddedData *)data;
+ GError *error = NULL;
+
+ if (g_strcmp0 (e_source_get_uid (source), added_data->book_id) != 0)
+ return;
+
+ /* Open the address book */
+#if EDS_CHECK_VERSION(3,8,0)
+ added_data->book = (EBookClient *)e_book_client_connect_sync (source, NULL, &error);
+#else
+ /* With 3.6 it's a bit more tricky */
+ added_data->book = e_book_client_new (source, &error);
+ if (added_data->book &&
+ !e_client_open_sync (E_CLIENT (added_data->book), FALSE, NULL, &error))
+ g_error ("Failed to open addressbook: %s", error->message);
+#endif
+
+ if (!added_data->book)
+ g_error ("Failed to create addressbook: %s", error->message);
+
+ if (added_data->loop)
+ g_main_loop_quit (added_data->loop);
+}
+
+static gboolean
+create_source_timeout (gpointer user_data)
+{
+ g_error ("Timed out while waiting for ESource creation from the registry");
+
+ return FALSE;
+}
+
+static EBookClient *
+create_book (const gchar *book_id)
+{
+ ESourceRegistry *registry;
+ ESource *scratch;
+ ESourceBackend *backend = NULL;
+ GError *error = NULL;
+ SourceAddedData data = { NULL, NULL, NULL };
+
+ g_return_val_if_fail (book_id != NULL, NULL);
+
+ data.loop = g_main_loop_new (NULL, FALSE);
+
+ registry = e_source_registry_new_sync (NULL, &error);
+ if (!registry)
+ g_error ("Unable to create the registry: %s", error->message);
+
+ /* Listen to the registry for our added source */
+ data.book_id = book_id;
+ g_signal_connect (registry, "source-added",
+ G_CALLBACK (source_added), &data);
+
+ /* Now create a scratch source for our addressbook */
+ scratch = e_source_new_with_uid (book_id, NULL, &error);
+ if (!scratch)
+ g_error ("Failed to create scratch source: %s", error->message);
+
+ /* Ensure the new ESource will be a local addressbook source */
+ backend = e_source_get_extension (scratch, E_SOURCE_EXTENSION_ADDRESS_BOOK);
+ e_source_backend_set_backend_name (backend, "local");
+
+ /* Commit the source to the registry */
+ if (!e_source_registry_commit_source_sync (registry, scratch, NULL, &error))
+ g_error ("Unable to add new addressbook source to the registry: %s", error->message);
+
+ g_object_unref (scratch);
+
+ if (data.book == NULL) {
+ g_timeout_add (20 * 1000, create_source_timeout, NULL);
+ g_main_loop_run (data.loop);
+
+ /* By now we aborted or we have an addressbook created */
+ g_assert (data.book != NULL);
+ }
+
+ g_main_loop_unref (data.loop);
+ g_object_unref (registry);
+
+ return data.book;
+}
+
+#else
+
+static EBook *
+create_book (const gchar *book_id)
+{
+ EBook *book;
+ GError *error = NULL;
+
+ book = e_book_new_from_uri (book_id, &error);
+
+ if (!book)
+ g_error ("Error creating book: %s", error->message);
+
+ if (!e_book_open (book, FALSE, &error))
+ g_error ("Error opening book: %s", error->message);
+
+ return book;
+}
+
+#endif
+
+
+/********************************************************
+ * Adding the Contacts *
+ ********************************************************/
+#if EDS_CHECK_VERSION(3,6,0)
+
+static void
+add_contacts (Book *book,
+ GSList *contacts)
+{
+ GError *error = NULL;
+
+ if (!e_book_client_add_contacts_sync (book, contacts, NULL, NULL, &error))
+ g_error ("Failed to add contacts: %s", error->message);
+}
+
+#else
+
+static void
+add_contacts (Book *book,
+ GSList *contacts)
+{
+ GError *error = NULL;
+ GSList *l;
+
+ for (l = contacts; l; l = l->next) {
+ EContact *contact = l->data;
+
+ if (!e_book_add_contact (book, contact, &error))
+ g_error ("Failed to add a contact: %s", error->message);
+ }
+}
+
+#endif
+
+/* Support running this in a test case in 3.10 and later */
+#if EDS_CHECK_VERSION(3,10,0)
+
+static ETestServerClosure book_closure = {
+ E_TEST_SERVER_ADDRESS_BOOK,
+ NULL, /* Source customization function */
+ 0, /* Calendar Type */
+ TRUE, /* Keep the working sandbox after the test, don't remove it */
+ NULL, /* Destroy Notify function */
+};
+
+static void
+setup_migration_setup (ETestServerFixture *fixture,
+ gconstpointer user_data)
+{
+ fixture->source_name = g_strdup_printf ("%d.%d", EDS_MAJOR_VERSION, EDS_MINOR_VERSION);
+ e_test_server_utils_setup (fixture, user_data);
+}
+
+static void
+setup_migration_run (ETestServerFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ GSList *contacts;
+
+ contacts = load_contacts (contacts_directory);
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+ add_contacts (book_client, contacts);
+ g_slist_free_full (contacts, g_object_unref);
+}
+
+#endif
+
+/********************************************************
+ * main() *
+ ********************************************************/
+gint
+main (gint argc, gchar *argv[])
+{
+ GOptionContext *option_context;
+ GOptionGroup *option_group;
+ GError *error = NULL;
+ GSList *contacts;
+ Book *book;
+
+ option_context = g_option_context_new (NULL);
+ g_option_context_set_summary (option_context,
+ "Populate a database for migration tests.");
+
+ option_group = g_option_group_new ("setup migration test",
+ "Setup Migration options",
+ "Setup Migration options", NULL, NULL);
+ g_option_group_add_entries (option_group, option_entries);
+ g_option_context_set_main_group (option_context, option_group);
+
+ if (!g_option_context_parse (option_context, &argc, &argv, &error))
+ g_error ("Failed to parse program arguments: %s", error->message);
+
+ if (!book_id || !contacts_directory)
+ g_error ("Must provide the book identifier and contacts directory\n%s",
+ g_option_context_get_help (option_context, TRUE, NULL));
+
+
+ if (test_sandbox) {
+
+#if EDS_CHECK_VERSION(3,10,0)
+ g_test_init (&argc, &argv, NULL);
+ g_test_add ("/SettingUpMigrationTest",
+ ETestServerFixture,
+ &book_closure,
+ setup_migration_setup,
+ setup_migration_run,
+ e_test_server_utils_teardown);
+
+ return e_test_server_utils_run ();
+#else
+ g_error ("Requested sandboxed setup but that is not available until EDS 3.10, current version
is %d.%d",
+ EDS_MAJOR_VERSION, EDS_MINOR_VERSION);
+#endif
+ } else {
+
+ contacts = load_contacts (contacts_directory);
+
+ book = create_book (book_id);
+ add_contacts (book, contacts);
+
+ g_object_unref (book);
+
+ g_slist_free_full (contacts, g_object_unref);
+ }
+
+ return 0;
+}
diff --git a/tests/book-migration/test-migration.c b/tests/book-migration/test-migration.c
new file mode 100644
index 0000000..4e63670
--- /dev/null
+++ b/tests/book-migration/test-migration.c
@@ -0,0 +1,374 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU Lesser General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Authors: Tristan Van Berkom <tristanvb openismus com>
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <libebook/libebook.h>
+
+#include "client-test-utils.h"
+#include "e-test-server-utils.h"
+
+typedef struct {
+ ETestServerFixture parent_fixture;
+} MigrationFixture;
+
+typedef struct {
+ ETestServerClosure parent;
+ gchar *version;
+} MigrationClosure;
+
+typedef void ( *MigrationTestFunc) (MigrationFixture *fixture,
+ gconstpointer user_data);
+
+static const gchar *arbitrary_vcard =
+ "BEGIN:VCARD\n"
+ "UID:arbitrary-vcard\n"
+ "FN:Bobby Brown\n"
+ "TEL;HOME:+9999999\n"
+ "EMAIL;TYPE=work:bobby brown org\n"
+ "EMAIL;TYPE=home,work:bobby brown com\n"
+ "END:VCARD\n";
+
+/***********************************************************
+ * Fixture *
+ ***********************************************************/
+static void
+setup_migration_sandbox (const gchar *version)
+{
+ gchar *dest_dir, *dest_bdb, *dest;
+ gchar *src_bdb, *src;
+ GFile *src_file, *dest_file;
+ GError *error = NULL;
+
+ dest_dir = g_build_filename (EDS_TEST_WORK_DIR, "evolution", "addressbook", version, NULL);
+ dest_bdb = g_build_filename (dest_dir, "addressbook.db", NULL);
+ dest = g_build_filename (dest_dir, "contacts.db", NULL);
+
+ src_bdb = g_build_filename (EDS_TEST_BUILT_BOOKS, version, "addressbook.db", NULL);
+ src = g_build_filename (EDS_TEST_SQLITE_BOOKS, version, "contacts.db", NULL);
+
+ /* Create the directory for the database files */
+ g_assert (g_mkdir_with_parents (dest_dir, 0755) == 0);
+
+ /* If there is a BDB for this version, copy it over */
+ if (g_file_test (src_bdb, G_FILE_TEST_IS_REGULAR)) {
+ src_file = g_file_new_for_path (src_bdb);
+ dest_file = g_file_new_for_path (dest_bdb);
+
+ if (!g_file_copy (src_file, dest_file,
+ G_FILE_COPY_OVERWRITE |
+ G_FILE_COPY_TARGET_DEFAULT_PERMS,
+ NULL, NULL, NULL, &error))
+ g_error ("Failed to setup sandbox for %s migration test: %s",
+ version, error->message);
+
+ g_object_unref (src_file);
+ g_object_unref (dest_file);
+ }
+
+ /* Setup the contacts.db for migration */
+ if (g_file_test (src, G_FILE_TEST_IS_REGULAR)) {
+ src_file = g_file_new_for_path (src);
+ dest_file = g_file_new_for_path (dest);
+
+ if (!g_file_copy (src_file, dest_file,
+ G_FILE_COPY_OVERWRITE |
+ G_FILE_COPY_TARGET_DEFAULT_PERMS,
+ NULL, NULL, NULL, &error))
+ g_error ("Failed to setup sandbox for %s migration test: %s",
+ version, error->message);
+
+ g_object_unref (src_file);
+ g_object_unref (dest_file);
+ }
+
+ g_free (dest_dir);
+ g_free (dest_bdb);
+ g_free (dest);
+
+ g_free (src_bdb);
+ g_free (src);
+}
+
+static void
+migration_fixture_setup (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ ETestServerFixture *parent = (ETestServerFixture *)fixture;
+ MigrationClosure *closure = (MigrationClosure *)user_data;
+
+ parent->source_name = g_strdup (closure->version);
+
+ setup_migration_sandbox (closure->version);
+
+ e_test_server_utils_setup ((ETestServerFixture *)parent, user_data);
+}
+
+static void
+migration_fixture_teardown (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ e_test_server_utils_teardown ((ETestServerFixture *)fixture, user_data);
+}
+
+
+/***********************************************************
+ * Tests *
+ ***********************************************************/
+static void
+test_open (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+
+}
+
+static void
+test_fetch_contacts (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ GSList *contacts = NULL;
+ GError *error = NULL;
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+
+ if (!e_book_client_get_contacts_sync (book_client,
+ "",
+ &contacts,
+ NULL, &error))
+ g_error ("Failed to fetch contacts: %s", error->message);
+
+ /* Assert some more things related to the actually expected contacts here... */
+ g_assert_cmpint (g_slist_length (contacts), ==, 20);
+
+ g_slist_free_full (contacts, g_object_unref);
+}
+
+static void
+test_add_remove_contact (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ EContact *contact = NULL;
+ GError *error = NULL;
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+
+ contact = e_contact_new_from_vcard (arbitrary_vcard);
+
+ if (!e_book_client_add_contact_sync (book_client, contact, NULL, NULL, &error))
+ g_error ("Failed to add contact: %s", error->message);
+
+ if (!e_book_client_remove_contact_sync (book_client, contact, NULL, &error))
+ g_error ("Failed to remove contact: %s", error->message);
+
+ g_object_unref (contact);
+}
+
+static GSList *
+test_query (EBookClient *book_client,
+ gint expected_results,
+ EBookQuery *query)
+{
+ GSList *contacts = NULL;
+ GError *error = NULL;
+ gchar *sexp;
+
+ sexp = e_book_query_to_string (query);
+
+ if (!e_book_client_get_contacts_sync (book_client, sexp,
+ &contacts, NULL, &error))
+ g_error ("Failed to fetch contacts: %s", error->message);
+
+ g_free (sexp);
+ e_book_query_unref (query);
+
+ g_assert_cmpint (g_slist_length (contacts), ==, expected_results);
+
+ return contacts;
+}
+
+static void
+test_query_email (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ GSList *contacts = NULL;
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+
+ contacts = test_query (book_client, 13,
+ e_book_query_field_test (
+ E_CONTACT_EMAIL,
+ E_BOOK_QUERY_ENDS_WITH,
+ ".com"));
+
+ g_slist_free_full (contacts, g_object_unref);
+}
+
+static void
+test_query_name (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ GSList *contacts = NULL;
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+
+ contacts = test_query (book_client, 4,
+ e_book_query_field_test (
+ E_CONTACT_FULL_NAME,
+ E_BOOK_QUERY_CONTAINS,
+ "cote"));
+
+ g_slist_free_full (contacts, g_object_unref);
+}
+
+static void
+test_query_phone (MigrationFixture *fixture,
+ gconstpointer user_data)
+{
+ EBookClient *book_client;
+ GSList *contacts = NULL;
+
+ book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
+
+ contacts = test_query (book_client, 4,
+ e_book_query_field_test (
+ E_CONTACT_TEL,
+ E_BOOK_QUERY_CONTAINS,
+ "221"));
+
+ g_slist_free_full (contacts, g_object_unref);
+}
+
+/***********************************************************
+ * Main *
+ ***********************************************************/
+static GList *
+list_migration_sandboxes (void)
+{
+ GDir *dir;
+ GError *error = NULL;
+ const gchar *filename;
+ GList *sandboxes = NULL;
+
+ dir = g_dir_open (EDS_TEST_SQLITE_BOOKS, 0, &error);
+ if (!dir)
+ g_error ("Failed to open migration sandbox directory '%s': %s",
+ EDS_TEST_SQLITE_BOOKS, error->message);
+
+ while ((filename = g_dir_read_name (dir)) != NULL) {
+
+ gchar *fullpath = g_build_filename (EDS_TEST_SQLITE_BOOKS, filename, NULL);
+
+ if (g_file_test (fullpath, G_FILE_TEST_IS_DIR)) {
+
+#if defined (TEST_VERSIONS_WITH_BDB)
+ sandboxes = g_list_prepend (sandboxes, g_strdup (filename));
+#else
+ /* We allow compilation of EDS on a system without the db_load utility, if this
+ * is the case then we skip the migration tests from versions of EDS where we
+ * used Berkeley DB
+ */
+ gchar *old_bdb = g_build_filename (EDS_TEST_BOOKS, filename, "addressbook.dump",
NULL);
+
+ if (!g_file_test (old_bdb, G_FILE_TEST_EXISTS))
+ sandboxes = g_list_prepend (sandboxes, g_strdup (filename));
+
+ g_free (old_bdb);
+#endif
+ }
+
+ g_free (fullpath);
+ }
+
+ g_dir_close (dir);
+
+ return sandboxes;
+}
+
+static void
+migration_closure_free (MigrationClosure *closure)
+{
+ g_free (closure->version);
+ g_slice_free (MigrationClosure, closure);
+}
+
+static void
+add_test (const gchar *version,
+ const gchar *test_name,
+ MigrationTestFunc test_func)
+{
+ MigrationClosure *closure;
+ gchar *path;
+
+ closure = g_slice_new0 (MigrationClosure);
+
+ closure->parent.type = E_TEST_SERVER_ADDRESS_BOOK;
+ closure->parent.destroy_closure_func = (GDestroyNotify)migration_closure_free;
+ closure->parent.keep_work_directory = TRUE;
+ closure->version = g_strdup (version);
+
+ path = g_strdup_printf ("/Migration/From-%s/%s",
+ version, test_name);
+
+ g_test_add (path, MigrationFixture, closure,
+ migration_fixture_setup,
+ test_func,
+ migration_fixture_teardown);
+
+ g_free (path);
+}
+
+gint
+main (gint argc,
+ gchar **argv)
+{
+ GList *sandboxes, *l;
+ gint ret;
+
+#if !GLIB_CHECK_VERSION (2, 35, 1)
+ g_type_init ();
+#endif
+ g_test_init (&argc, &argv, NULL);
+ g_test_bug_base ("http://bugzilla.gnome.org/");
+
+ sandboxes = list_migration_sandboxes ();
+
+ for (l = sandboxes; l; l = l->next) {
+ gchar *version = l->data;
+
+ add_test (version, "Open", test_open);
+ add_test (version, "FetchContacts", test_fetch_contacts);
+ add_test (version, "AddRemoveContact", test_add_remove_contact);
+ add_test (version, "Query/FullName", test_query_name);
+ add_test (version, "Query/Phone", test_query_phone);
+ add_test (version, "Query/Email", test_query_email);
+ }
+
+ g_list_free_full (sandboxes, g_free);
+
+ ret = e_test_server_utils_run ();
+
+ return ret;
+}
diff --git a/tests/book-migration/vcards/migrate-1.vcf b/tests/book-migration/vcards/migrate-1.vcf
new file mode 100644
index 0000000..bd4fdbf
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-1.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-1
+N:bad;First Name
+TEL;HOME:+1-221-5423789
+EMAIL;TYPE=home,work:micheal jackson com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-10.vcf b/tests/book-migration/vcards/migrate-10.vcf
new file mode 100644
index 0000000..3fbb99b
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-10.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-10
+N:C;First Name
+TEL;HOME:+1-221-5423789
+EMAIL;TYPE=home,work:mister jackson com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-11.vcf b/tests/book-migration/vcards/migrate-11.vcf
new file mode 100644
index 0000000..b820cc8
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-11.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-11
+FN:Ye Nameless One
+TEL;HOME:+1-221-5423789
+EMAIL;TYPE=home,work:name less com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-12.vcf b/tests/book-migration/vcards/migrate-12.vcf
new file mode 100644
index 0000000..b600d03
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-12.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+UID:sorted-12
+N:coté;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony com
+END:VCARD
+
diff --git a/tests/book-migration/vcards/migrate-13.vcf b/tests/book-migration/vcards/migrate-13.vcf
new file mode 100644
index 0000000..a13875c
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-13.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-13
+N:côte;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony org
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-14.vcf b/tests/book-migration/vcards/migrate-14.vcf
new file mode 100644
index 0000000..cd803b5
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-14.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-14
+N:cote;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-15.vcf b/tests/book-migration/vcards/migrate-15.vcf
new file mode 100644
index 0000000..403bc70
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-15.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-15
+N:black-bird;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony org
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-16.vcf b/tests/book-migration/vcards/migrate-16.vcf
new file mode 100644
index 0000000..6e845db
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-16.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-16
+N:blackbird;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-17.vcf b/tests/book-migration/vcards/migrate-17.vcf
new file mode 100644
index 0000000..5f62f4d
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-17.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-17
+N:black-birds;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-18.vcf b/tests/book-migration/vcards/migrate-18.vcf
new file mode 100644
index 0000000..c3c3b69
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-18.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-18
+N:blackbirds;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-19.vcf b/tests/book-migration/vcards/migrate-19.vcf
new file mode 100644
index 0000000..2971aa2
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-19.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-19
+N:Muffler;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony net
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-2.vcf b/tests/book-migration/vcards/migrate-2.vcf
new file mode 100644
index 0000000..9a9b8a2
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-2.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+UID:sorted-2
+N:Bad;First Name
+TEL;HOME:7654321
+EMAIL:janet jackson com
+EMAIL:janny jackson com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-20.vcf b/tests/book-migration/vcards/migrate-20.vcf
new file mode 100644
index 0000000..2d4c8ee
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-20.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-20
+N:Müller;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:pink pony net
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-3.vcf b/tests/book-migration/vcards/migrate-3.vcf
new file mode 100644
index 0000000..5f75eeb
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-3.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+UID:sorted-3
+N:Bat;First Name
+TEL;HOME:+9999999
+EMAIL;TYPE=work:bobby brown org
+EMAIL;TYPE=home,work:bobby brown com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-4.vcf b/tests/book-migration/vcards/migrate-4.vcf
new file mode 100644
index 0000000..e2fb999
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-4.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-4
+N:bat;First Name
+TEL;TYPE=work,pref:+9999999
+EMAIL:警察 brown org
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-5.vcf b/tests/book-migration/vcards/migrate-5.vcf
new file mode 100644
index 0000000..10360d6
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-5.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-5
+N:bäd;First Name
+TEL;HOME:+6666666
+EMAIL;TYPE=home,work:救命 brown com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-6.vcf b/tests/book-migration/vcards/migrate-6.vcf
new file mode 100644
index 0000000..2af7b7d
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-6.vcf
@@ -0,0 +1,5 @@
+BEGIN:VCARD
+UID:sorted-6
+N:Bäd;First Name
+TEL;HOME:ask Jenny for Lisa's number
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-7.vcf b/tests/book-migration/vcards/migrate-7.vcf
new file mode 100644
index 0000000..4a9c3e6
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-7.vcf
@@ -0,0 +1,5 @@
+BEGIN:VCARD
+UID:sorted-7
+N:bät;First Name
+TEL;HOME:+49-89-7888 99
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-8.vcf b/tests/book-migration/vcards/migrate-8.vcf
new file mode 100644
index 0000000..456181e
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-8.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-8
+N:Bät;First Name
+TEL;HOME:+31-221-5423789
+EMAIL;TYPE=home,work:purple pony com
+END:VCARD
diff --git a/tests/book-migration/vcards/migrate-9.vcf b/tests/book-migration/vcards/migrate-9.vcf
new file mode 100644
index 0000000..a5ed36b
--- /dev/null
+++ b/tests/book-migration/vcards/migrate-9.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+UID:sorted-9
+N:côté;First Name
+TEL;HOME:514-845-8436
+EMAIL;TYPE=home,work:jim morrison com
+END:VCARD
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]