From f475b92802530eb463ae5198135c844feb78a375 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mar 15 2016 15:29:41 +0000 Subject: [PATCH 1/5] Coverage tracking for the test suite. If you issue `make test`, it will run the tests and print out a coverage reporting indicating what lines of code were covered by the tests and which were not. This will (hopefully) be useful more over time as we start to write more tests. --- diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..087bddf --- /dev/null +++ b/.coveragerc @@ -0,0 +1,5 @@ +[run] + +omit = + /usr/lib/* + tests/* diff --git a/.gitignore b/.gitignore index 4857165..846fc37 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.pyc *.pyo tests/test.py +.coverage diff --git a/Makefile b/Makefile index d5e9b77..d8f2658 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,9 @@ clean: git-clean: @git clean -d -q -x +test: + nosetests --with-coverage --cover-package . + subdirs: for d in $(SUBDIRS); do make -C $$d; [ $$? = 0 ] || exit 1; done diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/__init__.py diff --git a/tests/runtests.py b/tests/runtests.py deleted file mode 100755 index 699e9e4..0000000 --- a/tests/runtests.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python - -"""Wrapper script for running unit tests""" - -__version__ = "$Revision: 1.1 $" - -import sys -import os -import os.path -import unittest - -testDir = os.path.dirname(sys.argv[0]) - -sys.path.insert(0, os.path.abspath('%s/..' % testDir)) - -allTests = unittest.TestSuite() -for root, dirs, files in os.walk(testDir): - common_path = os.path.commonprefix([os.path.abspath(testDir), - os.path.abspath(root)]) - root_path = os.path.abspath(root).replace(common_path, '').lstrip('/').replace('/', '.') - - for test_file in [item for item in files - if item.startswith("test_") and item.endswith(".py")]: - if len(sys.argv) == 1 or test_file in sys.argv[1:]: - print "adding %s..." % test_file - test_file = test_file[:-3] - if root_path: - test_file = "%s.%s" % (root_path, test_file) - suite = unittest.defaultTestLoader.loadTestsFromName(test_file) - allTests.addTests(suite._tests) - -unittest.TextTestRunner(verbosity=2).run(allTests) diff --git a/tests/test___init__.py b/tests/test___init__.py deleted file mode 100644 index 93de88a..0000000 --- a/tests/test___init__.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python - -"""Test the __init__.py module""" - -import koji -import unittest - -class INITTestCase(unittest.TestCase): - """Main test case container""" - - def test_parse_NVR(self): - """Test the parse_NVR method""" - - self.assertRaises(AttributeError, koji.parse_NVR, None) - self.assertRaises(AttributeError, koji.parse_NVR, 1) - self.assertRaises(AttributeError, koji.parse_NVR, {}) - self.assertRaises(AttributeError, koji.parse_NVR, []) - self.assertRaises(koji.GenericError, koji.parse_NVR, "") - self.assertRaises(koji.GenericError, koji.parse_NVR, "foo") - self.assertRaises(koji.GenericError, koji.parse_NVR, "foo-1") - self.assertRaises(koji.GenericError, koji.parse_NVR, "foo-1-") - self.assertRaises(koji.GenericError, koji.parse_NVR, "foo--1") - self.assertRaises(koji.GenericError, koji.parse_NVR, "--1") - ret = koji.parse_NVR("foo-1-2") - self.assertEqual(ret['name'], "foo") - self.assertEqual(ret['version'], "1") - self.assertEqual(ret['release'], "2") - self.assertEqual(ret['epoch'], "") - ret = koji.parse_NVR("12:foo-1-2") - self.assertEqual(ret['name'], "foo") - self.assertEqual(ret['version'], "1") - self.assertEqual(ret['release'], "2") - self.assertEqual(ret['epoch'], "12") - - def test_parse_NVRA(self): - """Test the parse_NVRA method""" - - self.assertRaises(AttributeError, koji.parse_NVRA, None) - self.assertRaises(AttributeError, koji.parse_NVRA, 1) - self.assertRaises(AttributeError, koji.parse_NVRA, {}) - self.assertRaises(AttributeError, koji.parse_NVRA, []) - self.assertRaises(koji.GenericError, koji.parse_NVRA, "") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo--1") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "--1") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-1") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-1.") - self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1.-1") - ret = koji.parse_NVRA("foo-1-2.i386") - self.assertEqual(ret['name'], "foo") - self.assertEqual(ret['version'], "1") - self.assertEqual(ret['release'], "2") - self.assertEqual(ret['epoch'], "") - self.assertEqual(ret['arch'], "i386") - self.assertEqual(ret['src'], False) - ret = koji.parse_NVRA("12:foo-1-2.src") - self.assertEqual(ret['name'], "foo") - self.assertEqual(ret['version'], "1") - self.assertEqual(ret['release'], "2") - self.assertEqual(ret['epoch'], "12") - self.assertEqual(ret['arch'], "src") - self.assertEqual(ret['src'], True) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_parsers.py b/tests/test_parsers.py new file mode 100644 index 0000000..93de88a --- /dev/null +++ b/tests/test_parsers.py @@ -0,0 +1,67 @@ +#!/usr/bin/python + +"""Test the __init__.py module""" + +import koji +import unittest + +class INITTestCase(unittest.TestCase): + """Main test case container""" + + def test_parse_NVR(self): + """Test the parse_NVR method""" + + self.assertRaises(AttributeError, koji.parse_NVR, None) + self.assertRaises(AttributeError, koji.parse_NVR, 1) + self.assertRaises(AttributeError, koji.parse_NVR, {}) + self.assertRaises(AttributeError, koji.parse_NVR, []) + self.assertRaises(koji.GenericError, koji.parse_NVR, "") + self.assertRaises(koji.GenericError, koji.parse_NVR, "foo") + self.assertRaises(koji.GenericError, koji.parse_NVR, "foo-1") + self.assertRaises(koji.GenericError, koji.parse_NVR, "foo-1-") + self.assertRaises(koji.GenericError, koji.parse_NVR, "foo--1") + self.assertRaises(koji.GenericError, koji.parse_NVR, "--1") + ret = koji.parse_NVR("foo-1-2") + self.assertEqual(ret['name'], "foo") + self.assertEqual(ret['version'], "1") + self.assertEqual(ret['release'], "2") + self.assertEqual(ret['epoch'], "") + ret = koji.parse_NVR("12:foo-1-2") + self.assertEqual(ret['name'], "foo") + self.assertEqual(ret['version'], "1") + self.assertEqual(ret['release'], "2") + self.assertEqual(ret['epoch'], "12") + + def test_parse_NVRA(self): + """Test the parse_NVRA method""" + + self.assertRaises(AttributeError, koji.parse_NVRA, None) + self.assertRaises(AttributeError, koji.parse_NVRA, 1) + self.assertRaises(AttributeError, koji.parse_NVRA, {}) + self.assertRaises(AttributeError, koji.parse_NVRA, []) + self.assertRaises(koji.GenericError, koji.parse_NVRA, "") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo--1") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "--1") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-1") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1-1.") + self.assertRaises(koji.GenericError, koji.parse_NVRA, "foo-1.-1") + ret = koji.parse_NVRA("foo-1-2.i386") + self.assertEqual(ret['name'], "foo") + self.assertEqual(ret['version'], "1") + self.assertEqual(ret['release'], "2") + self.assertEqual(ret['epoch'], "") + self.assertEqual(ret['arch'], "i386") + self.assertEqual(ret['src'], False) + ret = koji.parse_NVRA("12:foo-1-2.src") + self.assertEqual(ret['name'], "foo") + self.assertEqual(ret['version'], "1") + self.assertEqual(ret['release'], "2") + self.assertEqual(ret['epoch'], "12") + self.assertEqual(ret['arch'], "src") + self.assertEqual(ret['src'], True) + +if __name__ == '__main__': + unittest.main() From 01bb6e63fa2e78db138ab74cf3fe0665bc4ca8e0 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mar 15 2016 15:29:41 +0000 Subject: [PATCH 2/5] Test krbv failing when krbV is not installed. --- diff --git a/koji/__init__.py b/koji/__init__.py index d43b8ef..6488e09 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -30,6 +30,7 @@ except ImportError: import base64 import datetime import errno +import exceptions from fnmatch import fnmatch import httplib import logging @@ -1678,6 +1679,12 @@ class ClientSession(object): log in the given user instead of the user associated with the Kerberos principal. The principal must be in the "ProxyPrincipals" list on the server side.""" + + if not krbV: + raise exceptions.ImportError( + "Please install python-krbV to use kerberos." + ) + ctx = krbV.default_context() if ccache != None: diff --git a/tests/test_krbv.py b/tests/test_krbv.py new file mode 100644 index 0000000..b8a88e1 --- /dev/null +++ b/tests/test_krbv.py @@ -0,0 +1,18 @@ +import unittest + +# This is python-mock, not the rpm mock tool we know and love +import mock + +import koji + + +class KrbVTestCase(unittest.TestCase): + + @mock.patch('koji.krbV', new=None) + @mock.patch('koji.ClientSession._setup_connection') + def test_krbv_disabled(self, krbV): + """ Test that when krbV is absent, we behave rationally. """ + self.assertEquals(koji.krbV, None) + session = koji.ClientSession('whatever') + with self.assertRaises(ImportError): + session.krb_login() From 43830333629632a41c420bbc9bf8c04bfbcdebf1 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mar 15 2016 15:29:41 +0000 Subject: [PATCH 3/5] Add nocover to some blocks we won't test. --- diff --git a/koji/__init__.py b/koji/__init__.py index 6488e09..0cb015e 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -24,7 +24,7 @@ import sys try: import krbV -except ImportError: +except ImportError: # pragma: no cover sys.stderr.write("Warning: Could not install krbV module. Kerberos support will be disabled.\n") sys.stderr.flush() import base64 @@ -63,7 +63,7 @@ import zipfile def _(args): """Stub function for translation""" - return args + return args # pragma: no cover ## Constants ## From 8d4f5e04ed644963db97629791866f1e44cecd3d Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mar 15 2016 15:29:41 +0000 Subject: [PATCH 4/5] Remove Enum.getvalue, since it is unused. --- diff --git a/koji/__init__.py b/koji/__init__.py index 0cb015e..4b2f7ee 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -119,19 +119,11 @@ class Enum(dict): else: return value - def getvalue(self,key,default=None): - try: - value = self.__getitem__(key) - except (IndexError,KeyError): - return default - if isinstance(key,int): - return value - else: - return key - def _notImplemented(self,*args,**opts): raise NotImplementedError + # deprecated + getvalue = _notImplemented #read-only __setitem__ = _notImplemented __delitem__ = _notImplemented From 05575f7669af4c5c8f0314b431e445d37fef433d Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mar 15 2016 15:29:41 +0000 Subject: [PATCH 5/5] Add tests for koji.Enum. --- diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..6be5326 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,33 @@ +import unittest + +import koji + + +class EnumTestCase(unittest.TestCase): + + def test_enum_create_alpha(self): + """ Test that we can create an Enum with alphabet names """ + koji.Enum(('one', 'two', 'three')) + + def test_enum_bracket_access(self): + """ Test bracket access. """ + test = koji.Enum(('one', 'two', 'three')) + self.assertEquals(test['one'], 0) + self.assertEquals(test['two'], 1) + self.assertEquals(test['three'], 2) + + with self.assertRaises(KeyError): + test['does not exist'] + + def test_enum_getter_access(self): + """ Test getter access. """ + test = koji.Enum(('one', 'two', 'three')) + self.assertEquals(test.get('one'), 0) + self.assertEquals(test.get('two'), 1) + self.assertEquals(test.get('three'), 2) + self.assertEquals(test.get('does not exist'), None) + + def test_enum_slice_access(self): + """ Test slice access. """ + test = koji.Enum(('one', 'two', 'three')) + self.assertEquals(test[1:], ('two', 'three'))