[PATCH] Added firewall, partition, repo tests; Made minor changes to firewall, partition, repo commands.

Martin Gracik mgracik at redhat.com
Tue Feb 10 15:39:38 UTC 2009


Added checking of unexpected arguments, and raising a KickstartValueError, if they are given.
Also edited some output strings formatting, to ensure there are no double spaces, if some of the values are missing.
---
 pykickstart/commands/firewall.py  |   29 ++++++---
 pykickstart/commands/partition.py |    2 +-
 pykickstart/commands/repo.py      |    6 ++-
 tests/commands/firewall.py        |   98 +++++++++++++++++++++++++++++
 tests/commands/partition.py       |  124 +++++++++++++++++++++++++++++++++++++
 tests/commands/repo.py            |   88 ++++++++++++++++++++++++++
 6 files changed, 335 insertions(+), 12 deletions(-)
 create mode 100644 tests/commands/firewall.py
 create mode 100644 tests/commands/partition.py
 create mode 100644 tests/commands/repo.py

diff --git a/pykickstart/commands/firewall.py b/pykickstart/commands/firewall.py
index 8a968c6..9a26a8a 100644
--- a/pykickstart/commands/firewall.py
+++ b/pykickstart/commands/firewall.py
@@ -20,8 +20,12 @@
 import string
 
 from pykickstart.base import *
+from pykickstart.errors import *
 from pykickstart.options import *
 
+import gettext
+_ = lambda x: gettext.ldgettext("pykickstart", x)
+
 class FC3_Firewall(KickstartCommand):
     removedKeywords = KickstartCommand.removedKeywords
     removedAttrs = KickstartCommand.removedAttrs
@@ -38,7 +42,7 @@ class FC3_Firewall(KickstartCommand):
         extra = []
         filteredPorts = []
 
-        retval = BaseData.__str__(self)
+        retval = KickstartCommand.__str__(self)
 
         if self.enabled is None:
             return retval
@@ -49,35 +53,35 @@ class FC3_Firewall(KickstartCommand):
             # out into their own list leaving what we expect.
             for port in self.ports:
                 if port == "ssh":
-                    extra.append("--ssh")
+                    extra.append(" --ssh")
                 elif port == "telnet":
-                    extra.append("--telnet")
+                    extra.append(" --telnet")
                 elif port == "smtp":
-                    extra.append("--smtp")
+                    extra.append(" --smtp")
                 elif port == "http":
-                    extra.append("--http")
+                    extra.append(" --http")
                 elif port == "ftp":
-                    extra.append("--ftp")
+                    extra.append(" --ftp")
                 else:
                     filteredPorts.append(port)
 
             # All the port:proto strings go into a comma-separated list.
             portstr = string.join (filteredPorts, ",")
             if len(portstr) > 0:
-                portstr = "--port=" + portstr
+                portstr = " --port=" + portstr
             else:
                 portstr = ""
 
-            extrastr = string.join (extra, " ")
+            extrastr = string.join (extra, "")
 
             truststr = string.join (self.trusts, ",")
             if len(truststr) > 0:
-                truststr = "--trust=" + truststr
+                truststr = " --trust=" + truststr
 
             # The output port list consists only of port:proto for
             # everything that we don't recognize, and special options for
             # those that we do.
-            retval += "# Firewall configuration\nfirewall --enabled %s %s %s\n" % (extrastr, portstr, truststr)
+            retval += "# Firewall configuration\nfirewall --enabled%s%s%s\n" % (extrastr, portstr, truststr)
         else:
             retval += "# Firewall configuration\nfirewall --disabled\n"
 
@@ -110,6 +114,11 @@ class FC3_Firewall(KickstartCommand):
 
     def parse(self, args):
         (opts, extra) = self.op.parse_args(args=args)
+        
+        if len(extra) != 0:
+            mapping = {"command": "firewall", "options": extra}
+            raise KickstartValueError, formatErrorMsg(self.lineno, msg=_("Unexpected arguments to %(command)s command: %(options)s") % mapping)
+            
         self._setToSelf(self.op, opts)
         return self
 
