summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_netrc.py305
1 files changed, 224 insertions, 81 deletions
diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py
index 90ef5cd..a6b4bc4 100644
--- a/Lib/test/test_netrc.py
+++ b/Lib/test/test_netrc.py
@@ -1,7 +1,7 @@
-import netrc, os, unittest, sys, tempfile, textwrap
-from test import support
-from test.support import os_helper
+import netrc, os, unittest, sys, textwrap
+from test.support import os_helper, run_unittest
+temp_filename = os_helper.TESTFN
class NetrcTestCase(unittest.TestCase):
@@ -10,26 +10,32 @@ class NetrcTestCase(unittest.TestCase):
mode = 'w'
if sys.platform != 'cygwin':
mode += 't'
- temp_fd, temp_filename = tempfile.mkstemp()
- with os.fdopen(temp_fd, mode=mode) as fp:
+ with open(temp_filename, mode) as fp:
fp.write(test_data)
- self.addCleanup(os.unlink, temp_filename)
- return netrc.netrc(temp_filename)
+ try:
+ nrc = netrc.netrc(temp_filename)
+ finally:
+ os.unlink(temp_filename)
+ return nrc
- def test_default(self):
+ def test_toplevel_non_ordered_tokens(self):
nrc = self.make_nrc("""\
- machine host1.domain.com login log1 password pass1 account acct1
- default login log2 password pass2
+ machine host.domain.com password pass1 login log1 account acct1
+ default login log2 password pass2 account acct2
""")
- self.assertEqual(nrc.hosts['host1.domain.com'],
- ('log1', 'acct1', 'pass1'))
- self.assertEqual(nrc.hosts['default'], ('log2', None, 'pass2'))
+ self.assertEqual(nrc.hosts['host.domain.com'], ('log1', 'acct1', 'pass1'))
+ self.assertEqual(nrc.hosts['default'], ('log2', 'acct2', 'pass2'))
- nrc2 = self.make_nrc(nrc.__repr__())
- self.assertEqual(nrc.hosts, nrc2.hosts)
+ def test_toplevel_tokens(self):
+ nrc = self.make_nrc("""\
+ machine host.domain.com login log1 password pass1 account acct1
+ default login log2 password pass2 account acct2
+ """)
+ self.assertEqual(nrc.hosts['host.domain.com'], ('log1', 'acct1', 'pass1'))
+ self.assertEqual(nrc.hosts['default'], ('log2', 'acct2', 'pass2'))
def test_macros(self):
- nrc = self.make_nrc("""\
+ data = """\
macdef macro1
line1
line2
@@ -37,33 +43,151 @@ class NetrcTestCase(unittest.TestCase):
macdef macro2
line3
line4
- """)
+
+ """
+ nrc = self.make_nrc(data)
self.assertEqual(nrc.macros, {'macro1': ['line1\n', 'line2\n'],
'macro2': ['line3\n', 'line4\n']})
+ # strip the last \n
+ self.assertRaises(netrc.NetrcParseError, self.make_nrc,
+ data.rstrip(' ')[:-1])
+
+ def test_optional_tokens(self):
+ data = (
+ "machine host.domain.com",
+ "machine host.domain.com login",
+ "machine host.domain.com account",
+ "machine host.domain.com password",
+ "machine host.domain.com login \"\" account",
+ "machine host.domain.com login \"\" password",
+ "machine host.domain.com account \"\" password"
+ )
+ for item in data:
+ nrc = self.make_nrc(item)
+ self.assertEqual(nrc.hosts['host.domain.com'], ('', '', ''))
+ data = (
+ "default",
+ "default login",
+ "default account",
+ "default password",
+ "default login \"\" account",
+ "default login \"\" password",
+ "default account \"\" password"
+ )
+ for item in data:
+ nrc = self.make_nrc(item)
+ self.assertEqual(nrc.hosts['default'], ('', '', ''))
- def _test_passwords(self, nrc, passwd):
+ def test_invalid_tokens(self):
+ data = (
+ "invalid host.domain.com",
+ "machine host.domain.com invalid",
+ "machine host.domain.com login log password pass account acct invalid",
+ "default host.domain.com invalid",
+ "default host.domain.com login log password pass account acct invalid"
+ )
+ for item in data:
+ self.assertRaises(netrc.NetrcParseError, self.make_nrc, item)
+
+ def _test_token_x(self, nrc, token, value):
nrc = self.make_nrc(nrc)
- self.assertEqual(nrc.hosts['host.domain.com'], ('log', 'acct', passwd))
+ if token == 'login':
+ self.assertEqual(nrc.hosts['host.domain.com'], (value, 'acct', 'pass'))
+ elif token == 'account':
+ self.assertEqual(nrc.hosts['host.domain.com'], ('log', value, 'pass'))
+ elif token == 'password':
+ self.assertEqual(nrc.hosts['host.domain.com'], ('log', 'acct', value))
+
+ def test_token_value_quotes(self):
+ self._test_token_x("""\
+ machine host.domain.com login "log" password pass account acct
+ """, 'login', 'log')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account "acct"
+ """, 'account', 'acct')
+ self._test_token_x("""\
+ machine host.domain.com login log password "pass" account acct
+ """, 'password', 'pass')
+
+ def test_token_value_escape(self):
+ self._test_token_x("""\
+ machine host.domain.com login \\"log password pass account acct
+ """, 'login', '"log')
+ self._test_token_x("""\
+ machine host.domain.com login "\\"log" password pass account acct
+ """, 'login', '"log')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account \\"acct
+ """, 'account', '"acct')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account "\\"acct"
+ """, 'account', '"acct')
+ self._test_token_x("""\
+ machine host.domain.com login log password \\"pass account acct
+ """, 'password', '"pass')
+ self._test_token_x("""\
+ machine host.domain.com login log password "\\"pass" account acct
+ """, 'password', '"pass')
- def test_password_with_leading_hash(self):
- self._test_passwords("""\
+ def test_token_value_whitespace(self):
+ self._test_token_x("""\
+ machine host.domain.com login "lo g" password pass account acct
+ """, 'login', 'lo g')
+ self._test_token_x("""\
+ machine host.domain.com login log password "pas s" account acct
+ """, 'password', 'pas s')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account "acc t"
+ """, 'account', 'acc t')
+
+ def test_token_value_non_ascii(self):
+ self._test_token_x("""\
+ machine host.domain.com login \xa1\xa2 password pass account acct
+ """, 'login', '\xa1\xa2')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account \xa1\xa2
+ """, 'account', '\xa1\xa2')
+ self._test_token_x("""\
+ machine host.domain.com login log password \xa1\xa2 account acct
+ """, 'password', '\xa1\xa2')
+
+ def test_token_value_leading_hash(self):
+ self._test_token_x("""\
+ machine host.domain.com login #log password pass account acct
+ """, 'login', '#log')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account #acct
+ """, 'account', '#acct')
+ self._test_token_x("""\
machine host.domain.com login log password #pass account acct
- """, '#pass')
+ """, 'password', '#pass')
- def test_password_with_trailing_hash(self):
- self._test_passwords("""\
+ def test_token_value_trailing_hash(self):
+ self._test_token_x("""\
+ machine host.domain.com login log# password pass account acct
+ """, 'login', 'log#')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account acct#
+ """, 'account', 'acct#')
+ self._test_token_x("""\
machine host.domain.com login log password pass# account acct
- """, 'pass#')
+ """, 'password', 'pass#')
- def test_password_with_internal_hash(self):
- self._test_passwords("""\
+ def test_token_value_internal_hash(self):
+ self._test_token_x("""\
+ machine host.domain.com login lo#g password pass account acct
+ """, 'login', 'lo#g')
+ self._test_token_x("""\
+ machine host.domain.com login log password pass account ac#ct
+ """, 'account', 'ac#ct')
+ self._test_token_x("""\
machine host.domain.com login log password pa#ss account acct
- """, 'pa#ss')
+ """, 'password', 'pa#ss')
def _test_comment(self, nrc, passwd='pass'):
nrc = self.make_nrc(nrc)
- self.assertEqual(nrc.hosts['foo.domain.com'], ('bar', None, passwd))
- self.assertEqual(nrc.hosts['bar.domain.com'], ('foo', None, 'pass'))
+ self.assertEqual(nrc.hosts['foo.domain.com'], ('bar', '', passwd))
+ self.assertEqual(nrc.hosts['bar.domain.com'], ('foo', '', 'pass'))
def test_comment_before_machine_line(self):
self._test_comment("""\
@@ -86,6 +210,42 @@ class NetrcTestCase(unittest.TestCase):
machine bar.domain.com login foo password pass
""")
+ def test_comment_after_machine_line(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ # comment
+ machine bar.domain.com login foo password pass
+ """)
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ # comment
+ """)
+
+ def test_comment_after_machine_line_no_space(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ #comment
+ machine bar.domain.com login foo password pass
+ """)
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ #comment
+ """)
+
+ def test_comment_after_machine_line_hash_only(self):
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ #
+ machine bar.domain.com login foo password pass
+ """)
+ self._test_comment("""\
+ machine foo.domain.com login bar password pass
+ machine bar.domain.com login foo password pass
+ #
+ """)
+
def test_comment_at_end_of_machine_line(self):
self._test_comment("""\
machine foo.domain.com login bar password pass # comment
@@ -109,57 +269,40 @@ class NetrcTestCase(unittest.TestCase):
def test_security(self):
# This test is incomplete since we are normally not run as root and
# therefore can't test the file ownership being wrong.
- with os_helper.temp_cwd(None) as d:
- fn = os.path.join(d, '.netrc')
- with open(fn, 'wt') as f:
- f.write("""\
- machine foo.domain.com login bar password pass
- default login foo password pass
- """)
- with os_helper.EnvironmentVarGuard() as environ:
- environ.set('HOME', d)
- os.chmod(fn, 0o600)
- nrc = netrc.netrc()
- self.assertEqual(nrc.hosts['foo.domain.com'],
- ('bar', None, 'pass'))
- os.chmod(fn, 0o622)
- self.assertRaises(netrc.NetrcParseError, netrc.netrc)
-
- def test_file_not_found_in_home(self):
- with os_helper.temp_cwd(None) as d:
- with os_helper.EnvironmentVarGuard() as environ:
- environ.set('HOME', d)
- self.assertRaises(FileNotFoundError, netrc.netrc)
-
- def test_file_not_found_explicit(self):
- self.assertRaises(FileNotFoundError, netrc.netrc,
- file='unlikely_netrc')
-
- def test_home_not_set(self):
- with os_helper.temp_cwd(None) as fake_home:
- fake_netrc_path = os.path.join(fake_home, '.netrc')
- with open(fake_netrc_path, 'w') as f:
- f.write('machine foo.domain.com login bar password pass')
- os.chmod(fake_netrc_path, 0o600)
-
- orig_expanduser = os.path.expanduser
- called = []
-
- def fake_expanduser(s):
- called.append(s)
- with os_helper.EnvironmentVarGuard() as environ:
- environ.set('HOME', fake_home)
- environ.set('USERPROFILE', fake_home)
- result = orig_expanduser(s)
- return result
-
- with support.swap_attr(os.path, 'expanduser', fake_expanduser):
- nrc = netrc.netrc()
- login, account, password = nrc.authenticators('foo.domain.com')
- self.assertEqual(login, 'bar')
-
- self.assertTrue(called)
+ d = os_helper.TESTFN
+ os.mkdir(d)
+ self.addCleanup(os_helper.rmtree, d)
+ fn = os.path.join(d, '.netrc')
+ with open(fn, 'wt') as f:
+ f.write("""\
+ machine foo.domain.com login bar password pass
+ default login foo password pass
+ """)
+ with os_helper.EnvironmentVarGuard() as environ:
+ environ.set('HOME', d)
+ os.chmod(fn, 0o600)
+ nrc = netrc.netrc()
+ self.assertEqual(nrc.hosts['foo.domain.com'],
+ ('bar', '', 'pass'))
+ os.chmod(fn, 0o622)
+ self.assertRaises(netrc.NetrcParseError, netrc.netrc)
+ with open(fn, 'wt') as f:
+ f.write("""\
+ machine foo.domain.com login anonymous password pass
+ default login foo password pass
+ """)
+ with os_helper.EnvironmentVarGuard() as environ:
+ environ.set('HOME', d)
+ os.chmod(fn, 0o600)
+ nrc = netrc.netrc()
+ self.assertEqual(nrc.hosts['foo.domain.com'],
+ ('anonymous', '', 'pass'))
+ os.chmod(fn, 0o622)
+ self.assertEqual(nrc.hosts['foo.domain.com'],
+ ('anonymous', '', 'pass'))
+def test_main():
+ run_unittest(NetrcTestCase)
if __name__ == "__main__":
- unittest.main()
+ test_main()