[svn] commit: r2659 - in /branches/trac191/src/bin/stats: stats.py.in stats.spec.pre.in stats_stub.py.in tests/b10-stats_stub_test.py tests/b10-stats_test.py tests/unittest_fakesession.py

BIND 10 source code commits bind10-changes at lists.isc.org
Mon Aug 9 12:49:07 UTC 2010


Author: naokikambe
Date: Mon Aug  9 12:49:07 2010
New Revision: 2659

Log:
- add select process in socket-close function in unittest_fakesession.py
- changes for more strict test scripts (b10-stats_test.py, b10-stats_stub_test.py)
- changes of behavior of stand-alone stub program (stats_stub.py.in), which isn't installed actually
- changes depend upon natural language (stats.spec.pre.in)
- add detailed comments (stats.py.in)
- some minor changes

Modified:
    branches/trac191/src/bin/stats/stats.py.in
    branches/trac191/src/bin/stats/stats.spec.pre.in
    branches/trac191/src/bin/stats/stats_stub.py.in
    branches/trac191/src/bin/stats/tests/b10-stats_stub_test.py
    branches/trac191/src/bin/stats/tests/b10-stats_test.py
    branches/trac191/src/bin/stats/tests/unittest_fakesession.py

Modified: branches/trac191/src/bin/stats/stats.py.in
==============================================================================
--- branches/trac191/src/bin/stats/stats.py.in (original)
+++ branches/trac191/src/bin/stats/stats.py.in Mon Aug  9 12:49:07 2010
@@ -73,8 +73,7 @@
     """
     A abstract subject class of observer pattern
     """
-    def __init__(self, verbose=False):
-        self.verbose=verbose
+    def __init__(self):
         self._listeners = []
 
     def attach(self, listener):
@@ -158,12 +157,11 @@
         self.stats_data = self.initialize_data(self.stats_spec)
 
         # add event handler invoked via SessionSubject object
-
-        # don't add 'command_' suffix to the special commands in
-        # order to prevent executing internal command via bindctl
         self.add_event(Callback('start', self.start))
         self.add_event(Callback('stop', self.stop))
         self.add_event(Callback('check', self.check))
+        # don't add 'command_' suffix to the special commands in
+        # order to prevent executing internal command via bindctl
 
         # get commands spec
         self.commands_spec = self.cc_session.get_module_spec().get_commands_spec()
@@ -218,9 +216,8 @@
         """
         handle commands from the cc channel
         """
-        cmd = None
         # add 'command_' suffix in order to executing command via bindctl
-        name = 'command_'+command
+        name = 'command_' + command
         
         if name in self.events:
             event = self.events[name]
@@ -245,8 +242,7 @@
             sys.stdout.write("[b10-stats] 'set' command received, args: "+str(args)+"\n")
 
         # 'args' must be dictionary type
-        stats_data.update(args['stats_data'])
-        self.stats_data.update(stats_data)
+        self.stats_data.update(args['stats_data'])
 
         # overwrite "stats.LastUpdateTime"
         self.stats_data['stats.last_update_time'] = get_datetime()
@@ -267,8 +263,8 @@
         # is called recursively
         def __increase_data(data, args):
             if type(data) == list:
-                max = max(len(data), len(args))
-                for i in max:
+                mx = max(len(data), len(args))
+                for i in mx:
                     if i in data and i in args:
                         data[i] = __increase_data(data[i], args[i])
                     elif i in args:
@@ -305,6 +301,7 @@
 
         # just remove one item
         self.stats_data.pop(stats_item_name)
+
         return create_answer(0)
 
     def command_show(self, args, stats_item_name=''):
@@ -314,7 +311,8 @@
         if self.verbose:
             sys.stdout.write("[b10-stats] 'show' command received, args: "+str(args)+"\n")
 
-        # always overwrite 'report_time' and 'stats.timestamp' if "show" command invoked
+        # always overwrite 'report_time' and 'stats.timestamp'
+        # if "show" command invoked
         self.stats_data['report_time'] = get_datetime()
         self.stats_data['stats.timestamp'] = get_timestamp()
 
