diff --git a/tests/vcs.TestCase b/tests/vcs.TestCase new file mode 100755 index 00000000..ffed7b89 --- /dev/null +++ b/tests/vcs.TestCase @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 + +# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 + +import inspect +import logging +import optparse +import os +import sys +import tempfile +import unittest + +from git import Repo + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +import fdroidserver.build +import fdroidserver.common +import fdroidserver.metadata +import fdroidserver.scanner + + +class VCSTest(unittest.TestCase): + """For some reason the VCS classes are in fdroidserver/common.py""" + + def setUp(self): + logging.basicConfig(level=logging.DEBUG) + self.basedir = os.path.join(localmodule, 'tests') + self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) + if not os.path.exists(self.tmpdir): + os.makedirs(self.tmpdir) + os.chdir(self.basedir) + + def test_remote_set_head_can_fail(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + # First create an upstream repo with one commit + upstream_repo = Repo.init("upstream_repo") + with open(upstream_repo.working_dir + "/file", 'w') as f: + f.write("Hello World!") + upstream_repo.index.add([upstream_repo.working_dir + "/file"]) + upstream_repo.index.commit("initial commit") + commitid = upstream_repo.head.commit.hexsha + + # Now clone it once manually, like gitlab runner gitlab-runner sets up a repo during CI + clone1 = Repo.init("clone1") + clone1.create_remote("upstream", "file://" + upstream_repo.working_dir) + clone1.remote("upstream").fetch() + clone1.head.reference = clone1.commit(commitid) + clone1.head.reset(index=True, working_tree=True) + self.assertTrue(clone1.head.is_detached) + + # and now we want to use this clone as a source repo for fdroid build + config = {} + os.mkdir("build") + config['sdk_path'] = os.getenv('ANDROID_HOME') + config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} + config['build_tools'] = 'FAKE_BUILD_TOOLS_VERSION' + config['java_paths'] = {'fake': 'fake'} + fdroidserver.common.config = config + app = fdroidserver.metadata.App() + app.RepoType = 'git' + app.Repo = clone1.working_dir + app.id = 'com.gpl.rpg.AndorsTrail' + build = fdroidserver.metadata.Build() + build.commit = commitid + build.androidupdate = ['no'] + vcs, build_dir = fdroidserver.common.setup_vcs(app) + # force an init of the repo, the remote head error only occurs on the second gotorevision call + vcs.gotorevision(build.commit) + fdroidserver.common.prepare_source(vcs, app, build, + build_dir=build_dir, srclib_dir="ignore", extlib_dir="ignore") + self.assertTrue(os.path.isfile("build/com.gpl.rpg.AndorsTrail/file")) + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option("-v", "--verbose", action="store_true", default=False, + help="Spew out even more information than normal") + (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(VCSTest)) + unittest.main(failfast=False)