From cfa4ce0a6fe82ed8578fe4668998012ad3833e05 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 5 Feb 2013 11:36:49 -0500 Subject: added support for wildcard XInclude in XMLFileBacked --- .../Testlib/TestServer/TestPlugin/Testhelpers.py | 53 +++++++++++++++------- .../Testlib/TestServer/TestPlugins/TestMetadata.py | 1 + 2 files changed, 38 insertions(+), 16 deletions(-) (limited to 'testsuite/Testsrc/Testlib/TestServer') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugin/Testhelpers.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugin/Testhelpers.py index 22c53c63e..fb51eb1fe 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugin/Testhelpers.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugin/Testhelpers.py @@ -417,21 +417,22 @@ class TestXMLFileBacked(TestFileBacked): xfb = self.get_obj(fam=fam, should_monitor=True) fam.AddMonitor.assert_called_with(self.path, xfb) - @patch("os.path.exists") + @patch("glob.glob") @patch("lxml.etree.parse") - def test_follow_xincludes(self, mock_parse, mock_exists): + def test_follow_xincludes(self, mock_parse, mock_glob): xfb = self.get_obj() xfb.add_monitor = Mock() + xfb.add_monitor.side_effect = lambda p: xfb.extras.append(p) def reset(): xfb.add_monitor.reset_mock() + mock_glob.reset_mock() mock_parse.reset_mock() - mock_exists.reset_mock() xfb.extras = [] - mock_exists.return_value = True xdata = dict() mock_parse.side_effect = lambda p: xdata[p] + mock_glob.side_effect = lambda g: [g] base = os.path.dirname(self.path) @@ -465,7 +466,7 @@ class TestXMLFileBacked(TestFileBacked): xfb.add_monitor.assert_called_with(test2) self.assertItemsEqual(mock_parse.call_args_list, [call(f) for f in xdata.keys()]) - mock_exists.assert_called_with(test2) + mock_glob.assert_called_with(test2) reset() xfb._follow_xincludes(fname=self.path, xdata=xdata[self.path]) @@ -473,7 +474,7 @@ class TestXMLFileBacked(TestFileBacked): self.assertItemsEqual(mock_parse.call_args_list, [call(f) for f in xdata.keys() if f != self.path]) - mock_exists.assert_called_with(test2) + mock_glob.assert_called_with(test2) # test two-deep level of xinclude, with some files in another # directory @@ -501,21 +502,41 @@ class TestXMLFileBacked(TestFileBacked): reset() xfb._follow_xincludes(fname=self.path) - self.assertItemsEqual(xfb.add_monitor.call_args_list, - [call(f) for f in xdata.keys() if f != self.path]) + expected = [call(f) for f in xdata.keys() if f != self.path] + self.assertItemsEqual(xfb.add_monitor.call_args_list, expected) self.assertItemsEqual(mock_parse.call_args_list, [call(f) for f in xdata.keys()]) - self.assertItemsEqual(mock_exists.call_args_list, - [call(f) for f in xdata.keys() if f != self.path]) + self.assertItemsEqual(mock_glob.call_args_list, expected) reset() xfb._follow_xincludes(fname=self.path, xdata=xdata[self.path]) - self.assertItemsEqual(xfb.add_monitor.call_args_list, - [call(f) for f in xdata.keys() if f != self.path]) - self.assertItemsEqual(mock_parse.call_args_list, - [call(f) for f in xdata.keys() if f != self.path]) - self.assertItemsEqual(mock_exists.call_args_list, - [call(f) for f in xdata.keys() if f != self.path]) + expected = [call(f) for f in xdata.keys() if f != self.path] + self.assertItemsEqual(xfb.add_monitor.call_args_list, expected) + self.assertItemsEqual(mock_parse.call_args_list, expected) + self.assertItemsEqual(mock_glob.call_args_list, expected) + + # test wildcard xinclude + reset() + xdata[self.path] = lxml.etree.Element("Test").getroottree() + lxml.etree.SubElement(xdata[self.path].getroot(), + Bcfg2.Server.XI_NAMESPACE + "include", + href="*.xml") + + def glob_rv(path): + if path == os.path.join(base, '*.xml'): + return [self.path, test2, test3] + else: + return [path] + mock_glob.side_effect = glob_rv + + xfb._follow_xincludes(xdata=xdata[self.path]) + expected = [call(f) for f in xdata.keys() if f != self.path] + self.assertItemsEqual(xfb.add_monitor.call_args_list, expected) + self.assertItemsEqual(mock_parse.call_args_list, expected) + self.assertItemsEqual(mock_glob.call_args_list, + [call(os.path.join(base, '*.xml')), call(test4), + call(test5), call(test6)]) + @patch("lxml.etree._ElementTree", FakeElementTree) @patch("Bcfg2.Server.Plugin.helpers.%s._follow_xincludes" % diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py index f627e4465..ab7123fa7 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py @@ -198,6 +198,7 @@ if HAS_DJANGO or can_skip: class TestXMLMetadataConfig(TestXMLFileBacked): test_obj = XMLMetadataConfig + path = os.path.join(datastore, 'Metadata', 'clients.xml') def get_obj(self, basefile="clients.xml", core=None, watch_clients=False): self.metadata = get_metadata_object(core=core, -- cgit v1.2.3-1-g7c22 From 9d0e6991fc23c073efc0db6bf10e1081f6725e55 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 5 Feb 2013 12:13:20 -0500 Subject: abstracted similar digit range classes in POSIXUsers/GroupPatterns into Bcfg2.Utils --- .../TestServer/TestPlugins/TestGroupPatterns.py | 21 --------------------- 1 file changed, 21 deletions(-) (limited to 'testsuite/Testsrc/Testlib/TestServer') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestGroupPatterns.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestGroupPatterns.py index a7a6b3d6e..a9346156c 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestGroupPatterns.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestGroupPatterns.py @@ -18,27 +18,6 @@ from common import * from TestPlugin import TestXMLFileBacked, TestPlugin, TestConnector -class TestPackedDigitRange(Bcfg2TestCase): - def test_includes(self): - # tuples of (range description, numbers that are included, - # numebrs that are excluded) - tests = [("1-3", [1, "2", 3], [4]), - ("1", [1], [0, "2"]), - ("10-11", [10, 11], [0, 1]), - ("9-9", [9], [8, 10]), - ("0-100", [0, 10, 99, 100], []), - ("1,3,5", [1, 3, 5], [0, 2, 4, 6]), - ("1-5,7", [1, 3, 5, 7], [0, 6, 8]), - ("1-5,7,9-11", [1, 3, 5, 7, 9, 11], [0, 6, 8, 12]), - ("852-855,321-497,763", [852, 855, 321, 400, 497, 763], [])] - for rng, inc, exc in tests: - r = PackedDigitRange(rng) - for test in inc: - self.assertTrue(r.includes(test)) - for test in exc: - self.assertFalse(r.includes(test)) - - class TestPatternMap(Bcfg2TestCase): def test_ranges(self): """ test processing NameRange patterns """ -- cgit v1.2.3-1-g7c22 From ff0048a3a26c9076c8052a8c7be171e4364f0d09 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 7 Feb 2013 10:00:37 -0500 Subject: moved common file locking code into Bcfg2.Utils --- testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'testsuite/Testsrc/Testlib/TestServer') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py index ab7123fa7..35847b2c2 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py @@ -327,7 +327,7 @@ class TestXMLMetadataConfig(TestXMLFileBacked): "clients.xml"), "") - @patch('Bcfg2.Server.Plugins.Metadata.locked', Mock(return_value=False)) + @patch('Bcfg2.Utils.locked', Mock(return_value=False)) @patch('fcntl.lockf', Mock()) @patch('os.open') @patch('os.fdopen') -- cgit v1.2.3-1-g7c22 From fb723b0164318459e337911cf243ba497d8f6683 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 7 Feb 2013 10:14:31 -0500 Subject: Metadata: process default client bootstrap mode properly --- .../Testlib/TestServer/TestPlugins/TestMetadata.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'testsuite/Testsrc/Testlib/TestServer') diff --git a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py index 35847b2c2..69ea45de6 100644 --- a/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py +++ b/testsuite/Testsrc/Testlib/TestServer/TestPlugins/TestMetadata.py @@ -20,7 +20,7 @@ while path != "/": path = os.path.dirname(path) from common import * from TestPlugin import TestXMLFileBacked, TestMetadata as _TestMetadata, \ - TestStatistics, TestDatabaseBacked + TestClientRunHooks, TestDatabaseBacked def get_clients_test_tree(): @@ -463,7 +463,7 @@ class TestClientMetadata(Bcfg2TestCase): self.assertFalse(cm.inGroup("group3")) -class TestMetadata(_TestMetadata, TestStatistics, TestDatabaseBacked): +class TestMetadata(_TestMetadata, TestClientRunHooks, TestDatabaseBacked): test_obj = Metadata use_db = False @@ -495,7 +495,7 @@ class TestMetadata(_TestMetadata, TestStatistics, TestDatabaseBacked): metadata = self.get_obj(core=core) self.assertIsInstance(metadata, Bcfg2.Server.Plugin.Plugin) self.assertIsInstance(metadata, Bcfg2.Server.Plugin.Metadata) - self.assertIsInstance(metadata, Bcfg2.Server.Plugin.Statistics) + self.assertIsInstance(metadata, Bcfg2.Server.Plugin.ClientRunHooks) self.assertIsInstance(metadata.clients_xml, XMLMetadataConfig) self.assertIsInstance(metadata.groups_xml, XMLMetadataConfig) self.assertIsInstance(metadata.query, MetadataQuery) @@ -1217,17 +1217,16 @@ class TestMetadata(_TestMetadata, TestStatistics, TestDatabaseBacked): @patch("Bcfg2.Server.Plugins.Metadata.XMLMetadataConfig.load_xml", Mock()) @patch("Bcfg2.Server.Plugins.Metadata.Metadata.update_client") - def test_process_statistics(self, mock_update_client): + def test_end_statistics(self, mock_update_client): metadata = self.load_clients_data(metadata=self.load_groups_data()) md = Mock() md.hostname = "client6" - metadata.process_statistics(md, None) - mock_update_client.assert_called_with(md.hostname, - dict(auth='cert')) + metadata.end_statistics(md) + mock_update_client.assert_called_with(md.hostname, dict(auth='cert')) mock_update_client.reset_mock() md.hostname = "client5" - metadata.process_statistics(md, None) + metadata.end_statistics(md) self.assertFalse(mock_update_client.called) def test_viz(self): @@ -1504,6 +1503,10 @@ class TestMetadata_NoClientsXML(TestMetadataBase): def test_handle_clients_xml_event(self): pass + def test_end_statistics(self): + # bootstrap mode, which is what is being tested here, doesn't + # work without clients.xml + pass class TestMetadata_ClientsXML(TestMetadataBase): """ test Metadata with a clients.xml. """ -- cgit v1.2.3-1-g7c22