From: Jelte Jansen Date: Tue, 12 Jun 2012 08:49:09 +0000 (+0200) Subject: [1461] cleaner step definitions X-Git-Tag: trac2351_base~226^2~51 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=14181ee2dbd7e5e2624dc7ffc72d8266012f92cd;p=thirdparty%2Fkea.git [1461] cleaner step definitions --- diff --git a/tests/lettuce/features/ddns_system.feature b/tests/lettuce/features/ddns_system.feature index fd491af233..bbf1d950ce 100644 --- a/tests/lettuce/features/ddns_system.feature +++ b/tests/lettuce/features/ddns_system.feature @@ -17,31 +17,19 @@ Feature: DDNS System bind10 module DDNS should not be running # Test 1 - When I send a DDNS Update for example.org with the following commands: - """ - update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1235 3600 1800 2419200 7200 - """ + When I use DDNS to set the SOA serial to 1235 # Note: test spec says refused here, system returns SERVFAIL #The DDNS response should be REFUSED The DDNS response should be SERVFAIL And the SOA serial for example.org should be 1234 # Test 2 - When I send bind10 the following commands - """ - config add Boss/components b10-ddns - config set Boss/components/b10-ddns/kind dispensable - config commit - """ + When I configure bind10 to run DDNS And wait for new bind10 stderr message DDNS_RUNNING - bind10 module DDNS should be running # Test 3 - When I send a DDNS Update for example.org with the following commands: - """ - update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1236 3600 1800 2419200 7200 - """ + When I use DDNS to set the SOA serial to 1236 The DDNS response should be REFUSED And the SOA serial for example.org should be 1234 @@ -55,48 +43,33 @@ Feature: DDNS System """ # Test 5 - When I send a DDNS Update for example.org with the following commands: - """ - update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1237 3600 1800 2419200 7200 - """ + When I use DDNS to set the SOA serial to 1237 The DDNS response should be SUCCESS And the SOA serial for example.org should be 1237 # Test 6 # XXX right after update, this fails?! - #When I send bind10 the command DDNS shutdown + When I send bind10 the command DDNS shutdown # Test 7 - #And wait for new bind10 stderr message DDNS_RUNNING + And wait for new bind10 stderr message DDNS_RUNNING # Test 8 - When I send a DDNS Update for example.org with the following commands: - """ - update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1238 3600 1800 2419200 7200 - """ + When I use DDNS to set the SOA serial to 1238 The DDNS response should be SUCCESS And the SOA serial for example.org should be 1238 # Test 9 + When I send bind10 the command Auth shutdown # Test 10 - When I send bind10 the following commands - """ - config remove Boss/components b10-ddns - config commit - """ - # XXX same problem of nonresponsive ddns? - #And wait for new bind10 stderr message DDNS_STOPPED + When I configure BIND10 to stop running 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 - When I send a DDNS Update for example.org with the following commands: - """ - update add example.org 3600 IN SOA ns1.example.org. admin.example.org. 1239 3600 1800 2419200 7200 - """ - The DDNS response should be SERFVAIL + When I use DDNS to set the SOA serial to 1239 + # should this be REFUSED again? + The DDNS response should be SERVFAIL And the SOA serial for example.org should be 1238 - - - diff --git a/tests/lettuce/features/terrain/nsupdate.py b/tests/lettuce/features/terrain/nsupdate.py new file mode 100644 index 0000000000..1f9ac808cc --- /dev/null +++ b/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 ', 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 + \"\"\" + """) +