@@ -349,6 +347,7 @@
         """
         if self.verbose:
             sys.stdout.write("[b10-stats] 'status' command received\n")
+        # just return "I'm alive."
         return create_answer(0, "I'm alive.")
 
     def command_unknown(self, command, args):
@@ -376,10 +375,14 @@
             elif spec['item_type'] in set(['float', 'double', 'real']):
                 return float(spec.get('item_default', 0.0))
             elif spec['item_type'] in set(['list', 'array']):
-                return spec.get('item_default', [ __get_init_val(spec['list_item_spec']) ])
+                return spec.get('item_default',
+                                [ __get_init_val(spec['list_item_spec']) ])
             elif spec['item_type'] in set(['map', 'object']):
                 return spec.get('item_default',
-                                dict([ (s['item_name'], __get_init_val(s)) for s in spec['map_item_spec'] ]) )
+                                dict([
+                            (s['item_name'], __get_init_val(s))
+                            for s in spec['map_item_spec']
+                            ]) )
             else:
                 return spec.get('item_default')
         return dict([ (s['item_name'], __get_init_val(s)) for s in spec ])
@@ -415,9 +418,6 @@
               + "is the command channel daemon running?\n")
     except KeyboardInterrupt as kie:
         sys.stderr.write("[b10-stats] Interrupted, exiting\n")
-    finally:
-        if subject:
-            subject.stop()
 
 if __name__ == "__main__":
     main()

Modified: branches/trac191/src/bin/stats/stats.spec.pre.in
==============================================================================
--- branches/trac191/src/bin/stats/stats.spec.pre.in (original)
+++ branches/trac191/src/bin/stats/stats.spec.pre.in Mon Aug  9 12:49:07 2010
@@ -18,7 +18,7 @@
         "item_optional": false,
         "item_default": "1970-01-01T00:00:00Z",
         "item_title": "stats.BootTime",
-        "item_description": "A date time when b10-stats process starts",
+        "item_description": "A date time when bind10 process starts initially",
         "item_format": "date-time"
       },
       {
@@ -27,7 +27,7 @@
         "item_optional": false,
         "item_default": "1970-01-01T00:00:00Z",
         "item_title": "stats.BootTime",
-        "item_description": "A date time when the stats module starts initially or a time when the stats module restarts",
+        "item_description": "A date time when the stats module starts initially or when the stats module restarts",
         "item_format": "date-time"
       },
       {
@@ -36,7 +36,7 @@
         "item_optional": false,
         "item_default": "1970-01-01T00:00:00Z",
         "item_title": "stats.StartTime",
-        "item_description": "A date time when the stats module starts collecting data and aggregating values, or resetting data at last time",
+        "item_description": "A date time when the stats module starts collecting data or resetting values last time",
         "item_format": "date-time"
       },
       {
@@ -45,7 +45,7 @@
         "item_optional": false,
         "item_default": "1970-01-01T00:00:00Z",
         "item_title": "stats.LastUpdateTime",
-        "item_description": "The latest date time when the stats module accepts from another modules like auth server or boss process and so on",
+        "item_description": "The latest date time when the stats module receives from other modules like auth server or boss process and so on",
         "item_format": "date-time"
       },
       {
@@ -54,7 +54,7 @@
         "item_optional": false,
         "item_default": 0.0,
         "item_title": "stats.Timestamp",
-        "item_description": "Current timestamp since epoch time (1970-01-01T00:00:00Z)",
+        "item_description": "A current time stamp since epoch time (1970-01-01T00:00:00Z)",
         "item_format": "second"
       },
       {
@@ -85,12 +85,12 @@
     "commands": [
       {
         "command_name": "status",
-        "command_description": "status command",
+        "command_description": "identify whether stats module is alive or not",
         "command_args": []
       },
       {
         "command_name": "show",
-        "command_description": "show specified/all statistics data",
+        "command_description": "show the specified/all statistics data",
         "command_args": [
           {
             "item_name": "stats_item_name",
@@ -101,8 +101,8 @@
         ]
       },
       {
+        "command_name": "set",
         "command_description": "set the value of specified name in statistics data",
-        "command_name": "set",
         "command_args": [
           {
             "item_name": "stats_data",
@@ -115,7 +115,7 @@
       },
       {
         "command_name": "increase",
-        "command_description": "increase the existent value of specified name in statistics data",
+        "command_description": "increase the current value of specified name up to specified value in statistics data",
         "command_args": [
           {
             "item_name": "stats_data",
@@ -128,7 +128,7 @@
       },
       {
         "command_name": "remove",
-        "command_description": "remove the specified name in statistics data",
+        "command_description": "remove the specified name from statistics data",
         "command_args": [
           {
             "item_name": "stats_item_name",
@@ -140,12 +140,12 @@
       },
       {
         "command_name": "reset",
-        "command_description": "reset all statistics data",
+        "command_description": "reset all statistics data to default values except for several constant names",
         "command_args": []
       },
       {
         "command_name": "shutdown",
-        "command_description": "Shut down stats module",
+        "command_description": "Shut down the stats module",
         "command_args": []
       }
     ]

Modified: branches/trac191/src/bin/stats/stats_stub.py.in
==============================================================================
--- branches/trac191/src/bin/stats/stats_stub.py.in (original)
+++ branches/trac191/src/bin/stats/stats_stub.py.in Mon Aug  9 12:49:07 2010
@@ -52,6 +52,9 @@
         pass
 
     def send_command(self, command, args):
+        """
+        send command to stats module with args
+        """
         cmd = create_command(command, args)
         if self.verbose:
             sys.stdout.write("[b10-stats_stub] send command : " + str(cmd) + "\n")
@@ -68,10 +71,10 @@
         self.session.group_reply(env, create_answer(0))
         return ret, arg, env
         
-class BossStub:
+class BossModuleStub:
     """
