commit 13f7ce34e735b2547f3ab669bed0ceb571624c0f Author: Damian Johnson atagar@torproject.org Date: Thu Apr 19 19:14:42 2012 -0700
Testing option for chroot setups
Adding a new target to simulate a chroot setup by stripping the test directory from any control socket responses. As expected this is causing integ tests that validate this path to fail.
Sathyanarayanan took the first several stabs at this, and this is just another potential option for... https://trac.torproject.org/projects/tor/ticket/4896 --- run_tests.py | 1 + test/runner.py | 38 ++++++++++++++++++++++++++++++++++++++ test/settings.cfg | 2 ++ test/testrc.sample | 11 ++--------- 4 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/run_tests.py b/run_tests.py index 1fee4da..dcfcdef 100755 --- a/run_tests.py +++ b/run_tests.py @@ -63,6 +63,7 @@ CONFIG = stem.util.conf.config_dict("test", { Target = stem.util.enum.UppercaseEnum( "ONLINE", "RELATIVE", + "CHROOT", "RUN_NONE", "RUN_OPEN", "RUN_PASSWORD", diff --git a/test/runner.py b/test/runner.py index 32c3872..3636b44 100644 --- a/test/runner.py +++ b/test/runner.py @@ -49,6 +49,7 @@ CONFIG = stem.util.conf.config_dict("test", { "integ.log": "./test/data/log", "integ.target.online": False, "integ.target.relative_data_dir": False, + "integ.target.chroot": False, })
STATUS_ATTR = (term.Color.BLUE, term.Attr.BOLD) @@ -135,6 +136,20 @@ def get_runner(): if not INTEG_RUNNER: INTEG_RUNNER = Runner() return INTEG_RUNNER
+class MockChrootFile: + """ + Wrapper around a file object that strips given content from readline() + responses. This is used to simulate a chroot setup by removing the restign + directory from the paths we report. + """ + + def __init__(self, wrapped_file, strip_text): + self.wrapped_file = wrapped_file + self.strip_text = strip_text + + def readline(self): + return self.wrapped_file.readline().replace(self.strip_text, "") + class Runner: def __init__(self): self._runner_lock = threading.RLock() @@ -146,6 +161,10 @@ class Runner: self._torrc_contents = "" self._custom_opts = None self._tor_process = None + + # set if we monkey patch stem.socket.recv_message() + + self._original_recv_message = None
def start(self, tor_cmd, extra_torrc_opts): """ @@ -198,6 +217,20 @@ class Runner: self._run_setup() self._start_tor(tor_cmd)
+ # strip the testing directory from recv_message responses if we're + # simulating a chroot setup + + if CONFIG["integ.target.chroot"] and not self._original_recv_message: + # TODO: when we have a function for telling stem the chroot we'll + # need to set that too + + self._original_recv_message = stem.socket.recv_message + + def _chroot_recv_message(control_file): + return self._original_recv_message(MockChrootFile(control_file, data_dir_path)) + + stem.socket.recv_message = _chroot_recv_message + # revert our cwd back to normal if CONFIG["integ.target.relative_data_dir"]: os.chdir(original_cwd) @@ -226,6 +259,11 @@ class Runner: if self._test_dir and CONFIG["integ.test_directory"] == "": shutil.rmtree(self._test_dir, ignore_errors = True)
+ # reverts any mockin of stem.socket.recv_message + if self._original_recv_message: + stem.socket.recv_message = self._original_recv_message + self._original_recv_message = None + self._test_dir = "" self._tor_cmd = None self._tor_cwd = "" diff --git a/test/settings.cfg b/test/settings.cfg index 74bb933..77156c5 100644 --- a/test/settings.cfg +++ b/test/settings.cfg @@ -30,6 +30,7 @@ msg.help
target.config ONLINE => integ.target.online target.config RELATIVE => integ.target.relative_data_dir +target.config CHROOT => integ.target.chroot target.config RUN_NONE => integ.target.run.none target.config RUN_OPEN => integ.target.run.open target.config RUN_PASSWORD => integ.target.run.password @@ -44,6 +45,7 @@ target.config RUN_ALL => integ.target.run.all
target.description ONLINE => Includes tests that require network activity. target.description RELATIVE => Uses a relative path for tor's data directory. +target.description CHROOT => Simulates a chroot setup. target.description RUN_NONE => Configuration without a way for controllers to connect. target.description RUN_OPEN => Configuration with an open control port (default). target.description RUN_PASSWORD => Configuration with password authentication. diff --git a/test/testrc.sample b/test/testrc.sample index a1cd5a6..165a8d8 100644 --- a/test/testrc.sample +++ b/test/testrc.sample @@ -26,15 +26,7 @@ # integ.target.relative_data_dir # Uses a relative path for the tor data directory if set. # -# integ.target.run.none -# integ.target.run.open -# integ.target.run.password -# integ.target.run.cookie -# integ.target.run.multiple -# integ.target.run.socket -# integ.target.run.scookie -# integ.target.run.ptrace -# integ.target.run.all +# integ.target.run.* # Runs the integration test suite for all of the given connection and # authentication configurations. If the 'all' option is set then the other # flags are ignored. @@ -50,6 +42,7 @@ integ.log ./test/data/log
integ.target.online false integ.target.relative_data_dir false +integ.target.chroot false integ.target.run.none false integ.target.run.open true integ.target.run.password false
tor-commits@lists.torproject.org