diff --git a/Makefile.am b/Makefile.am index 763c25ca..2240471f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,9 @@ ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection +TESTS_TMPDIR=$(abs_builddir)/tests-tmp +TESTS_PYTHONPATH=$(abs_srcdir)/src:$(PYTHONPATH) + DISTCLEANFILES = \ intltool-extract \ intltool-merge \ @@ -17,4 +20,7 @@ check: test test: cd $(top_srcdir)/tests && \ - python -m unittest discover + mkdir -p $(TESTS_TMPDIR) && \ + TMPDIR=$(TESTS_TMPDIR) PYTHONPATH=$(TESTS_PYTHONPATH) \ + python -m unittest discover && \ + rm -rf $(TESTS_TMPDIR) diff --git a/po/POTFILES.skip b/po/POTFILES.skip index 8dd3dfef..3eea3717 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -4,3 +4,4 @@ src/sugar3/eggdesktopfile.c src/sugar3/eggsmclient.c src/sugar3/gsm-xsmp.c +tests/data/sample.activity/activity.py diff --git a/tests/data/sample.activity/activity.py b/tests/data/sample.activity/activity.py new file mode 100644 index 00000000..97d3c986 --- /dev/null +++ b/tests/data/sample.activity/activity.py @@ -0,0 +1,8 @@ +from gettext import gettext as _ + +from sugar3.activity import activity + +class SampleActivity(activity.Activity): + def __init__(self, handle): + activity.Activity.__init__(self, handle) + self._text = _("Text string") diff --git a/tests/data/sample.activity/activity/activity-sample.svg b/tests/data/sample.activity/activity/activity-sample.svg new file mode 100644 index 00000000..8da7c63b --- /dev/null +++ b/tests/data/sample.activity/activity/activity-sample.svg @@ -0,0 +1,26 @@ + + +]> + + + + + + + + + + + + + + diff --git a/tests/data/sample.activity/activity/activity.info b/tests/data/sample.activity/activity/activity.info new file mode 100644 index 00000000..4cf7f755 --- /dev/null +++ b/tests/data/sample.activity/activity/activity.info @@ -0,0 +1,7 @@ +[Activity] +name = Sample +activity_version = 1 +bundle_id = org.sugarlabs.Sample +exec = sugar-activity activity.SampleActivity +icon = activity-sample +license = GPLv2+ diff --git a/tests/data/sample.activity/po/Sample.pot b/tests/data/sample.activity/po/Sample.pot new file mode 100644 index 00000000..0cee3579 --- /dev/null +++ b/tests/data/sample.activity/po/Sample.pot @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-12-06 20:10+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: activity/activity.info:2 +msgid "Sample" +msgstr "" + +#: activity.py:8 +msgid "Text string" +msgstr "" diff --git a/tests/data/sample.activity/po/es.po b/tests/data/sample.activity/po/es.po new file mode 100644 index 00000000..a1a6adb6 --- /dev/null +++ b/tests/data/sample.activity/po/es.po @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-12-06 20:10+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: activity/activity.info:2 +msgid "Sample" +msgstr "" + +#: activity.py:8 +msgid "Text string" +msgstr "" diff --git a/tests/data/sample.activity/setup.py b/tests/data/sample.activity/setup.py new file mode 100755 index 00000000..ad218b21 --- /dev/null +++ b/tests/data/sample.activity/setup.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +from sugar3.activity import bundlebuilder + +bundlebuilder.start() diff --git a/tests/test_bundlebuilder.py b/tests/test_bundlebuilder.py new file mode 100644 index 00000000..687b8c6f --- /dev/null +++ b/tests/test_bundlebuilder.py @@ -0,0 +1,164 @@ +# Copyright (C) 2012, Daniel Narvaez +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# 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 General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import os +import unittest +import shutil +import subprocess +import tempfile +import tarfile +import zipfile + +tests_dir = os.path.dirname(__file__) +data_dir = os.path.join(tests_dir, "data") + +class TestGit(unittest.TestCase): + _source_files = ["activity.py", + "setup.py", + "po/Sample.pot", + "po/es.po", + "activity/activity.info", + "activity/activity-sample.svg"] + + _activity_locale_files = ["locale/es/activity.linfo"] + + _share_locale_files = ["locale/es/LC_MESSAGES/org.sugarlabs.Sample.mo"] + + def _create_repo(self): + cwd = os.getcwd() + path = tempfile.mkdtemp() + os.chdir(path) + + subprocess.check_call(["git", "init"]) + subprocess.check_call(["git", "config", "user.name", "Test Test"]) + subprocess.check_call(["git", "config", "user.email", "test@test.org"]) + + for source in self._source_files: + source_path = os.path.join(data_dir, "sample.activity", source) + dest_path = os.path.join(path, source) + + try: + os.makedirs(os.path.dirname(dest_path)) + except OSError: + pass + + shutil.copyfile(source_path, dest_path) + shutil.copymode(source_path, dest_path) + + subprocess.check_call(["git", "add", source]) + + subprocess.check_call(["git", "commit", "-m", "Initial commit", "-a"]) + + os.chdir(cwd) + + return path + + def _strip_root_dir(self, paths): + return [path[path.find("/") + 1:] for path in paths] + + def _test_dist_xo(self, source_path, build_path): + cwd = os.getcwd() + os.chdir(build_path) + + setup_path = os.path.join(source_path, "setup.py") + subprocess.call([setup_path, "dist_xo"]) + + xo_path = os.path.join(build_path, "dist", "Sample-1.xo") + filenames = zipfile.ZipFile(xo_path).namelist() + + stripped_filenames = self._strip_root_dir(filenames) + expected = self._source_files[:] + expected.extend(self._share_locale_files) + expected.extend(self._activity_locale_files) + self.assertItemsEqual(stripped_filenames, expected) + + os.chdir(cwd) + + def _test_dist_source(self, source_path, build_path): + cwd = os.getcwd() + os.chdir(build_path) + + setup_path = os.path.join(source_path, "setup.py") + subprocess.call([setup_path, "dist_source"]) + + xo_path = os.path.join(build_path, "dist", "Sample-1.tar.bz2") + filenames = tarfile.open(name=xo_path, mode="r:bz2").getnames() + + stripped_filenames = self._strip_root_dir(filenames) + self.assertItemsEqual(stripped_filenames, self._source_files) + + os.chdir(cwd) + + def _test_install(self, source_path, build_path): + install_path = tempfile.mkdtemp() + + cwd = os.getcwd() + os.chdir(build_path) + + setup_path = os.path.join(source_path, "setup.py") + subprocess.call([setup_path, "install", "--prefix", install_path]) + + filenames = [] + activity_dir = os.path.join(install_path, "share", + "sugar", "activities", "Sample.activity") + for root, dirs, files in os.walk(activity_dir): + rel_root = root[len(activity_dir) + 1:] + filenames.extend([os.path.join(rel_root, name) for name in files]) + + expected = self._source_files[:] + expected.extend(self._activity_locale_files) + + self.assertItemsEqual(filenames, expected) + + filenames = [] + share_dir = os.path.join(install_path, "share") + locale_dir = os.path.join(share_dir, "locale") + for root, dirs, files in os.walk(locale_dir): + rel_root = root[len(share_dir) + 1:] + for name in files: + if "org.sugarlabs.Sample" in name: + filenames.append(os.path.join(rel_root, name)) + + self.assertItemsEqual(filenames, self._share_locale_files) + + os.chdir(cwd) + + def test_dist_xo_in_source(self): + repo_path = self._create_repo() + self._test_dist_xo(repo_path, repo_path) + + def test_dist_xo_out_of_source(self): + repo_path = self._create_repo() + build_path = tempfile.mkdtemp() + self._test_dist_xo(repo_path, build_path) + + def test_dist_source_in_source(self): + repo_path = self._create_repo() + self._test_dist_source(repo_path, repo_path) + + def test_dist_source_out_of_source(self): + repo_path = self._create_repo() + build_path = tempfile.mkdtemp() + self._test_dist_source(repo_path, build_path) + + def test_install_in_source(self): + repo_path = self._create_repo() + self._test_install(repo_path, repo_path) + + def test_install_out_of_source(self): + repo_path = self._create_repo() + build_path = tempfile.mkdtemp() + self._test_install(repo_path, build_path)