2010-05-24 11:26:22 -03:00
|
|
|
#
|
|
|
|
# Copyright (c) 2008-2010 Red Hat, Inc.
|
|
|
|
#
|
|
|
|
# This software is licensed to you under the GNU General Public License,
|
|
|
|
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
|
|
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
|
|
|
|
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
|
|
# along with this software; if not, see
|
|
|
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
|
|
#
|
|
|
|
# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
|
|
# granted to use or replicate Red Hat trademarks that are incorporated
|
|
|
|
# in this software or its documentation.
|
|
|
|
|
|
|
|
import git
|
2014-01-02 15:20:52 -04:00
|
|
|
import os
|
|
|
|
import shutil
|
2010-05-24 11:26:22 -03:00
|
|
|
import tempfile
|
2014-01-02 15:20:52 -04:00
|
|
|
import unittest
|
2010-05-24 11:26:22 -03:00
|
|
|
|
|
|
|
from tito.cli import CLI
|
|
|
|
from tito.common import run_command
|
|
|
|
|
|
|
|
# NOTE: No Name in test spec file as we re-use it for several packages.
|
|
|
|
# Name must be written first.
|
|
|
|
TEST_SPEC = """
|
|
|
|
%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
|
|
|
|
|
|
|
|
Version: 0.0.1
|
|
|
|
Release: 1%{?dist}
|
|
|
|
Summary: Tito test package.
|
|
|
|
URL: https://example.com
|
|
|
|
Group: Applications/Internet
|
|
|
|
License: GPLv2
|
|
|
|
BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
|
|
|
|
BuildArch: noarch
|
|
|
|
BuildRequires: python-devel
|
|
|
|
BuildRequires: python-setuptools
|
|
|
|
Source0: %{name}-%{version}.tar.gz
|
|
|
|
|
|
|
|
%description
|
|
|
|
Nobody cares.
|
|
|
|
|
|
|
|
%prep
|
|
|
|
#nothing to do here
|
|
|
|
%setup -q -n %{name}-%{version}
|
|
|
|
|
|
|
|
%build
|
|
|
|
%{__python} setup.py build
|
|
|
|
|
|
|
|
%install
|
|
|
|
rm -rf $RPM_BUILD_ROOT
|
|
|
|
%{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT
|
|
|
|
rm -f $RPM_BUILD_ROOT%{python_sitelib}/*egg-info/requires.txt
|
|
|
|
|
|
|
|
%clean
|
|
|
|
rm -rf %{buildroot}
|
|
|
|
|
|
|
|
%files
|
|
|
|
%defattr(-,root,root)
|
|
|
|
#%dir %{python_sitelib}/%{name}
|
|
|
|
%{python_sitelib}/%{name}-*.egg-info
|
|
|
|
|
|
|
|
%changelog
|
|
|
|
"""
|
|
|
|
|
|
|
|
TEST_SETUP_PY = """
|
|
|
|
from setuptools import setup, find_packages
|
|
|
|
|
|
|
|
setup(
|
|
|
|
name="%s",
|
|
|
|
version='1.0',
|
|
|
|
description='tito test project',
|
|
|
|
author='Nobody Knows',
|
|
|
|
author_email='tito@example.com',
|
|
|
|
url='http://rm-rf.ca/tito',
|
|
|
|
license='GPLv2+',
|
|
|
|
|
|
|
|
package_dir={
|
|
|
|
'%s': 'src/',
|
|
|
|
},
|
|
|
|
packages = find_packages('src'),
|
|
|
|
include_package_data = True,
|
|
|
|
|
|
|
|
classifiers = [
|
|
|
|
'License :: OSI Approved :: GNU General Public License (GPL)',
|
|
|
|
'Development Status :: 2 - Pre-Alpha',
|
|
|
|
'Environment :: Console',
|
|
|
|
'Intended Audience :: Developers',
|
|
|
|
'Intended Audience :: Information Technology',
|
|
|
|
'Programming Language :: Python'
|
|
|
|
],
|
|
|
|
)
|
|
|
|
"""
|
|
|
|
|
|
|
|
TEST_PYTHON_SRC = """
|
|
|
|
class Empty(object):
|
|
|
|
pass
|
|
|
|
"""
|
|
|
|
|
2011-12-05 14:37:07 -05:00
|
|
|
|
2010-05-24 11:26:22 -03:00
|
|
|
def tito(argstring):
|
|
|
|
""" Run Tito from source with given arguments. """
|
2010-05-24 23:16:49 -03:00
|
|
|
return CLI().main(argstring.split(' '))
|
2010-05-24 11:26:22 -03:00
|
|
|
|
2011-12-05 14:37:07 -05:00
|
|
|
|
2010-05-24 11:26:22 -03:00
|
|
|
class TitoGitTestFixture(unittest.TestCase):
|
|
|
|
"""
|
|
|
|
Fixture providing setup/teardown and utilities for all tests requiring
|
|
|
|
an actual git repository.
|
|
|
|
"""
|
|
|
|
def setUp(self):
|
2011-12-05 14:37:07 -05:00
|
|
|
# Create a temporary directory for our test git repository:
|
2010-05-24 11:26:22 -03:00
|
|
|
self.repo_dir = tempfile.mkdtemp("-titotest")
|
|
|
|
print
|
|
|
|
print
|
|
|
|
print("Testing in: %s" % self.repo_dir)
|
|
|
|
print
|
|
|
|
|
avoid TB in nose tests if there is no tty
GitPython's git.util.get_user_id() calls os.getlogin(), which
throws an OSError if there is no tty:
Traceback (most recent call last):
File "/home/sandbox/test/functional/multiproject_tests.py", line 65, in setUp
TitoGitTestFixture.setUp(self)
File "/home/sandbox/test/functional/fixture.py", line 129, in setUp
index.commit('Setting offline.')
File "/usr/lib/python2.7/site-packages/git/index/base.py", line 887, in commit
return Commit.create_from_tree(self.repo, tree, message, parent_commits, head)
File "/usr/lib/python2.7/site-packages/git/objects/commit.py", line 303, in create_from_tree
committer = Actor.committer(cr)
File "/usr/lib/python2.7/site-packages/git/util.py", line 354, in committer
return cls._main_actor(cls.env_committer_name, cls.env_committer_email, config_reader)
File "/usr/lib/python2.7/site-packages/git/util.py", line 327, in _main_actor
default_email = get_user_id()
File "/usr/lib/python2.7/site-packages/git/util.py", line 120, in get_user_id
username = os.getlogin()
OSError: [Errno 25] Inappropriate ioctl for device
But GitPython also allows to avoid the call by setting
environment variable "USER" to anything other than "UNKNOWN".
Therefore we preempt GitPython by calling os.getlogin() ourselves.
If we have to rescue the exception, export the environment var to
avoid traceback.
2014-02-18 03:24:41 +00:00
|
|
|
# GitPython calls os.login(), which throws OSError if there is no tty,
|
|
|
|
# but GitPython allows to avoid the call if env var USER exists.
|
|
|
|
try:
|
|
|
|
os.getlogin()
|
|
|
|
except OSError:
|
|
|
|
os.environ['USER'] = 'nobody'
|
|
|
|
|
2010-05-24 11:26:22 -03:00
|
|
|
# Initialize the repo:
|
|
|
|
self.repo = git.Repo.init(path=self.repo_dir, mkdir=True, bare=False)
|
|
|
|
|
|
|
|
# Next we tito init:
|
|
|
|
os.chdir(self.repo_dir)
|
|
|
|
tito("init")
|
|
|
|
run_command('echo "offline = true" >> rel-eng/tito.props')
|
|
|
|
index = self.repo.index
|
|
|
|
index.add(['rel-eng/tito.props'])
|
|
|
|
index.commit('Setting offline.')
|
|
|
|
|
2014-01-02 15:20:52 -04:00
|
|
|
def tearDown(self):
|
2014-01-13 14:40:28 -04:00
|
|
|
shutil.rmtree(self.repo_dir)
|
2014-01-02 15:20:52 -04:00
|
|
|
pass
|
|
|
|
|
2013-11-12 12:16:12 -04:00
|
|
|
def write_file(self, path, contents):
|
|
|
|
out_f = open(path, 'w')
|
|
|
|
out_f.write(contents)
|
|
|
|
out_f.close()
|
|
|
|
|
2014-01-13 16:29:38 -04:00
|
|
|
def create_project_from_spec(self, pkg_name, config,
|
|
|
|
pkg_dir='', spec=None):
|
2014-01-02 15:20:52 -04:00
|
|
|
"""
|
|
|
|
Create a sample tito project and copy the given test spec file over.
|
|
|
|
"""
|
|
|
|
full_pkg_dir = os.path.join(self.repo_dir, pkg_dir)
|
|
|
|
run_command('mkdir -p %s' % full_pkg_dir)
|
|
|
|
os.chdir(full_pkg_dir)
|
|
|
|
|
|
|
|
shutil.copyfile(spec, os.path.join(full_pkg_dir, os.path.basename(spec)))
|
|
|
|
|
2014-01-13 16:29:38 -04:00
|
|
|
# Write the config object we were given out to the project repo:
|
python 2.4 (rhel 5) does not support 'with...as' syntax
resolves from a73c90cb...
Using Python 2.4
Using nose 0.1
Running tito tests against: /home/sandbox/src
EEEE.Warning: spacewalk.releng.* namespace in tito.props is obsolete. Use tito.* instead.
Warning: spacewalk.releng.* namespace in tito.props is obsolete. Use tito.* instead.
..............................F...........
======================================================================
ERROR: Failure: SyntaxError (invalid syntax (fixture.py, line 159))
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/nose/loader.py", line 381, in loadTestsFromName
module = self.importer.importFromPath(
File "/usr/lib/python2.4/site-packages/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python2.4/site-packages/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/sandbox/test/functional/fetch_tests.py", line 27, in ?
from fixture import TitoGitTestFixture, tito
File "/home/sandbox/test/functional/fixture.py", line 159
with open(os.path.join(full_pkg_dir, 'tito.props'), 'w') \
^
SyntaxError: invalid syntax
2014-02-27 20:27:08 +00:00
|
|
|
configfile = open(os.path.join(full_pkg_dir, 'tito.props'), 'w')
|
|
|
|
config.write(configfile)
|
|
|
|
configfile.close()
|
2014-01-02 15:20:52 -04:00
|
|
|
|
2010-05-24 14:59:50 -03:00
|
|
|
def create_project(self, pkg_name, pkg_dir=''):
|
2010-05-24 11:26:22 -03:00
|
|
|
"""
|
|
|
|
Create a test project at the given location, assumed to be within
|
|
|
|
our test repo, but possibly within a sub-directory.
|
|
|
|
"""
|
2010-05-24 14:59:50 -03:00
|
|
|
full_pkg_dir = os.path.join(self.repo_dir, pkg_dir)
|
|
|
|
run_command('mkdir -p %s' % full_pkg_dir)
|
|
|
|
os.chdir(full_pkg_dir)
|
2010-05-24 11:26:22 -03:00
|
|
|
|
2011-12-05 14:37:07 -05:00
|
|
|
# TODO: Test project needs work, doesn't work in some scenarios
|
2010-05-24 11:26:22 -03:00
|
|
|
# like UpstreamBuilder:
|
2010-05-24 14:59:50 -03:00
|
|
|
filename = os.path.join(full_pkg_dir, "a.txt")
|
2010-05-24 11:26:22 -03:00
|
|
|
out_f = open(filename, 'w')
|
|
|
|
out_f.write("BLERG\n")
|
|
|
|
out_f.close()
|
|
|
|
|
|
|
|
# Write the test spec file:
|
2010-05-24 14:59:50 -03:00
|
|
|
filename = os.path.join(full_pkg_dir, "%s.spec" % pkg_name)
|
2010-05-24 11:26:22 -03:00
|
|
|
out_f = open(filename, 'w')
|
|
|
|
out_f.write("Name: %s" % pkg_name)
|
|
|
|
out_f.write(TEST_SPEC)
|
|
|
|
out_f.close()
|
|
|
|
|
|
|
|
# Write test setup.py:
|
2010-05-24 14:59:50 -03:00
|
|
|
filename = os.path.join(full_pkg_dir, "setup.py")
|
2010-05-24 11:26:22 -03:00
|
|
|
out_f = open(filename, 'w')
|
|
|
|
out_f.write(TEST_SETUP_PY % (pkg_name, pkg_name))
|
|
|
|
out_f.close()
|
|
|
|
|
|
|
|
# Write test source:
|
2010-05-24 14:59:50 -03:00
|
|
|
run_command('mkdir -p %s' % os.path.join(full_pkg_dir, "src"))
|
|
|
|
filename = os.path.join(full_pkg_dir, "src", "module.py")
|
2010-05-24 11:26:22 -03:00
|
|
|
out_f = open(filename, 'w')
|
|
|
|
out_f.write(TEST_PYTHON_SRC)
|
|
|
|
out_f.close()
|
|
|
|
|
|
|
|
index = self.repo.index
|
2010-05-24 14:59:50 -03:00
|
|
|
files = [os.path.join(pkg_dir, 'a.txt'),
|
|
|
|
os.path.join(pkg_dir, 'setup.py'),
|
|
|
|
os.path.join(pkg_dir, '%s.spec' % pkg_name),
|
|
|
|
os.path.join(pkg_dir, 'src/module.py')
|
|
|
|
]
|
|
|
|
index.add(files)
|
2010-05-24 11:26:22 -03:00
|
|
|
index.commit('Initial commit.')
|
|
|
|
|
|
|
|
tito('tag --keep-version --debug --accept-auto-changelog')
|