commit 406205c2549e855140723bc42af874248a6b3026 Author: Damian Johnson atagar@torproject.org Date: Wed May 9 08:42:48 2012 -0700
Extra-info integraion tests
ExtraInfo counterparts for parsing a metrics descriptor and tor's cached file. There's some common bits with the server descriptor tests that I plan to move out. --- run_tests.py | 2 + test/integ/descriptor/__init__.py | 2 +- test/integ/descriptor/extrainfo_descriptor.py | 108 +++++++++++++++++++++++++ test/integ/descriptor/server_descriptor.py | 19 ++--- test/runner.py | 1 + 5 files changed, 119 insertions(+), 13 deletions(-)
diff --git a/run_tests.py b/run_tests.py index bf2c2bc..85a4f65 100755 --- a/run_tests.py +++ b/run_tests.py @@ -36,6 +36,7 @@ import test.integ.socket.control_message import test.integ.socket.control_socket import test.integ.descriptor.reader import test.integ.descriptor.server_descriptor +import test.integ.descriptor.extrainfo_descriptor import test.integ.util.conf import test.integ.util.system import test.integ.process @@ -108,6 +109,7 @@ INTEG_TESTS = ( test.integ.util.system.TestSystem, test.integ.descriptor.reader.TestDescriptorReader, test.integ.descriptor.server_descriptor.TestServerDescriptor, + test.integ.descriptor.extrainfo_descriptor.TestExtraInfoDescriptor, test.integ.version.TestVersion, test.integ.process.TestProcess, test.integ.socket.control_socket.TestControlSocket, diff --git a/test/integ/descriptor/__init__.py b/test/integ/descriptor/__init__.py index b143c2a..ec61ba7 100644 --- a/test/integ/descriptor/__init__.py +++ b/test/integ/descriptor/__init__.py @@ -2,5 +2,5 @@ Integration tests for stem.descriptor.* contents. """
-__all__ = ["reader", "server_descriptor"] +__all__ = ["reader", "extrainfo_descriptor", "server_descriptor"]
diff --git a/test/integ/descriptor/extrainfo_descriptor.py b/test/integ/descriptor/extrainfo_descriptor.py new file mode 100644 index 0000000..74ac7fb --- /dev/null +++ b/test/integ/descriptor/extrainfo_descriptor.py @@ -0,0 +1,108 @@ +""" +Integration tests for stem.descriptor.extrainfo_descriptor. +""" + +import os +import datetime +import unittest + +import stem.descriptor.extrainfo_descriptor +import test.runner + +my_dir = os.path.dirname(__file__) +DESCRIPTOR_TEST_DATA = os.path.join(my_dir, "data") + +# 'test_cached_descriptor' is a lengthy test and uneffected by testing targets, +# so including a flag to prevent it from being ran multiple times + +RAN_CACHED_DESCRIPTOR_TEST = False + +class TestExtraInfoDescriptor(unittest.TestCase): + is_cached_descriptors_available = None + + def setUp(self): + if self.is_cached_descriptors_available is None: + test_dir = test.runner.get_runner().get_test_dir() + descriptor_path = os.path.join(test_dir, "cached-extrainfo") + self.is_cached_descriptors_available = os.path.exists(descriptor_path) + + def test_metrics_descriptor(self): + """ + Parses and checks our results against an extrainfo descriptor from metrics. + """ + + descriptor_path = os.path.join(DESCRIPTOR_TEST_DATA, "extrainfo_descriptor") + + descriptor_file = open(descriptor_path) + descriptor_contents = descriptor_file.read() + descriptor_file.close() + + expected_signature = """-----BEGIN SIGNATURE----- +K5FSywk7qvw/boA4DQcqkls6Ize5vcBYfhQ8JnOeRQC9+uDxbnpm3qaYN9jZ8myj +k0d2aofcVbHr4fPQOSST0LXDrhFl5Fqo5um296zpJGvRUeO6S44U/EfJAGShtqWw +7LZqklu+gVvhMKREpchVqlAwXkWR44VENm24Hs+mT3M= +-----END SIGNATURE-----""" + + desc = stem.descriptor.extrainfo_descriptor.ExtraInfoDescriptor(descriptor_contents) + self.assertEquals("NINJA", desc.nickname) + self.assertEquals("B2289C3EAB83ECD6EB916A2F481A02E6B76A0A48", desc.fingerprint) + self.assertEquals(datetime.datetime(2012, 5, 5, 17, 3, 50), desc.published) + self.assertEquals(datetime.datetime(2012, 5, 5, 17, 2, 45), desc.read_history_end) + self.assertEquals(900, desc.read_history_interval) + self.assertEquals(datetime.datetime(2012, 5, 5, 17, 2, 45), desc.write_history_end) + self.assertEquals(900, desc.write_history_interval) + self.assertEquals(expected_signature, desc.signature) + + # TODO: still missing dirreq-read-history and dirreq-write-history + #self.assertEquals([], desc.get_unrecognized_lines()) + + # The read-history and write-history lines are pretty long so just checking + # the initial contents for the line and parsed values. + + read_start = "2012-05-05 17:02:45 (900 s) 3309568,9216,41984" + self.assertTrue(desc.read_history.startswith(read_start)) + + read_values_start = [3309568, 9216, 41984, 27648, 123904] + self.assertEquals(read_values_start, desc.read_history_values[:5]) + + write_start = "2012-05-05 17:02:45 (900 s) 1082368,19456,50176,272384" + self.assertTrue(desc.write_history.startswith(write_start)) + + write_values_start = [1082368, 19456, 50176, 272384, 485376] + self.assertEquals(write_values_start, desc.write_history_values[:5]) + + def test_cached_descriptor(self): + """ + Parses the cached descriptor file in our data directory, checking that it + doesn't raise any validation issues and looking for unrecognized descriptor + additions. + """ + + descriptor_path = os.path.join(test.runner.get_runner().get_test_dir(), "cached-extrainfo") + + if not self.is_cached_descriptors_available: + self.skipTest("(no cached descriptors)") + + global RAN_CACHED_DESCRIPTOR_TEST + + if RAN_CACHED_DESCRIPTOR_TEST: + self.skipTest("(already ran)") + else: + RAN_CACHED_DESCRIPTOR_TEST = True + + with open(descriptor_path) as descriptor_file: + for desc in stem.descriptor.extrainfo_descriptor.parse_file(descriptor_file): + # TODO: uncomment when we're done implementing the ExtraInfoDescriptor class + #unrecognized_lines = desc.get_unrecognized_lines() + unrecognized_lines = [] + + if unrecognized_lines: + # TODO: This isn't actually a problem, and rather than failing we + # should alert the user about these entries at the end of the tests + # (along with new events, getinfo options, and such). For now though + # there doesn't seem to be anything in practice to trigger this so + # failing to get our attention if it does. + + print "Unrecognized descriptor content: %s" % unrecognized_lines + self.fail() + diff --git a/test/integ/descriptor/server_descriptor.py b/test/integ/descriptor/server_descriptor.py index 5ad700f..a74e4eb 100644 --- a/test/integ/descriptor/server_descriptor.py +++ b/test/integ/descriptor/server_descriptor.py @@ -20,17 +20,17 @@ DESCRIPTOR_TEST_DATA = os.path.join(my_dir, "data") RAN_CACHED_DESCRIPTOR_TEST = False
class TestServerDescriptor(unittest.TestCase): - is_descriptors_available = None + is_cached_descriptors_available = None
def setUp(self): # If this is our first time running the integ tests and we didn't wait for # a full tor initialization then the cached descriptors won't exist yet. # Noting if they exist or not since some tests need them.
- if self.is_descriptors_available is None: + if self.is_cached_descriptors_available is None: test_dir = test.runner.get_runner().get_test_dir() descriptor_path = os.path.join(test_dir, "cached-descriptors") - self.is_descriptors_available = os.path.exists(descriptor_path) + self.is_cached_descriptors_available = os.path.exists(descriptor_path)
def test_metrics_descriptor(self): """ @@ -43,8 +43,6 @@ class TestServerDescriptor(unittest.TestCase): descriptor_contents = descriptor_file.read() descriptor_file.close()
- expected_published = datetime.datetime(2012, 3, 1, 17, 15, 27) - expected_family = [ "$0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1", "$1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6", @@ -85,7 +83,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= self.assertEquals(stem.version.Version("0.2.1.30"), desc.tor_version) self.assertEquals("Linux x86_64", desc.operating_system) self.assertEquals(588217, desc.uptime) - self.assertEquals(expected_published, desc.published) + self.assertEquals(datetime.datetime(2012, 3, 1, 17, 15, 27), desc.published) self.assertEquals("www.atagar.com/contact", desc.contact) self.assertEquals(["1", "2"], desc.link_protocols) self.assertEquals(["1"], desc.circuit_protocols) @@ -170,7 +168,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
descriptor_path = os.path.join(test.runner.get_runner().get_test_dir(), "cached-descriptors")
- if not self.is_descriptors_available: + if not self.is_cached_descriptors_available: self.skipTest("(no cached descriptors)")
global RAN_CACHED_DESCRIPTOR_TEST @@ -211,7 +209,6 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= descriptor_contents = descriptor_file.read() descriptor_file.close()
- expected_published = datetime.datetime(2012, 3, 21, 16, 28, 14) expected_contact = "2048R/F171EC1F Johan Bl\xc3\xa5b\xc3\xa4ck \xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf"
desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents) @@ -225,7 +222,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= self.assertEquals(stem.version.Version("0.2.2.35"), desc.tor_version) self.assertEquals("Linux x86_64", desc.operating_system) self.assertEquals(3103848, desc.uptime) - self.assertEquals(expected_published, desc.published) + self.assertEquals(datetime.datetime(2012, 3, 21, 16, 28, 14), desc.published) self.assertEquals(expected_contact, desc.contact) self.assertEquals(["1", "2"], desc.link_protocols) self.assertEquals(["1"], desc.circuit_protocols) @@ -303,8 +300,6 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= descriptor_contents = descriptor_file.read() descriptor_file.close()
- expected_published = datetime.datetime(2012, 3, 22, 17, 34, 38) - expected_family = [ "$CE396C72A3D0880F74C064FEA79D68C15BD380B9", "$AB8B00C00B1347BA80A88E548FAC9EDF701D7D0E", @@ -322,7 +317,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= self.assertEquals(stem.version.Version("0.2.3.12-alpha"), desc.tor_version) self.assertEquals("Linux x86_64", desc.operating_system) self.assertEquals(186, desc.uptime) - self.assertEquals(expected_published, desc.published) + self.assertEquals(datetime.datetime(2012, 3, 22, 17, 34, 38), desc.published) self.assertEquals("somebody", desc.contact) self.assertEquals(["1", "2"], desc.link_protocols) self.assertEquals(["1"], desc.circuit_protocols) diff --git a/test/runner.py b/test/runner.py index 6acc68e..034f1e5 100644 --- a/test/runner.py +++ b/test/runner.py @@ -63,6 +63,7 @@ ERROR_ATTR = (term.Color.RED, term.Attr.BOLD) BASE_TORRC = """# configuration for stem integration tests DataDirectory %s SocksPort 0 +DownloadExtraInfo 1 """
# We make some paths relative to stem's base directory (the one above us)
tor-commits@lists.torproject.org