test_cmdline_args.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/python
  2. import binascii
  3. import hashlib
  4. import os
  5. import re
  6. import subprocess
  7. import tempfile
  8. import unittest
  9. TOR = "./src/or/tor-cov"
  10. TOPDIR = "."
  11. class UnexpectedSuccess(Exception):
  12. pass
  13. class UnexpectedFailure(Exception):
  14. pass
  15. def run_tor(args, failure=False):
  16. p = subprocess.Popen([TOR] + args, stdout=subprocess.PIPE)
  17. output, _ = p.communicate()
  18. result = p.poll()
  19. if result and not failure:
  20. raise UnexpectedFailure()
  21. elif not result and failure:
  22. raise UnexpectedSuccess()
  23. return output
  24. def lines(s):
  25. out = s.split("\n")
  26. if out and out[-1] == '':
  27. del out[-1]
  28. return out
  29. def strip_log_junk(line):
  30. m = re.match(r'([^\[]+\[[a-z]*\] *)(.*)', line)
  31. if not m:
  32. return ""+line
  33. return m.group(2).strip()
  34. class CmdlineTests(unittest.TestCase):
  35. def test_version(self):
  36. out = run_tor(["--version"])
  37. self.failUnless(out.startswith("Tor version "))
  38. self.assertEquals(len(lines(out)), 1)
  39. def test_quiet(self):
  40. out = run_tor(["--quiet", "--quumblebluffin", "1"], failure=True)
  41. self.assertEquals(out, "")
  42. def test_help(self):
  43. out = run_tor(["--help"], failure=False)
  44. out2 = run_tor(["-h"], failure=False)
  45. self.assert_(out.startswith("Copyright (c) 2001"))
  46. self.assert_(out.endswith(
  47. "tor -f <torrc> [args]\n"
  48. "See man page for options, or https://www.torproject.org/ for documentation.\n"))
  49. self.assert_(out == out2)
  50. def test_hush(self):
  51. torrc = tempfile.NamedTemporaryFile(delete=False)
  52. torrc.close()
  53. try:
  54. out = run_tor(["--hush", "-f", torrc.name,
  55. "--quumblebluffin", "1"], failure=True)
  56. finally:
  57. os.unlink(torrc.name)
  58. self.assertEquals(len(lines(out)), 2)
  59. ln = [ strip_log_junk(l) for l in lines(out) ]
  60. self.assertEquals(ln[0], "Failed to parse/validate config: Unknown option 'quumblebluffin'. Failing.")
  61. self.assertEquals(ln[1], "Reading config failed--see warnings above.")
  62. def test_missing_argument(self):
  63. out = run_tor(["--hush", "--hash-password"], failure=True)
  64. self.assertEquals(len(lines(out)), 2)
  65. ln = [ strip_log_junk(l) for l in lines(out) ]
  66. self.assertEquals(ln[0], "Command-line option '--hash-password' with no value. Failing.")
  67. def test_hash_password(self):
  68. out = run_tor(["--hash-password", "woodwose"])
  69. result = lines(out)[-1]
  70. self.assertEquals(result[:3], "16:")
  71. self.assertEquals(len(result), 61)
  72. r = binascii.a2b_hex(result[3:])
  73. self.assertEquals(len(r), 29)
  74. salt, how, hashed = r[:8], r[8], r[9:]
  75. self.assertEquals(len(hashed), 20)
  76. count = (16 + (ord(how) & 15)) << ((ord(how) >> 4) + 6)
  77. stuff = salt + "woodwose"
  78. repetitions = count // len(stuff) + 1
  79. inp = stuff * repetitions
  80. inp = inp[:count]
  81. self.assertEquals(hashlib.sha1(inp).digest(), hashed)
  82. def test_digests(self):
  83. main_c = os.path.join(TOPDIR, "src", "or", "main.c")
  84. if os.stat(TOR).st_mtime < os.stat(main_c).st_mtime:
  85. self.skipTest(TOR+" not up to date")
  86. out = run_tor(["--digests"])
  87. main_line = [ l for l in lines(out) if l.endswith("/main.c") ]
  88. digest, name = main_line[0].split()
  89. actual = hashlib.sha1(open(main_c).read()).hexdigest()
  90. self.assertEquals(digest, actual)
  91. if __name__ == '__main__':
  92. unittest.main()