From f33db7d4429f14c215933c28853813c46f97f11e Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sat, 16 Feb 2019 10:56:28 +0000 Subject: Monkey: Support 401login in the monkey-driver et al. Signed-off-by: Daniel Silverstone --- test/monkey-driver.py | 75 ++++++++++++++++++++++++++++++++++++++++- test/monkey-tests/401login.yaml | 38 +++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 test/monkey-tests/401login.yaml diff --git a/test/monkey-driver.py b/test/monkey-driver.py index 57c6c54b3..6463d96f0 100755 --- a/test/monkey-driver.py +++ b/test/monkey-driver.py @@ -4,6 +4,59 @@ import sys, getopt, yaml, time from monkeyfarmer import Browser +class DriverBrowser(Browser): + def __init__(self, *args, **kwargs): + super(DriverBrowser, self).__init__(*args, **kwargs) + self.auth = [] + + def add_auth(self, url, realm, username, password): + self.auth.append((url, realm, username, password)) + + def remove_auth(self, url, realm, username, password): + keep = [] + def matches(a,b): + if a is None or b is None: + return True + return a == b + for (iurl, irealm, iusername, ipassword) in self.auth: + if not (matches(url, iurl) or + matches(realm, irealm) or + matches(username, iusername) or + matches(password, ipassword)): + keep.append((iurl, irealm, iusername, ipassword)) + self.auth = keep + + def handle_ready_login(self, logwin): + # We have logwin.{url,username,password,realm} + # We must logwin.send_{username,password}(xxx) + # We may logwin.go() + # We may logwin.destroy() + def matches(a,b): + if a is None or b is None: + return True + return a == b + candidates = [] + for (url, realm, username, password) in self.auth: + score = 0 + if matches(url, logwin.url): + score += 1 + if matches(realm, logwin.realm): + score += 1 + if matches(username, logwin.username): + score += 1 + if score > 0: + candidates.append((score, username, password)) + if candidates: + candidates.sort() + (score, username, password) = candidates[-1] + print("401: Found candidate {}/{} with score {}".format(username, password, score)) + logwin.send_username(username) + logwin.send_password(password) + logwin.go() + else: + print("401: No candidate found, cancelling login box") + logwin.destroy() + def print_usage(): print('Usage:') print(' ' + sys.argv[0] + ' -m -t ') @@ -72,7 +125,7 @@ def run_test_step_action_launch(ctx, step): print(get_indent(ctx) + "Action: " + step["action"]) assert(ctx.get('browser') is None) assert(ctx.get('windows') is None) - ctx['browser'] = Browser(monkey_cmd=[ctx["monkey"]], quiet=True) + ctx['browser'] = DriverBrowser(monkey_cmd=[ctx["monkey"]], quiet=True) assert_browser(ctx) ctx['windows'] = dict() @@ -174,6 +227,9 @@ def run_test_step_action_plot_check(ctx, step): if 'text-contains' in check.keys(): print("Check {} in {}".format(repr(check['text-contains']),repr(all_text))) assert(check['text-contains'] in all_text) + elif 'text-not-contains' in check.keys(): + print("Check {} NOT in {}".format(repr(check['text-not-contains']),repr(all_text))) + assert(check['text-not-contains'] not in all_text) elif 'bitmap-count' in check.keys(): assert(len(bitmaps) == int(check['bitmap-count'])) else: @@ -212,6 +268,21 @@ def run_test_step_action_timer_check(ctx, step): elif condition[1] == '>': assert(timer1["taken"] > timer2["taken"]) +def run_test_step_action_add_auth(ctx, step): + print(get_indent(ctx) + "Action:" + step["action"]) + assert_browser(ctx) + browser = ctx['browser'] + browser.add_auth(step.get("url"), step.get("realm"), + step.get("username"), step.get("password")) + + +def run_test_step_action_remove_auth(ctx, step): + print(get_indent(ctx) + "Action:" + step["action"]) + assert_browser(ctx) + browser = ctx['browser'] + browser.remove_auth(step.get("url"), step.get("realm"), + step.get("username"), step.get("password")) + def run_test_step_action_quit(ctx, step): print(get_indent(ctx) + "Action: " + step["action"]) assert_browser(ctx) @@ -231,6 +302,8 @@ step_handlers = { "timer-stop": run_test_step_action_timer_stop, "timer-check": run_test_step_action_timer_check, "plot-check": run_test_step_action_plot_check, + "add-auth": run_test_step_action_add_auth, + "remove-auth": run_test_step_action_remove_auth, "quit": run_test_step_action_quit, } diff --git a/test/monkey-tests/401login.yaml b/test/monkey-tests/401login.yaml new file mode 100644 index 000000000..a9a74cd10 --- /dev/null +++ b/test/monkey-tests/401login.yaml @@ -0,0 +1,38 @@ +title: Test the 401 LOGIN functionality +group: real-world +steps: +- action: launch + language: en +- action: window-new + tag: win1 +- action: navigate + window: win1 + url: https://httpbin.org/basic-auth/foo/bar +- action: block + conditions: + - window: win1 + status: complete +- action: plot-check + window: win1 + checks: + - text-not-contains: "\"authenticated\": true" +- action: add-auth + url: https://httpbin.org/basic-auth/foo/bar + realm: Fake Realm + username: foo + password: bar +- action: navigate + window: win1 + url: https://httpbin.org/basic-auth/foo/bar +- action: block + conditions: + - window: win1 + status: complete +- action: plot-check + window: win1 + checks: + - text-contains: "\"authenticated\": true" +- action: window-close + window: win1 +- action: quit + -- cgit v1.2.3