diff options
author | Sascha Silbe <sascha@silbe.org> | 2009-08-16 20:25:13 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha@silbe.org> | 2009-08-16 20:25:13 (GMT) |
commit | 460db4bab61bffd03dd7f144ffec54b44a6247b8 (patch) | |
tree | bd290fdbbead66d007c258b428e69222d6a4309f | |
parent | d7ab281cabeab4fe3529ca1fa14b8a15895b9d36 (diff) |
add (back) minimal test suiteonlytest2
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile | 20 | ||||
-rw-r--r-- | tests/__init__.py | 1 | ||||
-rw-r--r-- | tests/basic_api.txt | 82 | ||||
-rwxr-xr-x | tests/runalltests.py | 107 |
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:])) |