You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2015/01/29 04:43:08 UTC

svn commit: r1655521 - in /qpid/dispatch/trunk/tests: system_test.py system_tests_management.py

Author: aconway
Date: Thu Jan 29 03:43:08 2015
New Revision: 1655521

URL: http://svn.apache.org/r1655521
Log:
NO-JIRA: Separate router for logging test.

Avoid messing with log output from other tests.
- Re-use routers rather than starting new routers for special tests.
- Wait on demand for routers to be ready.
- Add test to verify querying a remote router via an intermediate router.

Modified:
    qpid/dispatch/trunk/tests/system_test.py
    qpid/dispatch/trunk/tests/system_tests_management.py

Modified: qpid/dispatch/trunk/tests/system_test.py
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/system_test.py?rev=1655521&r1=1655520&r2=1655521&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/system_test.py (original)
+++ qpid/dispatch/trunk/tests/system_test.py Thu Jan 29 03:43:08 2015
@@ -299,6 +299,9 @@ class Qdrouterd(Process):
             """Return list of sections named name"""
             return [p for n, p in self if n == name]
 
+        @property
+        def router_id(self): return self.sections("router")[0]["routerId"]
+
         def defaults(self):
             """Fill in default values in gconfiguration"""
             for name, props in self:
@@ -316,11 +319,13 @@ class Qdrouterd(Process):
 
     def __init__(self, name=None, config=Config(), pyinclude=None, wait=True):
         """
-        @param name: name used for for output files.
+        @param name: name used for for output files, default to routerId from config.
         @param config: router configuration
         @keyword wait: wait for router to be ready (call self.wait_ready())
         """
         self.config = copy(config)
+        if not name: name = self.config.router_id
+        assert name
         default_log = [l for l in config if (l[0] == 'log' and l[1]['module'] == 'DEFAULT')]
         if not default_log:
             config.append(
@@ -331,9 +336,11 @@ class Qdrouterd(Process):
             ['qdrouterd', '-c', config.write(name), '-I', pyinclude],
             name=name, expect=Process.RUNNING)
         self._management = None
+        self._wait_ready = False
         if wait:
             self.wait_ready()
 
+
     @property
     def management(self):
         """Return a management agent proxy for this router"""
@@ -400,8 +407,11 @@ class Qdrouterd(Process):
 
     def wait_ready(self):
         """Wait for ports and connectors to be ready"""
-        wait_ports(self.ports)
-        self.wait_connectors()
+        if not self._wait_ready:
+            self._wait_ready = True
+            wait_ports(self.ports)
+            self.wait_connectors()
+        return self
 
     def wait_connected(self, router_id):
         """Wait till this router is connected to router with router-id"""

Modified: qpid/dispatch/trunk/tests/system_tests_management.py
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/system_tests_management.py?rev=1655521&r1=1655520&r2=1655521&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/system_tests_management.py (original)
+++ qpid/dispatch/trunk/tests/system_tests_management.py Thu Jan 29 03:43:08 2015
@@ -46,28 +46,65 @@ def short_name(name):
         return name[len(PREFIX):]
     return name
 
-class ManagementTest(system_test.TestCase): # pylint: disable=too-many-public-methods
+
+class ManagementTest(system_test.TestCase):
 
     @classmethod
     def setUpClass(cls):
         super(ManagementTest, cls).setUpClass()
+        cls.all_routers = []
         # Stand-alone router
