commit 6cc4e195452bc573e34f0b2de295b1028a20eb4a Author: Ravi Chandra Padmala neenaoffline@gmail.com Date: Fri Jun 29 00:25:17 2012 +0530
Implement Controller.load_conf --- stem/control.py | 20 ++++++++++++++++++++ test/integ/control/controller.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/stem/control.py b/stem/control.py index 2c12d43..f68183e 100644 --- a/stem/control.py +++ b/stem/control.py @@ -756,6 +756,26 @@ class Controller(BaseController): raise stem.socket.InvalidRequest(response.code, response.message) else: raise stem.socket.ProtocolError("%s returned unexpected status code" % command) + + def load_conf(self, configtext): + """ + Sends the configuration text to Tor and loads it as if it has been read from + disk. + + :param str configtext: the configuration text + + :raises: :class:`stem.socket.ControllerError` if the call fails + """ + + response = self.msg("LOADCONF\n%s" % configtext) + stem.response.convert("SINGLELINE", response) + + if response.code in ("552", "553"): + if response.code == "552" and response.message.startswith("Invalid config file: Failed to parse/validate config: Unknown option"): + raise stem.socket.InvalidArguments(response.code, response.message, [response.message[70:response.message.find('.', 70) - 1]]) + raise stem.socket.InvalidRequest(response.code, response.message) + elif not response.is_ok(): + raise stem.socket.ProtocolError("+LOADCONF Received unexpected response\n%s" % str(response))
def _case_insensitive_lookup(entries, key, default = UNDEFINED): """ diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py index 65dfe18..bcd76fb 100644 --- a/test/integ/control/controller.py +++ b/test/integ/control/controller.py @@ -267,4 +267,32 @@ class TestController(unittest.TestCase): ), reset = True)
shutil.rmtree(tmpdir) + + def test_loadconf(self): + """ + Exercises Controller.load_conf with valid and invalid requests. + """ + + if test.runner.require_control(self): return + + runner = test.runner.get_runner() + + with runner.get_tor_controller() as controller: + oldconf = runner.get_torrc_contents() + + # invalid requests + self.assertRaises(stem.socket.InvalidRequest, controller.load_conf, "ContactInfo confloaded") + try: + controller.load_conf("Blahblah blah") + except stem.socket.InvalidArguments, exc: + self.assertEqual(["Blahblah"], exc.arguments) + else: + self.fail() + + # valid config + controller.load_conf(runner.get_torrc_contents() + "\nContactInfo confloaded\n") + self.assertEqual("confloaded", controller.get_conf("ContactInfo")) + + # reload original valid config + controller.load_conf(oldconf)
tor-commits@lists.torproject.org