-    This class is customized CCSessionStub and is intended to behaves
-    as a virtual Boss process to send to Stats Module.
+    This class is customized from CCSessionStub and is intended to behaves
+    as a virtual Boss module to send to Stats Module.
     """
     def __init__(self, session=None, verbose=False):
         self.stub = CCSessionStub(session=session, verbose=verbose)
@@ -79,30 +82,40 @@
     def send_command(self):
         return self.stub.send_command("set", {"stats_data": {"bind10.boot_time": get_datetime()}})
 
-class AuthStub:
+class AuthModuleStub:
     """
     This class is customized CCSessionStub and is intended to behaves
-    as a virtual Auth process to send to Stats Module.
+    as a virtual Auth module to send to Stats Module.
     """
     def __init__(self, session=None, verbose=False):
         self.stub = CCSessionStub(session=session, verbose=verbose)
         self.count = { "udp": 0, "tcp": 0 }
     
-    def send_command_udp(self):
-        p = "udp"
-        self.count[p] = 1
-        return self.stub.send_command("increase", {"stats_data": {"auth.queries."+p: self.count[p]}})
+    def send_command_udp(self, cmd="increase", cnt=0):
+        """
+        count up udp query count
+        """
+        prt = "udp"
+        self.count[prt] = 1
+        if cnt > 0:
+            self.count[prt] = cnt
+        return self.stub.send_command(cmd,
+                                      {"stats_data":
+                                           {"auth.queries."+prt: self.count[prt]}
+                                       })
 
-    def send_command_tcp(self):
-        p = "tcp"
-        self.count[p] = self.count[p] + 1
-        return self.stub.send_command("set", {"stats_data": {"auth.queries."+p: self.count[p]}})
-
-def get_timestamp():
-    """
-    get current timestamp
-    """
-    return time.time()
+    def send_command_tcp(self, cmd="set", cnt=0):
+        """
+        set udp query count
+        """
+        prt = "tcp"
+        self.count[prt] = self.count[prt] + 1
+        if cnt > 0:
+            self.count[prt] = cnt
+        return self.stub.send_command(cmd,
+                                      {"stats_data":
+                                           {"auth.queries."+prt: self.count[prt]}
+                                       })
 
 def get_datetime():
     """
@@ -117,10 +130,11 @@
                       help="display more about what is going on")
         (options, args) = parser.parse_args()
         stub = CCSessionStub(verbose=options.verbose)
-        boss = BossStub(session=stub.session, verbose=options.verbose)
-        auth = AuthStub(session=stub.session, verbose=options.verbose)
+        boss = BossModuleStub(session=stub.session, verbose=options.verbose)
+        auth = AuthModuleStub(session=stub.session, verbose=options.verbose)
         stub.send_command("status", None)
         boss.send_command()
+        auth.send_command_udp(cmd="set", cnt=81120) # This is an example.
         while True:
             auth.send_command_udp()
             auth.send_command_tcp()
@@ -132,10 +146,9 @@
         sys.stderr.write("[b10-stats_stub] Error creating Stats module, "
               + "is the command channel daemon running?\n")
     except KeyboardInterrupt as kie:
-        sys.stderr.write("[stats_stub] Interrupted, exiting\n")
+        sys.stderr.write("[b10-stats_stub] Interrupted, exiting\n")
     finally:
         stub.cc_session.close()
 
 if __name__ == "__main__":
     main()
-

Modified: branches/trac191/src/bin/stats/tests/b10-stats_stub_test.py
==============================================================================
--- branches/trac191/src/bin/stats/tests/b10-stats_stub_test.py (original)
+++ branches/trac191/src/bin/stats/tests/b10-stats_stub_test.py Mon Aug  9 12:49:07 2010
@@ -22,72 +22,73 @@
 import unittest
 import time
 from unittest_fakesession import FakeModuleCCSession
