From a34093ed0e9c29d7e838dc65aa6c104bb8cc7195 Mon Sep 17 00:00:00 2001 From: meejah Date: Mon, 16 Nov 2020 11:58:27 -0700 Subject: [PATCH] fix some test-ability problems and add tests for 'tahoe admin add-grid-manager-cert' --- src/allmydata/scripts/runner.py | 6 +- src/allmydata/test/cli/test_grid_manager.py | 90 ++++++++++++++++++++- src/allmydata/test/common_util.py | 13 +-- 3 files changed, 102 insertions(+), 7 deletions(-) diff --git a/src/allmydata/scripts/runner.py b/src/allmydata/scripts/runner.py index 24d027cc3..2184569b6 100644 --- a/src/allmydata/scripts/runner.py +++ b/src/allmydata/scripts/runner.py @@ -115,8 +115,11 @@ def parse_options(argv, config=None): config.parseOptions(argv) # may raise usage.error return config -def parse_or_exit_with_explanation(argv, stdout=sys.stdout): +def parse_or_exit_with_explanation(argv, stdout=sys.stdout, stderr=sys.stderr, stdin=sys.stdin): config = Options() + config.stdout = stdout + config.stdin = stdin + config.stderr = stderr try: parse_options(argv, config=config) except usage.error as e: @@ -141,6 +144,7 @@ def dispatch(config, so.stdout = stdout so.stderr = stderr so.stdin = stdin + config.stdin = stdin if command in create_dispatch: f = create_dispatch[command] diff --git a/src/allmydata/test/cli/test_grid_manager.py b/src/allmydata/test/cli/test_grid_manager.py index 8383bb9cd..6d71a14eb 100644 --- a/src/allmydata/test/cli/test_grid_manager.py +++ b/src/allmydata/test/cli/test_grid_manager.py @@ -2,13 +2,27 @@ import os import json -from ..common import SyncTestCase +from ..common import ( + SyncTestCase, + AsyncTestCase, +) from allmydata.cli.grid_manager import ( grid_manager, ) import click.testing +# these imports support the tests for `tahoe *` subcommands +from ..common_util import ( + run_cli, +) +from twisted.internet.defer import ( + inlineCallbacks, +) +from twisted.python.filepath import ( + FilePath, +) + class GridManagerCommandLine(SyncTestCase): """ @@ -77,3 +91,77 @@ class GridManagerCommandLine(SyncTestCase): result = self.runner.invoke(grid_manager, ["--config", "foo", "list"]) self.assertEqual(result.output.strip(), "") + + +# note: CLITestMixin can't function without also GridTestMixin ... :/ +class TahoeAddGridManagerCert(AsyncTestCase): + """ + Test `tahoe admin add-grid-manager-cert` subcommand + """ + + @inlineCallbacks + def test_help(self): + """ + some kind of help is printed + """ + code, out, err = yield run_cli("admin", "add-grid-manager-cert") + self.assertEqual(err, "") + self.assertNotEqual(0, code) + + @inlineCallbacks + def test_no_name(self): + """ + error to miss --name option + """ + code, out, err = yield run_cli( + "admin", "add-grid-manager-cert", "--filename", "-", + stdin="the cert", + ) + self.assertIn( + "Must provide --name", + out + ) + + @inlineCallbacks + def test_no_filename(self): + """ + error to miss --name option + """ + code, out, err = yield run_cli( + "admin", "add-grid-manager-cert", "--name", "foo", + stdin="the cert", + ) + self.assertIn( + "Must provide --filename", + out + ) + + @inlineCallbacks + def test_add_one(self): + """ + we can add a certificate + """ + nodedir = self.mktemp() + fake_cert = """{"certificate": "", "signature": ""}""" + + code, out, err = yield run_cli( + "--node-directory", nodedir, + "admin", "add-grid-manager-cert", "-f", "-", "--name", "foo", + stdin=fake_cert, + ignore_stderr=True, + ) + nodepath = FilePath(nodedir) + with nodepath.child("tahoe.cfg").open("r") as f: + config_data = f.read() + + self.assertIn("tahoe.cfg", nodepath.listdir()) + self.assertIn( + "foo = foo.cert", + config_data, + ) + self.assertIn("foo.cert", nodepath.listdir()) + with nodepath.child("foo.cert").open("r") as f: + self.assertEqual( + json.load(f), + json.loads(fake_cert) + ) diff --git a/src/allmydata/test/common_util.py b/src/allmydata/test/common_util.py index e3f5cf750..cbc00a135 100644 --- a/src/allmydata/test/common_util.py +++ b/src/allmydata/test/common_util.py @@ -40,14 +40,17 @@ def run_cli(verb, *args, **kwargs): "arguments to do_cli must be strs -- convert using unicode_to_argv", args=args) nodeargs = kwargs.get("nodeargs", []) argv = nodeargs + [verb] + list(args) - stdin = kwargs.get("stdin", "") + stdin = StringIO(kwargs.get("stdin", "")) stdout = StringIO() stderr = StringIO() d = defer.succeed(argv) - d.addCallback(runner.parse_or_exit_with_explanation, stdout=stdout) - d.addCallback(runner.dispatch, - stdin=StringIO(stdin), - stdout=stdout, stderr=stderr) + d.addCallback(runner.parse_or_exit_with_explanation, stdout=stdout, stderr=stderr, stdin=stdin) + d.addCallback( + runner.dispatch, + stdin=stdin, + stdout=stdout, + stderr=stderr, + ) def _done(rc): return 0, stdout.getvalue(), stderr.getvalue() def _err(f):