diff --git a/pykickstart/commands/partition.py b/pykickstart/commands/partition.py
index 1a162fe..434f210 100644
--- a/pykickstart/commands/partition.py
+++ b/pykickstart/commands/partition.py
@@ -79,7 +79,7 @@ class FC3_PartData(BaseData):
 
     def __str__(self):
         retval = BaseData.__str__(self)
-        retval += "part %s %s\n" % (self.mountpoint, self._getArgsAsStr())
+        retval += "part %s%s\n" % (self.mountpoint, self._getArgsAsStr())
         return retval
 
 class FC4_PartData(FC3_PartData):
diff --git a/pykickstart/commands/repo.py b/pykickstart/commands/repo.py
index 071838c..4eefdc2 100644
--- a/pykickstart/commands/repo.py
+++ b/pykickstart/commands/repo.py
@@ -86,7 +86,7 @@ class F11_RepoData(F8_RepoData):
         retval = F8_RepoData._getArgsAsStr(self)
 
         if self.ignoregroups:
-            retval += " --ignoregroups true"
+            retval += " --ignoregroups=true"
         return retval
 
 class FC6_Repo(KickstartCommand):
@@ -115,6 +115,10 @@ class FC6_Repo(KickstartCommand):
 
     def parse(self, args):
         (opts, extra) = self.op.parse_args(args=args)
+        
+        if len(extra) != 0:
+            mapping = {"command": "repo", "options": extra}
+            raise KickstartValueError, formatErrorMsg(self.lineno, msg=_("Unexpected arguments to %(command)s command: %(options)s") % mapping)
 
         # This is lame, but I can't think of a better way to make sure only
         # one of these two is specified.