-from stats_stub import CCSessionStub, BossStub, AuthStub
+from stats_stub import CCSessionStub, BossModuleStub, AuthModuleStub
 
 class TestStats(unittest.TestCase):
 
     def setUp(self):
         self.session = FakeModuleCCSession()
         self.stub = CCSessionStub(self.session, verbose=False)
-        self.boss = BossStub(self.session, verbose=False)
-        self.auth = AuthStub(self.session, verbose=False)
+        self.boss = BossModuleStub(self.session, verbose=False)
+        self.auth = AuthModuleStub(self.session, verbose=False)
+        self.env = {'from': None, 'group': 'Stats'}
+        self.result_ok = {'result': [0]}
 
     def test_stub(self):
-        env = {'from': None, 'group': 'Stats'}
-        result_ok = {'result': [0]}
+        """
+        Test for send_command of CCSessionStub object
+        """
+        env = self.env
+        result_ok = self.result_ok
         self.assertEqual(('status', None, env),
                          self.stub.send_command('status', None))
         self.assertEqual(result_ok, self.session.get_message("Stats", None))
         self.assertEqual(('shutdown', None, env),
                          self.stub.send_command('shutdown', None))
         self.assertEqual(result_ok, self.session.get_message("Stats", None))
+        self.assertEqual(('show', None, env),
+                         self.stub.send_command('show', None))
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
         self.assertEqual(('set', {'atest': 100.0}, env),
                          self.stub.send_command('set', {'atest': 100.0}))
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-
-    def test_boss_stub(self):
-        env = {'from': None, 'group': 'Stats'}
-        result_ok = {'result': [0]}
-        self.assertEqual(('set', {"stats_data": {"bind10.boot_time": get_datetime()}}, env),
-                         self.boss.send_command())
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-
-    def test_auth_stub(self):
-        env = {'from': None, 'group': 'Stats'}
-        result_ok = {'result': [0]}
-
-        # check command name
-        self.assertTrue( self.auth.send_command_udp()[0] == "increase" )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-        self.assertTrue( self.auth.send_command_tcp()[0] == "set" )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-
-        # check env
-        self.assertTrue( self.auth.send_command_udp()[2] == env )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-        self.assertTrue( self.auth.send_command_tcp()[2] == env )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-
-        # check type
-        self.assertTrue( type(self.auth.send_command_udp()[1]["stats_data"]["auth.queries.udp"]) == type(int()) )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-        self.assertTrue( type(self.auth.send_command_tcp()[1]["stats_data"]["auth.queries.tcp"]) == type(int()) )
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-
-        # check counter value
-        self.assertTrue(self.auth.send_command_udp()[1]["stats_data"]["auth.queries.udp"] == 1) # keeps 1
-        self.assertEqual(result_ok, self.session.get_message("Stats", None))
-        self.assertTrue(self.auth.send_command_tcp()[1]["stats_data"]["auth.queries.tcp"] == 4)
         self.assertEqual(result_ok, self.session.get_message("Stats", None))
 
     def tearDown(self):
         self.session.close()
 
