Browse Source

[1461] cleaner step definitions

Jelte Jansen 13 years ago
parent
commit
14181ee2db
2 changed files with 167 additions and 41 deletions
  1. 14 41
      tests/lettuce/features/ddns_system.feature
  2. 153 0
      tests/lettuce/features/terrain/nsupdate.py

+ 14 - 41
tests/lettuce/features/ddns_system.feature

@@ -17,31 +17,19 @@ Feature: DDNS System
         bind10 module DDNS should not be running
         bind10 module DDNS should not be running
 
 
         # Test 1
         # Test 1
-        When I send a DDNS Update for example.org with the following commands:
+        When I use DDNS to set the SOA serial to 1235
-        """
-        update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1235 3600 1800 2419200 7200
-        """
         # Note: test spec says refused here, system returns SERVFAIL
         # Note: test spec says refused here, system returns SERVFAIL
         #The DDNS response should be REFUSED
         #The DDNS response should be REFUSED
         The DDNS response should be SERVFAIL
         The DDNS response should be SERVFAIL
         And the SOA serial for example.org should be 1234
         And the SOA serial for example.org should be 1234
 
 
         # Test 2
         # Test 2
-        When I send bind10 the following commands
+        When I configure bind10 to run DDNS
-        """
-        config add Boss/components b10-ddns
-        config set Boss/components/b10-ddns/kind dispensable
-        config commit
-        """
         And wait for new bind10 stderr message DDNS_RUNNING
         And wait for new bind10 stderr message DDNS_RUNNING
-
         bind10 module DDNS should be running
         bind10 module DDNS should be running
 
 
         # Test 3
         # Test 3
-        When I send a DDNS Update for example.org with the following commands:
+        When I use DDNS to set the SOA serial to 1236
-        """
-        update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1236 3600 1800 2419200 7200
-        """
         The DDNS response should be REFUSED
         The DDNS response should be REFUSED
         And the SOA serial for example.org should be 1234
         And the SOA serial for example.org should be 1234
 
 
@@ -55,48 +43,33 @@ Feature: DDNS System
         """
         """
 
 
         # Test 5
         # Test 5
-        When I send a DDNS Update for example.org with the following commands:
+        When I use DDNS to set the SOA serial to 1237
-        """
-        update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1237 3600 1800 2419200 7200
-        """
         The DDNS response should be SUCCESS
         The DDNS response should be SUCCESS
         And the SOA serial for example.org should be 1237
         And the SOA serial for example.org should be 1237
 
 
         # Test 6
         # Test 6
         # XXX right after update, this fails?!
         # XXX right after update, this fails?!
-        #When I send bind10 the command DDNS shutdown
+        When I send bind10 the command DDNS shutdown
 
 
         # Test 7
         # Test 7
-        #And wait for new bind10 stderr message DDNS_RUNNING
+        And wait for new bind10 stderr message DDNS_RUNNING
 
 
         # Test 8
         # Test 8
-        When I send a DDNS Update for example.org with the following commands:
+        When I use DDNS to set the SOA serial to 1238
-        """
-        update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1238 3600 1800 2419200 7200
-        """
         The DDNS response should be SUCCESS
         The DDNS response should be SUCCESS
         And the SOA serial for example.org should be 1238
         And the SOA serial for example.org should be 1238
 
 
         # Test 9
         # Test 9
+        When I send bind10 the command Auth shutdown
 
 
         # Test 10
         # Test 10
-        When I send bind10 the following commands
+        When I configure BIND10 to stop running DDNS
-        """
+        And wait for new bind10 stderr message DDNS_STOPPED
-        config remove Boss/components b10-ddns
-        config commit
-        """
-        # XXX same problem of nonresponsive ddns?
-        #And wait for new bind10 stderr message DDNS_STOPPED
 
 
-        #bind10 module DDNS should not be running
+        bind10 module DDNS should not be running
 
 
         # Test 11
         # Test 11
-        When I send a DDNS Update for example.org with the following commands:
+        When I use DDNS to set the SOA serial to 1239
-        """
+        # should this be REFUSED again?
-        update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1239 3600 1800 2419200 7200
+        The DDNS response should be SERVFAIL
-        """
-        The DDNS response should be SERFVAIL
         And the SOA serial for example.org should be 1238
         And the SOA serial for example.org should be 1238
-
-
-

+ 153 - 0
tests/lettuce/features/terrain/nsupdate.py