-        name = cls.__name__
-        conf = Qdrouterd.Config([
-            ('router', { 'mode': 'standalone', 'routerId': name}),
+        conf0=Qdrouterd.Config([
+            ('router', { 'mode': 'standalone', 'routerId': 'router0'}),
             ('listener', {'name': 'l0', 'port':cls.get_port(), 'role':'normal'}),
             # Extra listeners to exercise managment query
             ('listener', {'name': 'l1', 'port':cls.get_port(), 'role':'normal'}),
             ('listener', {'name': 'l2', 'port':cls.get_port(), 'role':'normal'})
         ])
-        cls.router = cls.tester.qdrouterd('%s'%name, conf)
-        cls.router.wait_ready()
+        cls._router = cls.tester.qdrouterd(config=conf0, wait=False)
+
+        # Pair of linked interior routers
+        conf1 = Qdrouterd.Config([
+            ('router', { 'mode': 'interior', 'routerId': 'router1'}),
+            ('listener', {'port':cls.get_port(), 'role':'normal'}),
+            ('listener', {'port':cls.get_port(), 'role':'inter-router'})
+        ])
+        conf2 = Qdrouterd.Config([
+            ('router', { 'mode': 'interior', 'routerId': 'router2'}),
+            ('listener', {'port':cls.get_port(), 'role':'normal'}),
+            ('connector', {'port':conf1.sections('listener')[1]['port'], 'role':'inter-router'})
+        ])
+        cls._routers = [cls.tester.qdrouterd(config=c, wait=False) for c in [conf1, conf2]]
+
+        # Stand-alone router for logging tests (avoid interfering with logging for other tests.)
+        conflog=Qdrouterd.Config([
+            ('router', { 'mode': 'standalone', 'routerId': 'logrouter'}),
+            ('listener', {'port':cls.get_port(), 'role':'normal'}),
+        ])
+        cls._logrouter = cls.tester.qdrouterd(config=conflog, wait=False)
+
+
+    @property
+    def router(self): return self.__class__._router.wait_ready()
+
+    @property
+    def logrouter(self): return self.__class__._logrouter.wait_ready()
+
+    @property
+    def routers(self):
+        """Wait on demand and return the linked interior routers"""
+        if not self._routers:
+            self._routers = self.__class__._routers
+            self._routers[0].wait_connected('router2')
+            self._routers[1].wait_connected('router1')
+        return self._routers
 
     def setUp(self):
         super(ManagementTest, self).setUp()
-        self.node = self.cleanup(Node(self.router.addresses[0]))
+        self._routers = None # Wait on demand
         self.maxDiff = None
         self.longMessage = True
+        self.node = self.cleanup(Node(self.router.addresses[0]))
 
     def test_bad_query(self):
         """Test that various badly formed queries get the proper response"""
@@ -132,18 +169,19 @@ class ManagementTest(system_test.TestCas
         # Connect via the new listener
         node3 = self.cleanup(Node(Url(port=port)))
         router = node3.query(type=ROUTER).get_entities()
-        self.assertEqual(self.__class__.router.name, router[0]['routerId'])
+        self.assertEqual(self.router.name, router[0]['routerId'])
 
     def test_log(self):
         """Create, update and query log entities"""
 
-        default = self.node.read(identity='log/DEFAULT')
+        node = self.cleanup(Node(self.logrouter.addresses[0]))
+        default = node.read(identity='log/DEFAULT')
         self.assertEqual(default.attributes,
                          {u'identity': u'log/DEFAULT',
                           u'enable': u'trace+',
                           u'module': u'DEFAULT',
                           u'name': u'log/DEFAULT',
-                          u'output': u'ManagementTest.log',
+                          u'output': u'logrouter.log',
                           u'source': True,
                           u'timestamp': True,
                           u'type': u'org.apache.qpid.dispatch.log'})
@@ -152,7 +190,7 @@ class ManagementTest(system_test.TestCas
         def check_log(log, error=True, debug=False):
             """Cause an error and check for expected error and debug logs"""
             bad_type = "nosuch"
-            self.assertRaises(ManagementError, self.node.create, type=bad_type, name=bad_type)
+            self.assertRaises(ManagementError, node.create, type=bad_type, name=bad_type)
             f = self.cleanup(open(log))
             logstr = f.read()
             def assert_expected(expect, regex, logstr):
@@ -169,7 +207,7 @@ class ManagementTest(system_test.TestCas
             log = os.path.abspath("test_log.log%s" % log_count[0])
             attributes["output"] = log
             attributes["identity"] = "log/AGENT"
-            self.node.update(attributes)
+            node.update(attributes)
             check_log(log, error, debug)
 
         # Expect error but no debug
@@ -188,13 +226,13 @@ class ManagementTest(system_test.TestCas
 
         # Check defaults are picked up
         update_check_log(dict(enable="default"), error=True, debug=True)
-        self.node.update(dict(identity="log/DEFAULT", enable="debug"))
+        node.update(dict(identity="log/DEFAULT", enable="debug"))
         update_check_log(dict(enable="DEFAULT"), error=False, debug=True)
-        self.node.update(dict(identity="log/DEFAULT", enable="error"))
+        node.update(dict(identity="log/DEFAULT", enable="error"))
         update_check_log(dict(enable="default"), error=True, debug=False)
 
         # Invalid values
-        self.assertRaises(ManagementError, self.node.update, dict(identity="log/AGENT", enable="foo"))
+        self.assertRaises(ManagementError, node.update, dict(identity="log/AGENT", enable="foo"))
 
     def test_create_fixed_address(self):
         self.assert_create_ok(FIXED_ADDRESS, 'fixed1', dict(prefix='fixed1'))
@@ -344,36 +382,11 @@ class ManagementTest(system_test.TestCas
 
     def test_router_node(self):
         """Test node entity in a pair of linked routers"""
-        # Pair of linked interior routers
-        conf1 = Qdrouterd.Config([
-            ('router', { 'mode': 'interior', 'routerId': 'router1'}),
-            ('listener', {'port':self.get_port(), 'role':'normal'}),
-            ('listener', {'port':self.get_port(), 'role':'inter-router'})
-        ])
-        conf2 = Qdrouterd.Config([
-            ('router', { 'mode': 'interior', 'routerId': 'router2'}),
-            ('listener', {'port':self.get_port(), 'role':'normal'}),
-            ('connector', {'port':conf1.sections('listener')[1]['port'], 'role':'inter-router'})
-        ])
-        routers = [self.qdrouterd('router1', conf1, wait=False),
-                   self.qdrouterd('router2', conf2, wait=False)]
-        for r in routers: r.wait_ready()
-        routers[0].wait_connected('router2')
-        routers[1].wait_connected('router1')
-
-        nodes = [self.cleanup(Node(Url(r.addresses[0]))) for r in routers]
-
-        class RNodes(list):
-            def __call__(self):
-                self[:] = sum([n.query(type=NODE).get_entities() for n in nodes], [])
-                return self
-        rnodes = RNodes()
-
-        assert retry(lambda: len(rnodes()) >= 2)
+        nodes = [self.cleanup(Node(Url(r.addresses[0]))) for r in self.routers]
+        rnodes = sum([n.query(type=NODE).get_entities() for n in nodes], [])
         self.assertEqual(['Rrouter2', 'Rrouter1'], [r.addr for r in rnodes])
-        # FIXME aconway 2014-10-15: verify nextHop and validOrigins updated correctly
-        self.assertEqual([u'amqp:/_topo/0/router2/$management', u'amqp:/_topo/0/router1/$management'],
-                         sum([n.get_mgmt_nodes() for n in nodes], []))
+        self.assertEqual(['0', '0'], [r.nextHop for r in rnodes])
+        self.assertEqual([[], []], [r.validOrigins for r in rnodes])
 
         # Test that all entities have a consitent identity format: type/name
         entities = list(chain(
@@ -384,6 +397,16 @@ class ManagementTest(system_test.TestCas
             else:
                 self.assertRegexpMatches(e.identity, "^%s/" % short_name(e.type), e)
 
+    def test_remote_node(self):
+        """Test that we can access management info of remote nodes using get_mgmt_nodes addresses"""
+        nodes = [self.cleanup(Node(Url(r.addresses[0]))) for r in self.routers]
+        remotes = sum([n.get_mgmt_nodes() for n in nodes], [])
+        self.assertEqual([u'amqp:/_topo/0/router2/$management', u'amqp:/_topo/0/router1/$management'], remotes)
+        # Query router2 indirectly via router1
+        remote_url = Url(self.routers[0].addresses[0], path=Url(remotes[0]).path)
+        remote = self.cleanup(Node(remote_url))
+        self.assertEqual(["router2"], [r.routerId for r in remote.query(type=ROUTER).get_entities()])
+
     def test_get_types(self):
         types = self.node.get_types()
         self.assertIn(CONFIGURATION, types[LISTENER])
@@ -440,16 +463,6 @@ class ManagementTest(system_test.TestCas
         r.expect = Process.EXIT_FAIL
         self.assertTrue(r.wait() != 0)
 
-
-    def test_config_many_logs(self):
-        """Regression test for DISPATCH-93, multiple log entries in config file cause errors"""
-        conf = Qdrouterd.Config([
-            ('listener', {'port': self.get_port(), 'role':'normal'}),
-            ('log', { 'module': 'AGENT', 'enable': 'debug+'}),
-            ('log', { 'module': 'MESSAGE', 'enable': 'trace+'})])
-        router = self.qdrouterd("multi_log_conf", conf, wait=True)
-
-
     def test_get_schema(self):
         schema = dictify(QdSchema().dump())
         # FIXME aconway 2015-01-26: improve node API.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org