-def get_timestamp():
-    """
-    get current timestamp
-    """
-    return time.time()
+    def test_boss_stub(self):
+        """
+        Test for send_command of BossModuleStub object
+        """
+        env = self.env
+        result_ok = self.result_ok
+        self.assertEqual(('set', {"stats_data":
+                                      {"bind10.boot_time": get_datetime()}
+                                  }, env), self.boss.send_command())
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
+
+    def test_auth_stub(self):
+        """
+        Test for send_command of AuthModuleStub object
+        """
+        env = self.env
+        result_ok = self.result_ok
+        self.assertEqual(
+            ('increase', {"stats_data": {"auth.queries.udp": 1}}, env),
+            self.auth.send_command_udp())
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
+        self.assertEqual(
+            ('set', {"stats_data": {"auth.queries.tcp": 1}}, env),
+            self.auth.send_command_tcp())
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
+        self.assertEqual(
+            ('set', {"stats_data": {"auth.queries.udp": 100}}, env),
+            self.auth.send_command_udp(cmd='set', cnt=100))
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
+        self.assertEqual(
+            ('increase', {"stats_data": {"auth.queries.tcp": 99}}, env),
+            self.auth.send_command_tcp(cmd='increase', cnt=99))
+        self.assertEqual(result_ok, self.session.get_message("Stats", None))
 
 def get_datetime():
     """

Modified: branches/trac191/src/bin/stats/tests/b10-stats_test.py
==============================================================================
--- branches/trac191/src/bin/stats/tests/b10-stats_test.py (original)
+++ branches/trac191/src/bin/stats/tests/b10-stats_test.py Mon Aug  9 12:49:07 2010
@@ -22,6 +22,7 @@
 import os
 import time
 import unittest
+from isc.cc.session import SessionError
 from isc.config.ccsession import ModuleCCSessionError
 from unittest_fakesession import FakeModuleCCSession
 from stats import SessionSubject, CCSessionListener
@@ -45,200 +46,475 @@
                 "stats.last_update_time": get_datetime()
                 }
 
+        try:
+            self.subject.start()
+        except ModuleCCSessionError:
+            pass
+        for i in (0, 1):
+            self.session.get_message("ConfigManager", None)
+
+    def tearDown(self):
+        self.session.close()
+
+    def test_local_func(self):
+        """
+        Test for local function
+        
+        """
+        # test for result_ok
+        self.assertEqual(type(result_ok()), dict)
+        self.assertEqual(result_ok(), {'result': [0]})
+        self.assertEqual(result_ok(1), {'result': [1]})
+        self.assertEqual(result_ok(0,'OK'), {'result': [0, 'OK']})
+        self.assertEqual(result_ok(1,'Not good'), {'result': [1, 'Not good']})
+        self.assertEqual(result_ok(None,"It's None"), {'result': [None, "It's None"]})
+        self.assertNotEqual(result_ok(), {'RESULT': [0]})
+
+        # test for get_timestamp
+        self.assertEqual(type(get_timestamp()), float)
+        self.assertTrue(abs(get_timestamp() - time.time()) < 1.0)
+
+        # test for get_datetime
+        self.assertNotEqual(type(get_timestamp()), str)
+        self.assertEqual(get_datetime(), time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()))
+
     def test_start(self):
         """
-        Test for stats
-        
-        """
-        session = self.session
-        subject = self.subject
-        listener = self.listener
+        Test for start stats module
+        
+        """
+        session = FakeModuleCCSession()
+        subject = SessionSubject(session=session, verbose=False)
+        listener = CCSessionListener(subject, verbose=False)
 
         self.assertEqual(len(subject.session.message_queue), 0)
         self.assertFalse(subject.running)
         self.assertRaises(ModuleCCSessionError, subject.start)
         self.assertTrue(subject.running)