@@ -0,0 +1,153 @@
+# Copyright (C) 2011  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.
+
+from lettuce import *
+import subprocess
+import re
+
+def run_nsupdate(commands, zone="example.org.", update_address="127.0.0.1",
+                 update_port="47806"):
+    """Run nsupdate.
+       Parameters:
+       commands: a sequence of strings which will be sent.
+       update_address: adress to send the update to
+       update_port: port to send the update to
+       zone: zone to update
+
+       Automatically adds the command to set server
+       Appends 'send' as a final command.
+
+       nsupdate's stdout and stderr streams are stored (as one multiline string
+       in world.last_nsupdate_stdout/stderr.
+       Fails if the return code is not 0
+
+    """
+    #commands.insert(0, "server " + update_address + " " + update_port)
+    #commands.insert(0, "zone " + zone)
+    commands.append('send')
+    commands.append('quit')
+    args = ['nsupdate' ]
+    nsupdate = subprocess.Popen(args, 1, None, subprocess.PIPE,
+                                subprocess.PIPE, subprocess.PIPE)
+    for line in commands:
+        nsupdate.stdin.write(line + "\n")
+    (stdout, stderr) = nsupdate.communicate()
+    world.last_nsupdate_returncode = nsupdate.returncode
+    world.last_nsupdate_stdout = stdout
+    world.last_nsupdate_stderr = stderr
+    #assert result == 0, "nsupdate exit code: " + str(result) +\
+    #                    "\nstdout:\n" + str(stdout) +\
+    #                    "stderr:\n" + str(stderr)
+
+
+@step('send a DDNS update for (\S+) with the following commands:')
+def send_multiple_commands(step, zone):
+    """
+    Run nsupdate, and send it the given multiline set of commands.
+    A quit command is always appended.
+    cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
+                the command to. Defaults to 47805.
+    Fails if cmdctl does not exit with status code 0.
+    """
+    commands = step.multiline.split("\n")
+    run_nsupdate(commands, zone)
+
+@step('DDNS response should be ([A-Z]+)')
+def check_ddns_response(step, response):
+    # For success, nsupdate is silent, only check result code 0
+    if response == "SUCCESS":
+        assert 0 == world.last_nsupdate_returncode,\
+               "nsupdate exit code: " + str(world.last_nsupdate_returncode) +\
+               "\nstdout:\n" + str(world.last_nsupdate_stdout) +\
+               "stderr:\n" + str(world.last_nsupdate_stderr)
+    else:
+        found = False
+        for line in world.last_nsupdate_stderr.split('\n'):
+            if line == "update failed: " + response:
+                found = True
+        assert found and (2 == world.last_nsupdate_returncode),\
+               "Response " + response + " not found in nsupdate output\n" +\
+               "nsupdate exit code: " + str(world.last_nsupdate_returncode) +\
+               "\nstdout:\n" + str(world.last_nsupdate_stdout) +\
+               "stderr:\n" + str(world.last_nsupdate_stderr)
+
+
+# Individual steps to create a DDNS update packet through nsupdate
+@step('Prepare a DDNS update(?: for (\S+))?(?: to (\S+)(?: port ([0-9]+)))?')
+def prepare_update(step, zone, server, port):
+    '''
+    Prepares an nsupdate command that sets up an update to a server
+    for a zone. The update is not sent yet, but the commands
+    are stored in world.nsupdate_commands
+    '''
+    commands = []
+    if server is not None:
+        commands.append("server " + server)
+    else:
+        commands.append("server 127.0.0.1")
+    if port is not None:
+        commands[0] = commands[0] + " " + port
+    else:
+        commands[0] = commands[0] + " 47806"
+    if zone is not None:
+        commands.append("zone " + zone)
+    world.nsupdate_commands = commands
+
+@step('Add to the DDNS update: (.*)')
+def add_line_to_ddns_update(step, line):
+    world.nsupdate_commands.append(line)
+
+@step('Add the following lines to the DDNS update:')
+def add_lines_to_ddns_update(step, line):
+    world.nsupdate_commands.extend(step.multiline.split('\n'))
+
+@step('Run the DDNS update')
+def run_ddns_update(step):
+    '''
+    Executes nsupdate as prepared by the previous steps
+    '''
+    run_nsupdate(world.nsupdate_commands)
+
+@step('use DDNS to set the SOA SERIAL to ([0-9]+)')
+def set_serial_to(step, new_serial):
+    '''
+    Convenience compound step; prepare an update for example.org,
+    which sets the SERIAL to the given value
+    '''
+    step.given('Prepare a DDNS update')
+    step.given('add to the DDNS update: update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1235 3600 1800 2419200 7200')
+    step.given('Run the DDNS update')
+
+@step('Configure BIND10 to run DDNS')
+def configure_ddns_on(step):
+    step.behave_as("""
+    When I send bind10 the following commands
+        \"\"\"
+        config add Boss/components b10-ddns
+        config set Boss/components/b10-ddns/kind dispensable
+        config commit
+        \"\"\"
+    """)
+
+@step('Configure BIND10 to stop running DDNS')
+def configure_ddns_on(step):
+    step.behave_as("""
+    When I send bind10 the following commands
+        \"\"\"
+        config remove Boss/components b10-ddns
+        config commit
+        \"\"\"
+    """)
+