Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--tests/.gitignore1
-rw-r--r--tests/Makefile20
-rw-r--r--tests/__init__.py1
-rw-r--r--tests/basic_api.txt82
-rwxr-xr-xtests/runalltests.py107
6 files changed, 212 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index 5fa2790..a376db3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,6 +2,7 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = bin etc src
+check: test
test:
@cd tests
$(MAKE) -C tests test
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..2460008
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1 @@
+!Makefile
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..282fd56
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,20 @@
+all: clean test
+
+test:
+ # bad hack to make Python extensions work from source directory
+ cp ../src/carquinyol/.libs/*.so ../src/carquinyol/
+ @./runalltests.py
+
+valgrind:
+ @echo "Profiling the process. Run kcachegrind on the output"
+ valgrind --tool=callgrind --suppressions=valgrind-python.supp ${PYTHON} runalltests.py
+
+clean:
+ @${PYTHON} ./cleaner.py
+ @find . -name "*.pyc" -exec rm {} \;
+ @find . -name "*~" -exec rm {} \;
+ @find . -name "callgrind.out*" -exec rm {} \;
+
+tags:
+
+
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..5b3912c
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1 @@
+# testing package
diff --git a/tests/basic_api.txt b/tests/basic_api.txt
new file mode 100644
index 0000000..73f2741
--- /dev/null
+++ b/tests/basic_api.txt
@@ -0,0 +1,82 @@
+
+Define some helper functions
+>>> def test_unique(items) :
+... return not [True for e in items if items.count(e) > 1]
+
+
+Connect to datastore using DBus and wait for it to get ready:
+>>> import dbus
+>>> DS_DBUS_SERVICE = "org.laptop.sugar.DataStore"
+>>> DS_DBUS_INTERFACE = "org.laptop.sugar.DataStore"
+>>> DS_DBUS_PATH = "/org/laptop/sugar/DataStore"
+>>> bus = dbus.SessionBus()
+>>> ds = dbus.Interface(bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH), DS_DBUS_INTERFACE)
+
+
+Make sure we're starting from an empty datastore:
+>>> assert ds.find({}, [], byte_arrays=True) == ([], 0)
+
+
+Create something to play with:
+>>> o1_uid = ds.create({'title': 'DS test object 1', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1'}, '', False)
+>>> assert isinstance(o1_uid, basestring)
+>>> o2_uid = ds.create({'title': 'DS test object 2', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest2'}, '', False)
+>>> assert isinstance(o2_uid, basestring)
+>>> o3_uid = ds.create({'title': 'DS test object 3', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest2'}, '', False)
+>>> assert isinstance(o3_uid, basestring)
+>>> assert test_unique([o1_uid, o2_uid, o3_uid])
+
+
+Check everything is there:
+>>> sorted(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 1', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest2', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 3', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest2', variant_level=1)}, signature=dbus.Signature('sv'))]
+>>> ds.get_filename(o1_uid, byte_arrays=True)
+dbus.String(u'')
+>>> ds.get_filename(o2_uid, byte_arrays=True)
+dbus.String(u'')
+>>> ds.get_filename(o3_uid, byte_arrays=True)
+dbus.String(u'')
+
+
+
+Test get_uniquevaluesfor().
+>>> sorted(ds.get_uniquevaluesfor('activity', {}))
+[dbus.String(u'org.sugarlabs.DataStoreTest1'), dbus.String(u'org.sugarlabs.DataStoreTest2')]
+
+
+Change some entries:
+>>> ds.update(o1_uid, {'title': 'DS test object 1 updated', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1', 'tags': 'foo'}, '', False)
+>>> ds.update(o2_uid, {'title': 'DS test object 2', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1', 'tags': 'bar baz'}, '', False)
+>>> ds.update(o3_uid, {'title': 'DS test object 2', 'mime_type': 'text/html', 'activity': 'org.sugarlabs.DataStoreTest3'}, '', False)
+>>> sorted(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 1 updated', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}, signature=dbus.Signature('sv'))]
+
+
+Retrieve metadata for a single entry, ignoring variable data:
+>>> d=dict(ds.get_properties(o3_uid, byte_arrays=True))
+>>> del d['uid'], d['timestamp']
+>>> d
+{dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/html', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}
+
+
+Find entries using "known" metadata:
+>>> sorted(ds.find({'mime_type': ['text/plain']}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/plain', variant_level=1), dbus.String(u'tags'): dbus.ByteArray('bar baz', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 1 updated', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/plain', variant_level=1), dbus.String(u'tags'): dbus.ByteArray('foo', variant_level=1)}, signature=dbus.Signature('sv'))]
+>>> sorted(ds.find({'mime_type': ['text/html']}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/html', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}, signature=dbus.Signature('sv'))]
+>>> sorted(ds.find({'uid': o3_uid}, ['title', 'activity', 'mime_type'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/html', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}, signature=dbus.Signature('sv'))]
+
+Find entries using "unknown" metadata (=> returns all entries):
+>>> sorted(ds.find({'title': 'DS test object 2'}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/html', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/plain', variant_level=1), dbus.String(u'tags'): dbus.ByteArray('bar baz', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 1 updated', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1), dbus.String(u'mime_type'): dbus.ByteArray('text/plain', variant_level=1), dbus.String(u'tags'): dbus.ByteArray('foo', variant_level=1)}, signature=dbus.Signature('sv'))]
+
+
+Delete an entry:
+>>> ds.delete(o1_uid)
+>>> sorted(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])
+[dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest1', variant_level=1)}, signature=dbus.Signature('sv')), dbus.Dictionary({dbus.String(u'title'): dbus.ByteArray('DS test object 2', variant_level=1), dbus.String(u'activity'): dbus.ByteArray('org.sugarlabs.DataStoreTest3', variant_level=1)}, signature=dbus.Signature('sv'))]
+
+
+TODO: create/get_filename with actual content
+
diff --git a/tests/runalltests.py b/tests/runalltests.py
new file mode 100755
index 0000000..0ea923f
--- /dev/null
+++ b/tests/runalltests.py
@@ -0,0 +1,107 @@
+#!/usr/bin/python
+#
+# Runs all tests in the current directory
+#
+# Execute like:
+# python runalltests.py
+#
+import doctest
+import logging
+import os
+import shutil
+import signal
+import subprocess
+import sys
+import tempfile
+import unittest
+
+
+logging.basicConfig(level=logging.WARN,
+ format="%(asctime)-15s %(name)s %(levelname)s: %(message)s",
+ stream=sys.stderr)
+
+
+DOCTESTS = [
+ "basic_api.txt",
+]
+
+
+DOCTEST_OPTIONS = doctest.ELLIPSIS
+#DOCTEST_OPTIONS |= doctest.REPORT_ONLY_FIRST_FAILURE
+
+
+def setup():
+ """Prepare test environment
+
+ Sets HOME and creates a new process group so we can clean up easily later.
+ """
+ os.environ['HOME'] = tempfile.mkdtemp(prefix='datastore-test')
+ if 'PYTHONPATH' in os.environ:
+ python_path = os.environ.get('PYTHONPATH').split(':')
+ else:
+ python_path = []
+
+ # Run tests on sources instead of on installed files.
+ python_path = [os.path.abspath('../src')] + python_path
+ os.environ['PYTHONPATH'] = ':'.join(python_path)
+ os.environ['PATH'] = os.path.abspath('../bin')+':'+os.environ['PATH']
+
+ os.setpgid(0, 0)
+ # prevent suicide in cleanup()
+ signal.signal(signal.SIGTERM, signal.SIG_IGN)
+
+
+def cleanup():
+ """Clean up test environment.
+
+ Kills all children and removes home directory.
+ """
+ os.kill(0, signal.SIGTERM)
+ shutil.rmtree(os.environ['HOME'])
+
+
+def test_suite(tests=None):
+ suite = unittest.TestSuite()
+ if tests is None:
+ tests = DOCTESTS
+
+ for test in tests:
+ suite.addTest(doctest.DocFileSuite(test, optionflags=DOCTEST_OPTIONS))
+
+ if len(sys.argv) <= 1:
+ tests = os.listdir(os.curdir)
+ tests = [n[:-3] for n in tests if n.startswith('test') and
+ n.endswith('.py')]
+
+ for test in tests:
+ module = __import__(test)
+ if hasattr(module, 'test_suite'):
+ suite.addTest(module.test_suite())
+ return suite
+
+
+def run_tests(tests):
+ runner = unittest.TextTestRunner(verbosity=1)
+ suite = test_suite(tests)
+ runner.run(suite)
+
+
+def main(my_name, arguments):
+ if "--have-dbus" not in arguments:
+ setup()
+ try:
+ pipe = subprocess.Popen(['dbus-launch',
+ os.path.abspath(my_name), '--have-dbus']+arguments,
+ cwd=os.environ['HOME'])
+ return pipe.wait()
+
+ finally:
+ cleanup()
+
+ else:
+ run_tests(arguments[1:])
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv[0], sys.argv[1:]))