-        self.assertEqual(len(subject.session.message_queue), 2)
+        self.assertEqual(len(session.message_queue), 2)
         self.assertEqual({"command": ["module_spec", listener.cc_session.specification._module_spec]},
-                         subject.session.get_message("ConfigManager", None))
+                         session.get_message("ConfigManager", None))
         self.assertEqual({"command": ["get_config", {"module_name": "Stats"}]},
-                         subject.session.get_message("ConfigManager", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-        session.group_sendmsg({'result': [ 0 ]}, "Stats")
-        session.group_sendmsg({'result': [ 1, "just an error" ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 2)
+                         session.get_message("ConfigManager", None))
+        self.assertEqual(len(session.message_queue), 0)
+        session.group_sendmsg(result_ok(), "Stats")
+        session.group_sendmsg(result_ok(1, "just an error"), "Stats")
+        self.assertEqual(len(session.message_queue), 2)
         self.assertTrue(subject.running)
         subject.start()
         self.assertTrue(subject.running)
-        self.assertEqual(len(subject.session.message_queue), 2)
+        self.assertEqual(len(session.message_queue), 2)
         self.assertEqual({"command": ["module_spec", listener.cc_session.specification._module_spec]},
-                         subject.session.get_message("ConfigManager", None))
+                         session.get_message("ConfigManager", None))
         self.assertEqual({"command": ["get_config", {"module_name": "Stats"}]},
-                         subject.session.get_message("ConfigManager", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
+                         session.get_message("ConfigManager", None))
+        self.assertEqual(len(session.message_queue), 0)
         subject.check()
         self.assertTrue(subject.running)
 
-    def test_commands(self):
-        """
-        Test for stats commands
-        
-        """
-        session = self.session
-        subject = self.subject
-        stats_spec = self.stats_spec[:]
-        stats_data = self.stats_data.copy()
-
-        self.assertFalse(subject.running)
-        self.assertRaises(ModuleCCSessionError, subject.start)
-        self.assertTrue(subject.running)
-        for i in (0, 1):
-            subject.session.get_message("ConfigManager", None)
+    def test_stop(self):
+        """
+        Test for stop stats module
+        
+        """
+        self.assertEqual(len(self.session.message_queue), 0)
+        self.assertTrue(self.subject.running)
+        self.subject.stop()
+        self.assertFalse(self.subject.running)
+        self.assertRaises(SessionError, self.subject.check)
+        self.assertRaises(SessionError, self.subject.start)
+
+    def test_show_command(self):
+        """
+        Test for show command
+        
+        """
+        # test show command without arg
+        self.session.group_sendmsg({"command": [ "show", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test show command with arg
+        self.session.group_sendmsg({"command": [ "show", {"stats_item_name": "stats.lname"}]}, "Stats")
+        self.assertEqual(len(self.subject.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.subject.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'stats.lname': self.stats_data['stats.lname']}),
+                         result_data)
+        self.assertEqual(len(self.subject.session.message_queue), 0)
+
+        # test show command with arg which has wrong name
+        self.session.group_sendmsg({"command": [ "show", {"stats_item_name": "stats.dummy"}]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_set_command(self):
+        """
+        Test for set command
+        
+        """
+        # test set command
+        self.stats_data['auth.queries.udp'] = 54321
+        self.session.group_sendmsg({ "command": [
+                                      "set", {
+                                          'stats_data': {'auth.queries.udp': 54321 }
+                                      } ] },
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
 
         # test show command
-        session.group_sendmsg({"command": [ "show", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        self.assertEqual({ "result": [ 0, stats_data ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command with args
-        session.group_sendmsg({"command": [ "show", {"stats_item_name": "stats.lname"}]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        self.assertEqual({ "result": [ 0, {'stats.lname': stats_data['stats.lname']} ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command with args which has no valid key name
-        session.group_sendmsg({"command": [ "show", {"stats_item_name": "stats.dummy"}]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        self.assertEqual({ "result": [ 0, stats_data ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
+        self.session.group_sendmsg({"command": [ "show", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.stats_data['report_time'] = get_datetime()
+        self.stats_data['stats.last_update_time'] = get_datetime()
+        self.stats_data['stats.timestamp'] = float(int(get_timestamp()))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test set command 2
+        self.stats_data['auth.queries.udp'] = 0
+        self.session.group_sendmsg({ "command": [ "set", {'stats_data': {'auth.queries.udp': 0}} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test show command 2
+        self.session.group_sendmsg({"command": [ "show", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.stats_data['report_time'] = get_datetime()
+        self.stats_data['stats.last_update_time'] = get_datetime()
+        self.stats_data['stats.timestamp'] = float(int(get_timestamp()))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_increase_command(self):
+        """
+        Test for increase command
+        
+        """
+        # test increase command
+        self.stats_data['auth.queries.udp'] = self.stats_data['auth.queries.udp'] + int(1)
+        self.session.group_sendmsg({"command": [
+                                      "increase", {'stats_data': {'auth.queries.udp': int(1) }} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test show command
+        self.session.group_sendmsg({"command": [ "show", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.stats_data['report_time'] = get_datetime()
+        self.stats_data['stats.last_update_time'] = get_datetime()
+        self.stats_data['stats.timestamp'] = float(int(get_timestamp()))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_remove_command(self):
+        """
+        Test for remove command
+        
+        """
+        self.session.group_sendmsg({"command":
+                                   [ "remove", {"stats_item_name": 'bind10.boot_time' }]},
+                              "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+        self.assertEqual(self.stats_data.pop('bind10.boot_time'), "1970-01-01T00:00:00Z")
+        self.assertFalse('bind10.boot_time' in self.stats_data)
+
+        # test show command with arg
+        self.session.group_sendmsg({"command":
+                                    [ "show", {"stats_item_name": 'bind10.boot_time'}]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertFalse('bind10.boot_time' in result_data['result'][1])
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_reset_command(self):
+        """
+        Test for reset command
+        
+        """
+        self.session.group_sendmsg({"command": [ "reset" ] }, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test show command
+        self.session.group_sendmsg({"command": [ "show" ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_status_command(self):
+        """
+        Test for status command
+        
+        """
+        self.session.group_sendmsg({"command": [ "status" ] }, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(0, "I'm alive."),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_unknown_command(self):
+        """
+        Test for unknown command
+        
+        """
+        self.session.group_sendmsg({"command": [ "hoge", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(1, "Unknown command: 'hoge'"),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+    def test_shutdown_command(self):
+        """
+        Test for shutdown command
+        
+        """
+        self.session.group_sendmsg({"command": [ "shutdown", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.assertTrue(self.subject.running)
+        self.subject.check()
+        self.assertFalse(self.subject.running)
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+
+    def test_some_commands(self):
+        """
+        Test for some commands in a row
+        
+        """
         # test set command
-        stats_data['atest'] = float(1.0)
-        session.group_sendmsg({"command": [ "set", {'stats_data': {'atest': stats_data['atest']}}]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command
-        session.group_sendmsg({"command": [ "show", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        stats_data['report_time'] = get_datetime()
-        stats_data['stats.last_update_time'] = get_datetime()
-        stats_data['stats.timestamp'] = float(int(get_timestamp()))
-        self.assertEqual(result_ok(0, stats_data), result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
+        self.stats_data['bind10.boot_time'] = '2010-08-02T14:47:56Z'
+        self.assertEqual(self.stats_data['bind10.boot_time'], '2010-08-02T14:47:56Z')
+        self.session.group_sendmsg({ "command": [
+                                      "set", {
+                                          'stats_data': {'bind10.boot_time': '2010-08-02T14:47:56Z' }
+                                      }]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # check its value
+        self.session.group_sendmsg({ "command": [
+                                      "show", {
+                        	        'stats_item_name': 'bind10.boot_time'
+				      }
+                                     ]
+                                   }, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'bind10.boot_time': '2010-08-02T14:47:56Z'}),
+                         result_data)
+        self.assertEqual(result_ok(0, {'bind10.boot_time': self.stats_data['bind10.boot_time']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test set command 2nd
+        self.stats_data['auth.queries.udp'] = 98765
+        self.assertEqual(self.stats_data['auth.queries.udp'], 98765)
+        self.session.group_sendmsg({ "command": [
+                                      "set", {
+                                          'stats_data': {
+                                            'auth.queries.udp':
+                                              self.stats_data['auth.queries.udp']
+                                            }
+                                        } 
+                                     ]
+                                   }, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # check its value
+        self.session.group_sendmsg({"command": [
+				      "show", {'stats_item_name': 'auth.queries.udp'}
+                                    ] }, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': 98765}),
+                         result_data)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': self.stats_data['auth.queries.udp']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
 
         # test increase command
-        stats_data['atest'] = stats_data['atest'] + float(0.1)
-        session.group_sendmsg({"command": [ "increase", {'stats_data': {'atest': float(0.1) }} ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command
-        session.group_sendmsg({"command": [ "show", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        stats_data['report_time'] = get_datetime()
-        stats_data['stats.last_update_time'] = get_datetime()
-        stats_data['stats.timestamp'] = float(int(get_timestamp()))
-        self.assertEqual({ "result": [ 0, stats_data ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test remove command with args
-        stats_data.pop('atest')
-        session.group_sendmsg({"command": [ "remove", {"stats_item_name": 'atest' }]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test remove command with args which has no valid key name
-        session.group_sendmsg({"command": [ "remove", {"stats_item_name": "stats.dummy"}]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(1,"''"),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command
-        session.group_sendmsg({"command": [ "show", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        self.assertEqual({ "result": [ 0, stats_data ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test reset command
-        stats_data = self.stats_data.copy()
-        session.group_sendmsg({"command": [ "reset", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test show command
-        session.group_sendmsg({"command": [ "show", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        result_data = subject.session.get_message("Stats", None)
-        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
-        stats_data['report_time'] = get_datetime()
-        stats_data['stats.last_update_time'] = get_datetime()
-        stats_data['stats.timestamp'] = float(int(get_timestamp()))
-        stats_data['stats.start_time'] = get_datetime()
-        self.assertEqual({ "result": [ 0, stats_data ]}, result_data)
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test status command
-        session.group_sendmsg({"command": [ "status", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(0, "I'm alive."),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test unknown command
-        session.group_sendmsg({"command": [ "hoge", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        subject.check()
-        self.assertEqual(result_ok(1, "Unknown command: 'hoge'"),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-        # test shutdown command
-        session.group_sendmsg({"command": [ "shutdown", None ]}, "Stats")
-        self.assertEqual(len(subject.session.message_queue), 1)
-        self.assertTrue(subject.running)
-        subject.check()
-        self.assertFalse(subject.running)
-        self.assertEqual(result_ok(),
-                         subject.session.get_message("Stats", None))
-        self.assertEqual(len(subject.session.message_queue), 0)
-
-    def tearDown(self):
-        self.session.close()
+        self.assertEqual(self.stats_data['auth.queries.udp'], 98765)
+        self.stats_data['auth.queries.udp'] = 98766
+        self.assertEqual(self.stats_data['auth.queries.udp'], 98766)
+        self.session.group_sendmsg({"command": [
+                                      "increase",
+                                        {'stats_data': {'auth.queries.udp': 1 }} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # check its value
+        self.session.group_sendmsg({"command": [ "show", {'stats_item_name' : 'auth.queries.udp'} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        result_data = result_data['result'][1]
+        self.assertEqual(result_data['auth.queries.udp'], 98766)
+        self.assertEqual(self.stats_data['auth.queries.udp'], result_data['auth.queries.udp'])
+        self.assertEqual(len(self.session.message_queue), 0)
+        self.session.group_sendmsg({"command": [ "show", {'stats_item_name': 'auth.queries.udp'} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': 98766}),
+                         result_data)
+        self.assertEqual(result_ok(0,
+                                   {'auth.queries.udp': self.stats_data['auth.queries.udp']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test set command 3
+        self.stats_data['auth.queries.tcp'] = 4321
+        self.session.group_sendmsg({"command": [
+                                      "set",
+                                      {'stats_data': {'auth.queries.tcp': 4321 }} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # check value
+        self.session.group_sendmsg({"command": [ "show", {'stats_item_name': 'auth.queries.tcp'} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'auth.queries.tcp': 4321}),
+                         result_data)
+        self.assertEqual(result_ok(0, {'auth.queries.tcp': self.stats_data['auth.queries.tcp']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        self.session.group_sendmsg({"command": [ "show", {'stats_item_name': 'auth.queries.udp'} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': 98766}),
+                         result_data)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': self.stats_data['auth.queries.udp']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test increase command 2
+        self.assertEqual(self.stats_data['auth.queries.udp'], 98766)
+        self.stats_data['auth.queries.udp'] = 98776
+        self.assertEqual(self.stats_data['auth.queries.udp'], 98776)
+        self.session.group_sendmsg({"command": [
+                                      "increase", {'stats_data': {'auth.queries.udp': 10 }} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # check value
+        self.session.group_sendmsg({"command": [ "show", {'stats_item_name': 'auth.queries.udp'} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': 98776}),
+                         result_data)
+        self.assertEqual(result_ok(0, {'auth.queries.udp': self.stats_data['auth.queries.udp']}),
+                         result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test set command 4
+        self.stats_data['auth.queries.tcp'] = 67890
+        self.session.group_sendmsg({"command": [
+                                      "set", {'stats_data': {'auth.queries.tcp': 67890 }} ]},
+                                   "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        self.assertEqual(result_ok(),
+                         self.session.get_message("Stats", None))
+        self.assertEqual(len(self.session.message_queue), 0)
+
+        # test show command for all values
+        self.session.group_sendmsg({"command": [ "show", None ]}, "Stats")
+        self.assertEqual(len(self.session.message_queue), 1)
+        self.subject.check()
+        result_data = self.session.get_message("Stats", None)
+        # ignore under 0.9 seconds
+        result_data['result'][1]['stats.timestamp'] = float(int(result_data['result'][1]['stats.timestamp']))
+        self.stats_data['report_time'] = get_datetime()
+        self.stats_data['stats.last_update_time'] = get_datetime()
+        self.stats_data['stats.timestamp'] = float(int(get_timestamp()))
+        self.assertEqual(result_ok(0, self.stats_data), result_data)
+        self.assertEqual(len(self.session.message_queue), 0)
 
 def result_ok(*args):
     if args:

Modified: branches/trac191/src/bin/stats/tests/unittest_fakesession.py
==============================================================================
--- branches/trac191/src/bin/stats/tests/unittest_fakesession.py (original)
+++ branches/trac191/src/bin/stats/tests/unittest_fakesession.py Mon Aug  9 12:49:07 2010
@@ -2,6 +2,7 @@
 __version__ = "$Revision$"
 
 import os
+import select
 from isc.cc.session import SessionError
 
 #
@@ -13,7 +14,7 @@
         # each entry is of the form [ channel, instance, message ]
         self.message_queue = []
         # set socket dummy data
-        cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 0; done'
+        cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; done'
         self._socket = os.popen(cmd, 'r')
         # set lname
         self.lname='123abc at xxxx'
@@ -64,5 +65,12 @@
     def close(self):
         # need to pass along somehow that this function has been called,
         if not self._socket.closed:
-            buf = self._socket.readlines()
-        self._socket.close()
+            while True:
+                r, w, e = select.select([self._socket], [], [], None)
+                if (r, w, e) == ([self._socket], [], []):
+                    line = self._socket.readline()
+                    if not line:
+                        break
+                continue
+                raise Exception('Unexpected return values from select():', r, w, e)
+            self._socket.close()




More information about the bind10-changes mailing list