From 3a3b8fb21dcaf100ede0b474cce6eb649128e8b4 Mon Sep 17 00:00:00 2001 From: Connor Mendenhall Date: Fri, 30 May 2014 19:55:28 -0500 Subject: [PATCH 1/2] Start adding nose tests. --- test/onionshare_test.py | 55 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/onionshare_test.py diff --git a/test/onionshare_test.py b/test/onionshare_test.py new file mode 100644 index 00000000..2ad235c8 --- /dev/null +++ b/test/onionshare_test.py @@ -0,0 +1,55 @@ +from onionshare import * + +def test_get_platform_returns_env_var(): + "get_platform() returns ONIONSHARE_PLATFORM from the environment" + os.environ['ONIONSHARE_PLATFORM'] = 'TI-83+' + assert get_platform() == 'TI-83+' + +def test_get_platform_returns_platform_system(): + """ + get_platform() returns platform.system() when + ONIONSHARE_PLATFORM is not defined + """ + os.environ.pop('ONIONSHARE_PLATFORM', None) + onionshare.platform.system = lambda: 'Sega Saturn' + assert get_platform() == 'Sega Saturn' + +def test_get_hidden_service_dir_windows_with_temp(): + """ + get_hidden_service_dir() uses a temporary directory from the + Windows environment when defined + """ + onionshare.get_platform = lambda: 'Windows' + os.environ['Temp'] = "C:\Internet Explorer\Secrets" + expected_path = "C:/Internet Explorer/Secrets/onionshare_hidden_service_port" + assert get_hidden_service_dir('port') == expected_path + +def test_get_hidden_service_dir_windows_default(): + "get_hidden_service_dir() uses C:/tmp by default on Windows" + onionshare.get_platform = lambda: 'Windows' + os.environ.pop('Temp', None) + expected_path = "C:/tmp/onionshare_hidden_service_port" + assert get_hidden_service_dir('port') == expected_path + +def test_get_hidden_service_dir_posix(): + "get_hidden_service_dir() uses /tmp by default on POSIX" + onionshare.get_platform = lambda: 'Not Windows' + expected_path = "/tmp/onionshare_hidden_service_port" + assert get_hidden_service_dir('port') == expected_path + +def test_generate_slug_length(): + "generates a 32-character slug" + assert len(slug) == 32 + +def test_generate_slug_characters(): + "generates a hex slug" + + def is_hex(string): + hex_alphabet = "01234556789abcdef" + return all(char in hex_alphabet for char in string) + + assert is_hex(slug) + +def test_starts_with_empty_strings(): + "creates an empty strings dict by default" + assert strings == {} From 47ba6043ce1532b921bbe01388e797b8e6f479f9 Mon Sep 17 00:00:00 2001 From: Connor Mendenhall Date: Fri, 30 May 2014 22:06:08 -0500 Subject: [PATCH 2/2] Add more unit tests. --- onionshare/onionshare.py | 5 ++- test/onionshare_test.py | 66 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/onionshare/onionshare.py b/onionshare/onionshare.py index 59fcfb89..f2432ff3 100644 --- a/onionshare/onionshare.py +++ b/onionshare/onionshare.py @@ -8,9 +8,12 @@ def get_platform(): else: return platform.system() -if get_platform() == 'Tails': +def append_lib_on_tails(): + if get_platform() == 'Tails': sys.path.append(os.path.dirname(__file__)+'/../tails/lib') +append_lib_on_tails() + from stem.control import Controller from stem import SocketError diff --git a/test/onionshare_test.py b/test/onionshare_test.py index 2ad235c8..6b2f0873 100644 --- a/test/onionshare_test.py +++ b/test/onionshare_test.py @@ -14,12 +14,19 @@ def test_get_platform_returns_platform_system(): onionshare.platform.system = lambda: 'Sega Saturn' assert get_platform() == 'Sega Saturn' +def test_tails_appends_to_path(): + "adds '/../tails/lib' to the path when running on Tails" + original_path = sys.path + onionshare.platform.system = lambda: 'Tails' + append_lib_on_tails() + assert sys.path[-1][-13:] == '/../tails/lib' + def test_get_hidden_service_dir_windows_with_temp(): """ get_hidden_service_dir() uses a temporary directory from the Windows environment when defined """ - onionshare.get_platform = lambda: 'Windows' + onionshare.platform.system = lambda: 'Windows' os.environ['Temp'] = "C:\Internet Explorer\Secrets" expected_path = "C:/Internet Explorer/Secrets/onionshare_hidden_service_port" assert get_hidden_service_dir('port') == expected_path @@ -37,6 +44,63 @@ def test_get_hidden_service_dir_posix(): expected_path = "/tmp/onionshare_hidden_service_port" assert get_hidden_service_dir('port') == expected_path +class MockSubprocess(): + def __init__(self): + self.last_call = None + + def call(self, args): + self.last_call = args + + def last_call_args(self): + return self.last_call + +def test_tails_open_port(): + "tails_open_port() calls iptables with ACCEPT arg" + onionshare.get_platform = lambda: 'Tails' + onionshare.strings = {'punching_a_hole': ''} + + mock_subprocess = MockSubprocess() + onionshare.subprocess = mock_subprocess + onionshare.tails_open_port('port') + + expected_call = [ + '/sbin/iptables', '-I', 'OUTPUT', + '-o', 'lo', '-p', + 'tcp', '--dport', 'port', '-j', 'ACCEPT' + ] + actual_call = mock_subprocess.last_call_args() + assert actual_call == expected_call + +def test_load_strings_defaults_to_english(): + "load_strings() loads English by default" + locale.getdefaultlocale = lambda: ('en_US', 'UTF-8') + load_strings() + assert onionshare.strings['calculating_sha1'] == "Calculating SHA1 checksum." + +def test_load_strings_loads_other_languages(): + "load_strings() loads other languages in different locales" + locale.getdefaultlocale = lambda: ('fr_FR', 'UTF-8') + load_strings("fr") + print onionshare.strings + assert onionshare.strings['calculating_sha1'] == "Calculer un hachage SHA-1." + +def test_tails_close_port(): + "tails_close_port() calls iptables with REJECT arg" + onionshare.get_platform = lambda: 'Tails' + onionshare.strings = {'closing_hole': ''} + + mock_subprocess = MockSubprocess() + onionshare.subprocess = mock_subprocess + onionshare.tails_close_port('port') + + expected_call = [ + '/sbin/iptables', '-I', 'OUTPUT', + '-o', 'lo', '-p', + 'tcp', '--dport', 'port', '-j', 'REJECT' + ] + actual_call = mock_subprocess.last_call_args() + assert actual_call == expected_call + def test_generate_slug_length(): "generates a 32-character slug" assert len(slug) == 32