diff --git a/tests/commands/firewall.py b/tests/commands/firewall.py
new file mode 100644
index 0000000..2da14e8
--- /dev/null
+++ b/tests/commands/firewall.py
@@ -0,0 +1,98 @@
+#
+# Martin Gracik <mgracik at redhat.com>
+#
+# Copyright 2009 Red Hat, Inc.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the GNU
+# General Public License v.2.  This program is distributed in the hope that it
+# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
+# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  Any Red Hat
+# trademarks that are incorporated in the source code or documentation are not
+# subject to the GNU General Public License and may only be used or replicated
+# with the express permission of Red Hat, Inc.
+#
+
+import unittest
+from tests.baseclass import *
+
+class FC3_TestCase(CommandTest):
+    def runTest(self):
+        # pass
+        # enable firewall
+        self.assert_parse("firewall --enabled --trust=eth0 --ssh --port=imap:tcp",
+                          "firewall --enabled --port=22:tcp,imap:tcp --trust=eth0\n")
+        self.assert_parse("firewall --enable --trust=eth0,eth1 --ssh --telnet --http --smtp --ftp --port=1234:udp"
+                          "firewall --enabled --port=22:tcp,23:tcp,80:tcp,443:tcp,25:tcp,21:tcp,1234:udp --trust=eth0,eth1\n")
+        self.assert_parse("firewall --enabled --ssh --ftp", "firewall --enabled --port=22:tcp,21:tcp\n")
+        self.assert_parse("firewall --enable --port=1234:udp,4321:tcp", "firewall --enabled --port=1234:udp,4321:tcp\n")
+        
+        # disable firewall                  
+        self.assert_parse("firewall --disabled", "firewall --disabled\n")
+        self.assert_parse("firewall --disable", "firewall --disabled\n")
+        
+        # enable by default
+        self.assert_parse("firewall --trust=eth0", "firewall --enabled --trust=eth0\n")
+        self.assert_parse("firewall", "firewall --enabled\n")
+        
+        # deprecated
+        self.assert_deprecated("firewall", "--high")
+        self.assert_deprecated("firewall", "--medium")
+        
+        # fail
+        # unknown option
+        self.assert_parse_error("firewall --bad-flag", KickstartParseError)
+        # unexpected argument
+        self.assert_parse_error("firewall arg", KickstartValueError)
+        
+        
+class F9_TestCase(FC3_TestCase):
+    def runTest(self):
+        # run FC3 test case
+        FC3_TestCase.runTest(self)
+        
+        # removed
+        self.assert_removed("firewall", "--high")
+        self.assert_removed("firewall", "--medium")
+        
+        
+class F10_TestCase(F9_TestCase):
+    def runTest(self):
+        # run F9 test case
+        #F9_TestCase.runTest(self)
+        
+        # pass
+        # enable firewall
+        self.assert_parse("firewall --enabled --trust=eth0 --ssh --port=imap:tcp",
+                          "firewall --enabled --port=imap:tcp --trust=eth0 --service=ssh\n")
+        self.assert_parse("firewall --enable --trust=eth0,eth1 --ssh --http --smtp --ftp --port=1234:udp"
+                          "firewall --enabled --port=1234:udp --trust=eth0,eth1 --service=ssh,http,smtp,ftp\n")
+        self.assert_parse("firewall --enabled --ssh --ftp", "firewall --enabled --service=ssh,ftp\n")
+        self.assert_parse("firewall --enable --port=1234:udp,4321:tcp", "firewall --enabled --port=1234:udp,4321:tcp\n")
+        
+        # disable firewall                  
+        self.assert_parse("firewall --disabled", "firewall --disabled\n")
+        self.assert_parse("firewall --disable", "firewall --disabled\n")
+        
+        # enable by default
+        self.assert_parse("firewall --trust=eth0", "firewall --enabled --trust=eth0\n")
+        self.assert_parse("firewall", "firewall --enabled\n")
+                          
+        # deprecated
+        self.assert_deprecated("firewall", "--telnet")
+        
+        # fail
+        # unknown option
+        self.assert_parse_error("firewall --bad-flag", KickstartParseError)
+        # unexpected argument
+        self.assert_parse_error("firewall arg", KickstartValueError)
+        
+        
+if __name__ == "__main__":
+    unittest.main()
+    
diff --git a/tests/commands/partition.py b/tests/commands/partition.py
new file mode 100644
index 0000000..a0151dd
--- /dev/null
+++ b/tests/commands/partition.py
@@ -0,0 +1,124 @@
+#
+# Martin Gracik <mgracik at redhat.com>
+#
+# Copyright 2009 Red Hat, Inc.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the GNU
+# General Public License v.2.  This program is distributed in the hope that it
+# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
+# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  Any Red Hat
+# trademarks that are incorporated in the source code or documentation are not
+# subject to the GNU General Public License and may only be used or replicated
+# with the express permission of Red Hat, Inc.
+#
+
+import unittest
+from tests.baseclass import *
+
+class FC3_TestCase(CommandTest):
+    def runTest(self, bytes_per_inode=False):
+        bpi = ""
+        if bytes_per_inode:
+            bpi = " --bytes-per-inode=4096"
+            
+        # pass
+        self.assert_parse("part /home", "part /home%s\n" % bpi)
+        self.assert_parse("partition raid.1 --active --asprimary --start=0 --end=10 --fstype=ext3 --noformat",
+                          "part raid.1 --active --asprimary --end=10 --fstype=\"ext3\" --noformat%s\n" % bpi)
+        self.assert_parse("part pv.1 --ondisk=sda --onpart=sda1 --recommended",
+                          "part pv.1 --ondisk=sda --onpart=sda1 --recommended%s\n" % bpi)
+        self.assert_parse("part pv.1 --ondrive=sda --usepart=sda1 --recommended",
+                          "part pv.1 --ondisk=sda --onpart=sda1 --recommended%s\n" % bpi)
+        self.assert_parse("part / --onbiosdisk=hda --size=100", "part / --onbiosdisk=hda --size=100%s\n" % bpi)
+        self.assert_parse("part swap --grow --maxsize=100", "part swap --grow --maxsize=100%s\n" % bpi)
+        
+        # does not remove the /dev/ part
+        self.assert_parse("part /usr --ondisk=/dev/sda --recommended --noformat --active",
+                          "part /usr --active --noformat --ondisk=/dev/sda --recommended%s\n" % bpi)
+                          
+        # fail
+        # missing mountpoint
+        self.assert_parse_error("part", KickstartValueError)
+        self.assert_parse_error("part --ondisk=sda --size=100", KickstartValueError)
+        
+        for opt in ("start", "end", "size", "maxsize"):
+            # integer argument required
+            self.assert_parse_error("part / --%s=string" % opt, KickstartParseError)
+            # value required
+            self.assert_parse_error("part / --%s" % opt, KickstartParseError)
+            
+        for opt in ("fstype", "onbiosdisk", "ondisk", "ondrive", "onpart", "usepart"):
+            # value required
+            self.assert_parse_error("part / --%s" % opt, KickstartParseError)
+            
+        # only one argument allowed
+        self.assert_parse_error("part / /home /usr", KickstartValueError)
+        # unknown option
+        self.assert_parse_error("part /home --unknown=value", KickstartParseError)
+
+        
+        
+class FC4_TestCase(FC3_TestCase):
+    def runTest(self):
+        # run FC3 test case
+        FC3_TestCase.runTest(self, bytes_per_inode=True)
+        
+        # pass
+        self.assert_parse("part /home --bytes-per-inode=2048 --fsoptions=blah --label=home",
+                          "part /home --bytes-per-inode=2048 --fsoptions=\"blah\" --label=home\n")
+                          
+        # fail
+        # --bytes-per-inode requires int argument
+        self.assert_parse_error("part /home --bytes-per-inode=string", KickstartParseError)
+        self.assert_parse_error("part /home --bytes-per-inode", KickstartParseError)
+        # missing required arguments
+        for opt in ("fsoptions", "label"):
+            self.assert_parse_error("part /home --%s" % opt, KickstartParseError)
+        
+        
+        
+class RHEL5_TestCase(FC4_TestCase):
+    def runTest(self):
+        # run FC4 test case
+        FC4_TestCase.runTest(self)
+        
+        # pass
+        self.assert_parse("part / --encrypted --passphrase=blahblah",
+                          "part / --bytes-per-inode=4096 --encrypted --passphrase=\"blahblah\"\n")
+                          
+        # fail
+        # missing required --passphrase argument
+        self.assert_parse_error("part / --encrypted --passphrase", KickstartParseError)
+
+        
+        
+class F9_TestCase(FC3_TestCase):
+    def runTest(self):
+        # run FC3 test case
+        FC3_TestCase.runTest(self, bytes_per_inode=False)
+        
+        # pass
+        self.assert_parse("part / --encrypted --passphrase=blahblah",
+                          "part / --encrypted --passphrase=\"blahblah\"\n")
+        self.assert_parse("part /home --fsprofile=blah", "part /home --fsprofile=\"blah\"\n")
+        
+        # deprecated
+        self.assert_deprecated("part", "--bytes-per-inode")
+        
+        # fail
+        # missing required --passphrase argument
+        self.assert_parse_error("part / --encrypted --passphrase", KickstartParseError)
+        # missing required --fsprofile argument
+        self.assert_parse_error("part / --fsprofile", KickstartParseError)
+        
+        
+        
+if __name__ == "__main__":
+    unittest.main()
+    
diff --git a/tests/commands/repo.py b/tests/commands/repo.py
new file mode 100644
index 0000000..fbaf589
--- /dev/null
+++ b/tests/commands/repo.py
@@ -0,0 +1,88 @@
+#
+# Martin Gracik <mgracik at redhat.com>
+#
+# Copyright 2009 Red Hat, Inc.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the GNU
+# General Public License v.2.  This program is distributed in the hope that it
+# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
+# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  Any Red Hat
+# trademarks that are incorporated in the source code or documentation are not
+# subject to the GNU General Public License and may only be used or replicated
+# with the express permission of Red Hat, Inc.
+#
+
+import unittest
+from tests.baseclass import *
+
+class FC6_TestCase(CommandTest):
+    def runTest(self):
+        # pass
+        self.assert_parse("repo --name=blah --baseurl=http://www.domain.com",
+                          "repo --name=blah --baseurl=http://www.domain.com\n")
+        self.assert_parse("repo --name=blah --mirrorlist=http://www.domain.com",
+                          "repo --name=blah --mirrorlist=http://www.domain.com\n")
+                          
+        # fail
+        # missing required option --name
+        self.assert_parse_error("repo --baseurl=www.domain.com", KickstartValueError)
+        self.assert_parse_error("repo --name --baseurl=www.domain.com", KickstartParseError)
+        # missing one of required options --baseurl or --mirrorlist
+        self.assert_parse_error("repo --name=blah", KickstartValueError)
+        self.assert_parse_error("repo --name=blah --baseurl", KickstartParseError)
+        self.assert_parse_error("repo --name=blah --mirrorlist", KickstartParseError)
+        # only one of --baseurl or --mirrorlist must be specified
+        self.assert_parse_error("repo --name=blah --baseurl=www.domain.com --mirrorlist=www.domain.com",
+                                KickstartValueError)
+        # unknown option
+        self.assert_parse_error("repo --name=blah --baseurl=www.domain.com --unknown", KickstartParseError)
+        # not expected argument
+        self.assert_parse_error("repo --name=blah --baseurl=www.domain.com blah", KickstartValueError)
+        
+        
+class F8_TestCase(FC6_TestCase):
+    def runTest(self):
+        # run FC6 test case
+        FC6_TestCase.runTest(self)
+        
+        # pass
+        self.assert_parse("repo --name=blah --baseurl=www.domain.com --cost=10 --excludepkgs=pkg1,pkg2 --includepkgs=pkg3,pkg4",
+                          "repo --name=blah --baseurl=www.domain.com --cost=10 --includepkgs=\"pkg3,pkg4\" --excludepkgs=\"pkg1,pkg2\"\n")
+        self.assert_parse("repo --name=blah --baseurl=123xyz --cost=10 --excludepkgs=pkg1,pkg2 --includepkgs=pkg3,pkg4",
+                          "repo --name=blah --baseurl=123xyz --cost=10 --includepkgs=\"pkg3,pkg4\" --excludepkgs=\"pkg1,pkg2\"\n")
+                          
+        # fail
+        # missing required arguments
+        for opt in ("--cost", "--includepkgs", "--excludepkgs"):
+            self.assert_parse_error("repo --name=blah --baseurl=www.domain.com %s" % opt, KickstartParseError)
+        # --cost argument not integer
+        self.assert_parse_error("repo --name=blah --baseurl=www.domain.com --cost=high", KickstartParseError)
+        
+        
+class F11_TestCase(F8_TestCase):
+    def runTest(self):
+        # run F8 test case
+        F8_TestCase.runTest(self)
+        
+        # pass
+        for val in ("1", "true", "on"):
+            self.assert_parse("repo --name=blah --baseurl=www.domain.com --cost=10 --excludepkgs=pkg1,pkg2 --includepkgs=pkg3,pkg4 --ignoregroups=%s" % val,
+                              "repo --name=blah --baseurl=www.domain.com --cost=10 --includepkgs=\"pkg3,pkg4\" --excludepkgs=\"pkg1,pkg2\" --ignoregroups=true\n")
+        for val in ("0", "false", "off"):
+            self.assert_parse("repo --name=blah --baseurl=www.domain.com --cost=10 --excludepkgs=pkg1,pkg2 --includepkgs=pkg3,pkg4 --ignoregroups=%s" % val,
+                              "repo --name=blah --baseurl=www.domain.com --cost=10 --includepkgs=\"pkg3,pkg4\" --excludepkgs=\"pkg1,pkg2\"\n")
+                              
+        # fail
+        # missing --ignoregroups argument
+        self.assert_parse_error("repo --name=blah --baseurl=www.domain.com --ignoregroups", KickstartParseError)
+        
+        
+if __name__ == "__main__":
+    unittest.main()
+    
-- 
1.6.0.6




More information about the Kickstart-list mailing list