diff --git a/src/sugar3/activity/bundlebuilder.py b/src/sugar3/activity/bundlebuilder.py index 24925526..63039321 100644 --- a/src/sugar3/activity/bundlebuilder.py +++ b/src/sugar3/activity/bundlebuilder.py @@ -24,6 +24,7 @@ import os import sys import zipfile import tarfile +import unittest import shutil import subprocess import re @@ -263,6 +264,56 @@ class Installer(Packager): self.config.bundle.install_mime_type(self.config.source_dir) +def cmd_check(config, args): + """Run tests for the activity""" + + if len(args) > 1: + print "Usage: %prog check {integration.unit}" + return + + run_unit_test = True + run_integration_test = True + + if len(args) == 1: + if args[0] == "unit": + run_integration_test = False + elif args[0] == "integration": + run_unit_test = False + else: + print "Invalid argument: should be either integration or unit" + + print "Running Tests" + + test_path = os.path.join(config.source_dir, "tests") + + if os.path.isdir(test_path): + unit_test_path = os.path.join(test_path, "unit") + integration_test_path = os.path.join(test_path, "integration") + sys.path.append(config.source_dir) + + # Run Tests + if os.path.isdir(unit_test_path) and run_unit_test: + all_tests = unittest.defaultTestLoader.discover(unit_test_path) + unittest.TextTestRunner().run(all_tests) + elif not run_unit_test: + print "Not running unit tests" + else: + print 'No "unit" directory found.' + + if os.path.isdir(integration_test_path) and run_integration_test: + all_tests = unittest.defaultTestLoader.discover( + integration_test_path) + unittest.TextTestRunner().run(all_tests) + elif not run_integration_test: + print "Not running integration tests" + else: + print 'No "integration" directory found.' + + print "Finished testing" + else: + print "Error: No tests/ directory" + + def cmd_dev(config, args): """Setup for development""" diff --git a/src/sugar3/test/unittest.py b/src/sugar3/test/unittest.py index d6628833..7aeafd6d 100644 --- a/src/sugar3/test/unittest.py +++ b/src/sugar3/test/unittest.py @@ -22,14 +22,26 @@ from __future__ import absolute_import import logging import os +import time import unittest import subprocess from contextlib import contextmanager from sugar3.test import uitree +import dbus +from dbus.mainloop.glib import DBusGMainLoop +DBusGMainLoop(set_as_default=True) +bus = dbus.SessionBus() + class UITestCase(unittest.TestCase): + + def __init__(self, *args, **kwargs): + unittest.TestCase(*args, **kwargs) + + self.bundle_id = None + def setUp(self): logger = logging.getLogger() self._orig_level = logger.getEffectiveLevel() @@ -51,3 +63,19 @@ class UITestCase(unittest.TestCase): raise finally: process.terminate() + + @contextmanager + def run_activity(self): + if bundle_id is not None: + process = subprocess.Popen(["sugar-launch", self.bundle_id]) + else: + print "No bundle_id specified." + return + + try: + yield + except: + logging.debug(uitree.get_root().dump()) + raise + finally: + process.terminate()