diff options
author | Jesse Jaggars <jjaggars@redhat.com> | 2012-03-13 17:14:29 -0500 |
---|---|---|
committer | Jesse Jaggars <jjaggars@redhat.com> | 2012-03-13 17:14:29 -0500 |
commit | 20e9d49b29a63614ee173d7773113aa610252936 (patch) | |
tree | 628cc8a35561dffdd4ca43c9a652a82e702ada42 /tests | |
parent | 3570f8e00be445000975b256d2a1e6b622dc81c5 (diff) | |
download | sos-20e9d49b29a63614ee173d7773113aa610252936.tar.gz |
Squashed commit of the following:
commit 1c2cf82a424125decda210a557755e8467bf0b2b
Author: Jesse Jaggars <jjaggars@redhat.com>
Date: Tue Mar 13 15:20:47 2012 -0500
adding regex sub tests and some docstrings
commit d72f2f28b364519710f95a53330821138fc40849
Author: Jesse Jaggars <jjaggars@redhat.com>
Date: Tue Mar 13 11:13:06 2012 -0500
adding many tests for plugins
Diffstat (limited to 'tests')
-rw-r--r-- | tests/plugin_tests.py | 311 | ||||
-rw-r--r-- | tests/tail_test.txt | 4 | ||||
-rw-r--r-- | tests/utilities_tests.py | 14 |
3 files changed, 328 insertions, 1 deletions
diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py new file mode 100644 index 00000000..87940b8e --- /dev/null +++ b/tests/plugin_tests.py @@ -0,0 +1,311 @@ +import unittest +import os +import tempfile +from StringIO import StringIO + +from sos.plugins import Plugin, regex_findall, sosRelPath +from sos.utilities import Archive + +PATH = os.path.dirname(__file__) + +def j(filename): + return os.path.join(PATH, filename) + +def create_file(size): + f = tempfile.NamedTemporaryFile(delete=False) + f.write("*" * size * 1024 * 1024) + f.flush() + f.close() + return f.name + +class MockArchive(Archive): + + def __init__(self): + self.m = {} + self.strings = {} + + def name(self): + return "mock.archive" + + def add_file(self, src, dest=None): + if not dest: + dest = src + self.m[src] = dest + + def add_string(self, content, dest): + self.m[dest] = content + + def add_link(self, dest, link_name): + pass + + def open_file(self, name): + return open(self.m.get(name), 'r') + + def close(self): + pass + + def compress(self, method): + pass + + +class MockPlugin(Plugin): + + optionList = [("opt", 'an option', 'fast', None), + ("opt2", 'another option', 'fast', False)] + + def setup(self): + pass + + +class NamedMockPlugin(Plugin): + """This plugin has a description.""" + + plugin_name = "testing" + + def setup(self): + pass + + +class ForbiddenMockPlugin(Plugin): + """This plugin has a description.""" + + plugin_name = "forbidden" + + def setup(self): + self.addForbiddenPath("tests") + + +class EnablerPlugin(Plugin): + + is_installed = False + + def isInstalled(self, pkg): + return self.is_installed + + +class MockOptions(object): + + profiler = False + + + +class PluginToolTests(unittest.TestCase): + + def test_regex_findall(self): + test_s = "\n".join(['this is only a test', 'there are only two lines']) + test_fo = StringIO(test_s) + matches = regex_findall(r".*lines$", test_fo) + self.assertEquals(matches, ['there are only two lines']) + + def test_regex_findall_miss(self): + test_s = "\n".join(['this is only a test', 'there are only two lines']) + test_fo = StringIO(test_s) + matches = regex_findall(r".*not_there$", test_fo) + self.assertEquals(matches, []) + + def test_regex_findall_bad_input(self): + matches = regex_findall(r".*", None) + self.assertEquals(matches, []) + matches = regex_findall(r".*", []) + self.assertEquals(matches, []) + matches = regex_findall(r".*", 1) + self.assertEquals(matches, []) + + def test_rel_path(self): + path1 = "/usr/lib/foo" + path2 = "/usr/lib/boo" + self.assertEquals(sosRelPath(path1, path2), "../boo") + + def test_abs_path(self): + path1 = "usr/lib/foo" + path2 = "foo/lib/boo" + self.assertEquals(sosRelPath(path1, path2), "foo/lib/boo") + + def test_bad_path(self): + path1 = None + path2 = "foo/lib/boo" + self.assertEquals(sosRelPath(path1, path2), "foo/lib/boo") + + +class PluginTests(unittest.TestCase): + + def setUp(self): + self.mp = MockPlugin({ + 'cmdlineopts': MockOptions() + }) + self.mp.archive = MockArchive() + + def test_plugin_default_name(self): + p = MockPlugin({}) + self.assertEquals(p.name(), "mockplugin") + + def test_plugin_set_name(self): + p = NamedMockPlugin({}) + self.assertEquals(p.name(), "testing") + + def test_plugin_no_descrip(self): + p = MockPlugin({}) + self.assertEquals(p.get_description(), "<no description available>") + + def test_plugin_no_descrip(self): + p = NamedMockPlugin({}) + self.assertEquals(p.get_description(), "This plugin has a description.") + + def test_set_plugin_option(self): + p = MockPlugin({}) + p.setOption("opt", "testing") + self.assertEquals(p.getOption("opt"), "testing") + + def test_set_nonexistant_plugin_option(self): + p = MockPlugin({}) + self.assertFalse(p.setOption("badopt", "testing")) + + def test_get_nonexistant_plugin_option(self): + p = MockPlugin({}) + self.assertEquals(p.getOption("badopt"), 0) + + def test_get_unset_plugin_option(self): + p = MockPlugin({}) + self.assertEquals(p.getOption("opt"), 0) + + def test_get_unset_plugin_option_with_default(self): + # this shows that even when we pass in a default to get, + # we'll get the option's default as set in the plugin + # this might not be what we really want + p = MockPlugin({}) + self.assertEquals(p.getOption("opt", True), True) + + def test_get_unset_plugin_option_with_default_not_none(self): + # this shows that even when we pass in a default to get, + # if the plugin default is not None + # we'll get the option's default as set in the plugin + # this might not be what we really want + p = MockPlugin({}) + self.assertEquals(p.getOption("opt2", True), False) + + def test_get_option_as_list_plugin_option(self): + p = MockPlugin({}) + p.setOption("opt", "one,two,three") + self.assertEquals(p.getOptionAsList("opt"), ['one', 'two', 'three']) + + def test_get_option_as_list_plugin_option_default(self): + p = MockPlugin({}) + self.assertEquals(p.getOptionAsList("opt", default=[]), []) + + def test_get_option_as_list_plugin_option_not_list(self): + p = MockPlugin({}) + p.setOption("opt", "testing") + self.assertEquals(p.getOptionAsList("opt"), ['testing']) + + def test_copy_dir(self): + self.mp.doCopyFileOrDir("tests") + self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'tests/plugin_tests.py') + + def test_copy_dir_sub(self): + self.mp.doCopyFileOrDir("tests", sub=("tests/", "foobar/")) + self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'foobar/plugin_tests.py') + + def test_copy_dir_bad_path(self): + self.mp.doCopyFileOrDir("not_here_tests") + self.assertEquals(self.mp.archive.m, {}) + + def test_copy_dir_forbidden_path(self): + p = ForbiddenMockPlugin({ + 'cmdlineopts': MockOptions() + }) + p.archive = MockArchive() + p.setup() + p.doCopyFileOrDir("tests") + self.assertEquals(p.archive.m, {}) + + +class AddCopySpecLimitTests(unittest.TestCase): + + def setUp(self): + self.mp = MockPlugin({ + 'cmdlineopts': MockOptions() + }) + self.mp.archive = MockArchive() + + def test_single_file_under_limit(self): + self.mp.addCopySpecLimit("tests/tail_test.txt", 1) + self.assertEquals(self.mp.copyPaths, [('tests/tail_test.txt', None)]) + + def test_single_file_over_limit(self): + fn = create_file(2) # create 2MB file, consider a context manager + self.mp.addCopySpecLimit(fn, 1, sub=('tmp', 'awesome')) + content, fname = self.mp.copyStrings[0] + self.assertTrue("tailed" in fname) + self.assertTrue("awesome" in fname) + self.assertTrue("/" not in fname) + self.assertEquals(1024 * 1024, len(content)) + os.unlink(fn) + + def test_bad_filename(self): + self.assertFalse(self.mp.addCopySpecLimit('', 1)) + self.assertFalse(self.mp.addCopySpecLimit(None, 1)) + + def test_glob_file_over_limit(self): + # assume these are in /tmp + fn = create_file(2) + fn2 = create_file(2) + self.mp.addCopySpecLimit("/tmp/tmp*", 1) + self.assertEquals(len(self.mp.copyStrings), 1) + content, fname = self.mp.copyStrings[0] + self.assertTrue("tailed" in fname) + self.assertEquals(1024 * 1024, len(content)) + os.unlink(fn) + os.unlink(fn2) + + +class CheckEnabledTests(unittest.TestCase): + + def setUp(self): + self.mp = EnablerPlugin({}) + + def test_checks_for_file(self): + f = j("tail_test.txt") + self.mp.files = (f,) + self.assertTrue(self.mp.checkenabled()) + + def test_checks_for_package(self): + self.mp.packages = ('foo',) + self.mp.is_installed = True + self.assertTrue(self.mp.checkenabled()) + + def test_allows_bad_tuple(self): + f = j("tail_test.txt") + self.mp.files = (f) + self.mp.packages = ('foo') + self.assertTrue(self.mp.checkenabled()) + + def test_enabled_by_default(self): + self.assertTrue(self.mp.checkenabled()) + + +class RegexSubTests(unittest.TestCase): + + def setUp(self): + self.mp = MockPlugin({ + 'cmdlineopts': MockOptions() + }) + self.mp.archive = MockArchive() + + def test_file_never_copied(self): + self.assertEquals(0, self.mp.doRegexSub("never_copied", r"^(.*)$", "foobar")) + + def test_no_replacements(self): + self.mp.addCopySpec(j("tail_test.txt")) + self.mp.copyStuff() + replacements = self.mp.doRegexSub(j("tail_test.txt"), r"wont_match", "foobar") + self.assertEquals(0, replacements) + + def test_replacements(self): + self.mp.addCopySpec(j("tail_test.txt")) + self.mp.copyStuff() + replacements = self.mp.doRegexSub(j("tail_test.txt"), r"(tail)", "foobar") + self.assertEquals(1, replacements) + self.assertTrue("foobar" in self.mp.archive.m.get(j('tail_test.txt'))) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/tail_test.txt b/tests/tail_test.txt new file mode 100644 index 00000000..8def0f72 --- /dev/null +++ b/tests/tail_test.txt @@ -0,0 +1,4 @@ +this is a file to test tail with +I have a few lines in here +I just need enough text to mess with it +this is the last line diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py index 7eecc01a..24bc950b 100644 --- a/tests/utilities_tests.py +++ b/tests/utilities_tests.py @@ -2,7 +2,7 @@ import os.path import unittest from StringIO import StringIO -from sos.utilities import grep, DirTree, checksum, get_hash_name, is_executable, sosGetCommandOutput, find +from sos.utilities import grep, DirTree, checksum, get_hash_name, is_executable, sosGetCommandOutput, find, tail import sos TEST_DIR = os.path.dirname(__file__) @@ -28,6 +28,18 @@ class GrepTest(unittest.TestCase): self.assertEquals(matches, ['import unittest\n']) +class TailTest(unittest.TestCase): + + def test_tail(self): + t = tail("tests/tail_test.txt", 10) + self.assertEquals(t, "last line\n") + + def test_tail_too_many(self): + t = tail("tests/tail_test.txt", 200) + expected = open("tests/tail_test.txt", "r").read() + self.assertEquals(t, expected) + + class DirTreeTest(unittest.TestCase): def test_makes_tree(self): |