Browse Source

Move unittest code to /bin/bindctl/unittest.

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/parkinglot@609 e5f2f494-b856-4b98-b285-d166d9295462
Likun Zhang 15 years ago
parent
commit
d8ecaf4f05
2 changed files with 217 additions and 0 deletions
  1. 12 0
      src/bin/bindctl/unittest/bindctl_test.in
  2. 205 0
      src/bin/bindctl/unittest/bindctl_test.py

+ 12 - 0
src/bin/bindctl/unittest/bindctl_test.in

@@ -0,0 +1,12 @@
+#! /bin/sh
+
+PYTHON_EXEC=${PYTHON_EXEC:-@PYTHON@}
+export PYTHON_EXEC
+
+BINDCTL_TEST_PATH=@abs_top_srcdir@/src/bin/bindctl/unittest
+PYTHONPATH=@abs_top_srcdir@/src/lib/cc/python:@abs_top_srcdir@/src/bin/bindctl
+export PYTHONPATH
+
+cd ${BINDCTL_TEST_PATH}
+exec ${PYTHON_EXEC} -O bindctl_test.py $*
+

+ 205 - 0
src/bin/bindctl/unittest/bindctl_test.py

@@ -0,0 +1,205 @@
+# Copyright (C) 2009  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+import unittest
+import cmdparse
+import bindcmd
+from moduleinfo import *
+from exception import *    
+try:
+    from collections import OrderedDict
+except ImportError:
+    from mycollections import OrderedDict
+
+class TestCmdLex(unittest.TestCase):
+    
+    def my_assert_raise(self, exception_type, cmd_line):
+        self.assertRaises(exception_type, cmdparse.BindCmdParse, cmd_line)
+
+
+    def testCommandWithoutParameter(self):
+        cmd = cmdparse.BindCmdParse("zone add")
+        assert cmd.module == "zone"
+        assert cmd.command == "add"
+        self.assertEqual(len(cmd.params), 0)
+        
+    
+    def testCommandWithParameters(self):
+        lines = {"zone add zone_name = cnnic.cn, file = cnnic.cn.file master=1.1.1.1",
+                 "zone add zone_name = \"cnnic.cn\", file ='cnnic.cn.file' master=1.1.1.1  ",
+                 "zone add zone_name = 'cnnic.cn\", file ='cnnic.cn.file' master=1.1.1.1, " }
+        
+        for cmd_line in lines:
+            cmd = cmdparse.BindCmdParse(cmd_line)
+            assert cmd.module == "zone"
+            assert cmd.command == "add"
+            assert cmd.params["zone_name"] == "cnnic.cn"
+            assert cmd.params["file"] == "cnnic.cn.file"
+            assert cmd.params["master"] == '1.1.1.1'
+            
+            
+    def testCommandWithListParam(self):
+            cmd = cmdparse.BindCmdParse("zone set zone_name='cnnic.cn', master='1.1.1.1, 2.2.2.2'")
+            assert cmd.params["master"] == '1.1.1.1, 2.2.2.2'            
+        
+        
+    def testCommandWithHelpParam(self):
+        cmd = cmdparse.BindCmdParse("zone add help")
+        assert cmd.params["help"] == "help"
+        
+        cmd = cmdparse.BindCmdParse("zone add help *&)&)*&&$#$^%")
+        assert cmd.params["help"] == "help"
+        self.assertEqual(len(cmd.params), 1)
+        
+
+    def testCmdModuleNameFormatError(self):
+        self.my_assert_raise(CmdModuleNameFormatError, "zone=good")
+        self.my_assert_raise(CmdModuleNameFormatError, "zo/ne")        
+        self.my_assert_raise(CmdModuleNameFormatError, "")        
+        self.my_assert_raise(CmdModuleNameFormatError, "=zone")
+        self.my_assert_raise(CmdModuleNameFormatError, "zone,")        
+        
+        
+    def testCmdMissCommandNameFormatError(self):
+        self.my_assert_raise(CmdMissCommandNameFormatError, "zone")
+        self.my_assert_raise(CmdMissCommandNameFormatError, "zone ")
+        self.my_assert_raise(CmdMissCommandNameFormatError, "help ")
+        
+             
+    def testCmdCommandNameFormatError(self):
+        self.my_assert_raise(CmdCommandNameFormatError, "zone =d")
+        self.my_assert_raise(CmdCommandNameFormatError, "zone z=d")
+        self.my_assert_raise(CmdCommandNameFormatError, "zone z-d ")
+        self.my_assert_raise(CmdCommandNameFormatError, "zone zdd/")
+        self.my_assert_raise(CmdCommandNameFormatError, "zone zdd/ \"")
+        
+
+    def testCmdParamFormatError(self): 
+        self.my_assert_raise(CmdParamFormatError, "zone load load")
+        self.my_assert_raise(CmdParamFormatError, "zone load load=")
+        self.my_assert_raise(CmdParamFormatError, "zone load load==dd")
+        self.my_assert_raise(CmdParamFormatError, "zone load , zone_name=dd zone_file=d" )
+        self.my_assert_raise(CmdParamFormatError, "zone load zone_name=dd zone_file" )
+        self.my_assert_raise(CmdParamFormatError, "zone zdd \"")
+        
+
+class TestCmdSyntax(unittest.TestCase):
+    
+    def _create_bindcmd(self):
+        """Create one bindcmd"""
+        
+        tool = bindcmd.BindCmdInterpreter()        
+        zone_file_param = ParamInfo(name = "zone_file")
+        load_cmd = CommandInfo(name = "load")
+        load_cmd.add_param(zone_file_param)
+        
+        param_master = ParamInfo(name = "master", optional = True)                                 
+        param_allow_update = ParamInfo(name = "allow_update", optional = True)                                           
+        set_cmd = CommandInfo(name = "set")
+        set_cmd.add_param(param_master)
+        set_cmd.add_param(param_allow_update)
+        
+        reload_all_cmd = CommandInfo(name = "reload_all", need_inst_param = False)        
+        
+        zone_module = ModuleInfo(name = "zone", inst_name = "zone_name")                             
+        zone_module.add_command(load_cmd)
+        zone_module.add_command(set_cmd)
+        zone_module.add_command(reload_all_cmd)
+        
+        tool.add_module_info(zone_module)
+        return tool
+        
+        
+    def setUp(self):
+        self.bindcmd = self._create_bindcmd()
+        
+        
+    def no_assert_raise(self, cmd_line):
+        cmd = cmdparse.BindCmdParse(cmd_line)
+        self.bindcmd.validate_cmd(cmd) 
+        
+        
+    def my_assert_raise(self, exception_type, cmd_line):
+        cmd = cmdparse.BindCmdParse(cmd_line)
+        self.assertRaises(exception_type, self.bindcmd.validate_cmd, cmd)  
+        
+        
+    def testValidateSuccess(self):
+        self.no_assert_raise("zone load zone_file='cn' zone_name='cn'")
+        self.no_assert_raise("zone load zone_file='cn', zone_name='cn', ")
+        self.no_assert_raise("zone help ")
+        self.no_assert_raise("zone load help ")
+        self.no_assert_raise("zone help help='dd' ")
+        self.no_assert_raise("zone set allow_update='1.1.1.1' zone_name='cn'")
+        self.no_assert_raise("zone set zone_name='cn'")
+        self.no_assert_raise("zone reload_all")        
+        
+    
+    def testCmdUnknownModuleSyntaxError(self):
+        self.my_assert_raise(CmdUnknownModuleSyntaxError, "zoned d")
+        self.my_assert_raise(CmdUnknownModuleSyntaxError, "dd dd  ")
+        
+              
+    def testCmdUnknownCmdSyntaxError(self):
+        self.my_assert_raise(CmdUnknownCmdSyntaxError, "zone dd")
+        
+    def testCmdMissParamSyntaxError(self):
+        self.my_assert_raise(CmdMissParamSyntaxError, "zone load zone_file='cn'")
+        self.my_assert_raise(CmdMissParamSyntaxError, "zone load zone_name='cn'")
+        self.my_assert_raise(CmdMissParamSyntaxError, "zone set allow_update='1.1.1.1'")
+        self.my_assert_raise(CmdMissParamSyntaxError, "zone set ")
+        
+    def testCmdUnknownParamSyntaxError(self):
+        self.my_assert_raise(CmdUnknownParamSyntaxError, "zone load zone_d='cn'")
+        self.my_assert_raise(CmdUnknownParamSyntaxError, "zone reload_all zone_name = 'cn'")  
+        
+    
+class TestNameSequence(unittest.TestCase):
+    """
+    Test if the module/command/parameters is saved in the order creation
+    """
+    
+    def _create_bindcmd(self):
+        """Create one bindcmd"""     
+        
+        self._cmd = CommandInfo(name = "load")
+        self.module = ModuleInfo(name = "zone")
+        self.tool = bindcmd.BindCmdInterpreter()        
+        for random_str in self.random_names:
+            self._cmd.add_param(ParamInfo(name = random_str))
+            self.module.add_command(CommandInfo(name = random_str))
+            self.tool.add_module_info(ModuleInfo(name = random_str))  
+        
+    def setUp(self):
+        self.random_names = ['1erdfeDDWsd', '3fe', '2009erd', 'Fe231', 'tere142', 'rei8WD']
+        self._create_bindcmd()
+        
+    def testSequence(self):        
+        param_names = self._cmd.get_param_names()
+        cmd_names = self.module.get_command_names()
+        module_names = self.tool.get_module_names()
+        
+        i = 0
+        while i < len(self.random_names):
+            assert self.random_names[i] == param_names[i+1]
+            assert self.random_names[i] == cmd_names[i+1]
+            assert self.random_names[i] == module_names[i+1]
+            i = i + 1
+        
+    
+if __name__== "__main__":
+    unittest.main()
+