Example #1
0
    def test_annotations(self):
        """
    Checks that content before a descriptor are parsed as annotations.
    """

        desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n'
        desc_text += get_relay_server_descriptor(content=True)
        desc_text += b'\ntrailing text that should be invalid, ho hum'

        # running _parse_file should provide an iterator with a single descriptor
        desc_iter = stem.descriptor.server_descriptor._parse_file(
            io.BytesIO(desc_text), validate=True)
        self.assertRaises(ValueError, list, desc_iter)

        desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n'
        desc_text += get_relay_server_descriptor(content=True)
        desc_iter = stem.descriptor.server_descriptor._parse_file(
            io.BytesIO(desc_text))

        desc_entries = list(desc_iter)
        self.assertEqual(1, len(desc_entries))
        desc = desc_entries[0]

        self.assertEqual('caerSidi', desc.nickname)
        self.assertEqual(b'@pepperjack very tasty',
                         desc.get_annotation_lines()[0])
        self.assertEqual(b'@mushrooms not so much',
                         desc.get_annotation_lines()[1])
        self.assertEqual(
            {
                b'@pepperjack': b'very tasty',
                b'@mushrooms': b'not so much'
            }, desc.get_annotations())
        self.assertEqual([], desc.get_unrecognized_lines())
Example #2
0
  def test_outdated_relays(self, downloader_mock, stdout_mock):
    def tutorial_example():
      from stem.descriptor.remote import DescriptorDownloader
      from stem.version import Version

      downloader = DescriptorDownloader()
      count, with_contact = 0, 0

      print("Checking for outdated relays...\n")

      for desc in downloader.get_server_descriptors():
        if desc.tor_version < Version('0.2.3.0'):
          count += 1

          if desc.contact:
            print('  %-15s %s' % (desc.tor_version, desc.contact.decode("utf-8", "replace")))
            with_contact += 1

      print("\n%i outdated relays found, %i had contact information" % (count, with_contact))

    downloader_mock().get_server_descriptors.return_value = [
      get_relay_server_descriptor({'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Random Person [email protected]', 'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Sambuddha Basu', 'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
    ]

    tutorial_example()

    self.assert_equal_unordered(OUTDATED_RELAYS_OUTPUT, stdout_mock.getvalue())
Example #3
0
  def test_annotations(self):
    """
    Checks that content before a descriptor are parsed as annotations.
    """

    desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n'
    desc_text += get_relay_server_descriptor(content = True)
    desc_text += b'\ntrailing text that should be invalid, ho hum'

    # running _parse_file should provide an iterator with a single descriptor
    desc_iter = stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_text), validate = True)
    self.assertRaises(ValueError, list, desc_iter)

    desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n'
    desc_text += get_relay_server_descriptor(content = True)
    desc_iter = stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_text))

    desc_entries = list(desc_iter)
    self.assertEqual(1, len(desc_entries))
    desc = desc_entries[0]

    self.assertEqual('caerSidi', desc.nickname)
    self.assertEqual(b'@pepperjack very tasty', desc.get_annotation_lines()[0])
    self.assertEqual(b'@mushrooms not so much', desc.get_annotation_lines()[1])
    self.assertEqual({b'@pepperjack': b'very tasty', b'@mushrooms': b'not so much'}, desc.get_annotations())
    self.assertEqual([], desc.get_unrecognized_lines())
  def test_outdated_relays(self, downloader_mock, stdout_mock):
    def tutorial_example():
      from stem.descriptor.remote import DescriptorDownloader
      from stem.version import Version

      downloader = DescriptorDownloader()
      count, with_contact = 0, 0

      print('Checking for outdated relays...\n')

      for desc in downloader.get_server_descriptors():
        if desc.tor_version < Version('0.2.3.0'):
          count += 1

          if desc.contact:
            print('  %-15s %s' % (desc.tor_version, desc.contact.decode('utf-8', 'replace')))
            with_contact += 1

      print('\n%i outdated relays found, %i had contact information' % (count, with_contact))

    downloader_mock().get_server_descriptors.return_value = [
      get_relay_server_descriptor({'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Random Person [email protected]', 'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Sambuddha Basu', 'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
    ]

    tutorial_example()

    self.assert_equal_unordered(OUTDATED_RELAYS_OUTPUT, stdout_mock.getvalue())
Example #5
0
  def test_mirror_mirror_on_the_wall_4(self):
    def tutorial_example():
      from stem.control import Controller
      from stem.util import str_tools

      # provides a mapping of observed bandwidth to the relay nicknames
      def get_bw_to_relay():
        bw_to_relay = {}

        with Controller.from_port(control_port = 9051) as controller:
          controller.authenticate()

          for desc in controller.get_server_descriptors():
            if desc.exit_policy.is_exiting_allowed():
              bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname)

        return bw_to_relay

      # prints the top fifteen relays

      bw_to_relay = get_bw_to_relay()
      count = 1

      for bw_value in sorted(bw_to_relay.keys(), reverse = True):
        for nickname in bw_to_relay[bw_value]:
          print "%i. %s (%s/s)" % (count, nickname, str_tools.get_size_label(bw_value, 2))
          count += 1

          if count > 15:
            return

    exit_descriptor = mocking.get_relay_server_descriptor({
      'router': 'speedyexit 149.255.97.109 9001 0 0'
    }, content = True).replace(b'reject *:*', b'accept *:*')

    exit_descriptor = mocking.sign_descriptor_content(exit_descriptor)
    exit_descriptor = RelayDescriptor(exit_descriptor)

    controller = mocking.get_object(Controller, {
      'authenticate': mocking.no_op(),
      'close': mocking.no_op(),
      'get_server_descriptors': mocking.return_value([
        exit_descriptor,
        mocking.get_relay_server_descriptor(),  # non-exit
        exit_descriptor,
        exit_descriptor,
      ])
    })

    mocking.mock(
      Controller.from_port, mocking.return_value(controller),
      target_module = Controller,
      is_static = True,
    )

    tutorial_example()
    self.assertEqual(MIRROR_MIRROR_OUTPUT, self.stdout.getvalue())
Example #6
0
  def test_outdated_relays(self, downloader_mock, stdout_mock):
    downloader_mock().get_server_descriptors.return_value = [
      get_relay_server_descriptor({'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Random Person [email protected]', 'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}),
      get_relay_server_descriptor({'opt': 'contact Sambuddha Basu', 'platform': 'node-Tor 0.1.0 on Linux x86_64'}),
    ]

    exec_documentation_example('outdated_relays.py')

    self.assert_equal_unordered(OUTDATED_RELAYS_OUTPUT, stdout_mock.getvalue())
Example #7
0
  def test_published_leap_year(self):
    """
    Constructs with a published entry for a leap year, and when the date is
    invalid.
    """

    desc_text = get_relay_server_descriptor({"published": "2011-02-29 04:03:19"}, content = True)
    self._expect_invalid_attr(desc_text, "published")

    desc_text = get_relay_server_descriptor({"published": "2012-02-29 04:03:19"}, content = True)
    expected_published = datetime.datetime(2012, 2, 29, 4, 3, 19)
    self.assertEquals(expected_published, RelayDescriptor(desc_text).published)
Example #8
0
    def test_parse_with_non_int_version(self):
        """
    Checks a 'proto' line with non-numeric content.
    """

        try:
            get_relay_server_descriptor({'proto': 'Desc=hi Link=1-4'})
            self.fail('Did not raise expected exception')
        except ValueError as exc:
            self.assertEqual(
                'Protocol values should be a number or number range, but was: proto Desc=hi Link=1-4',
                str(exc))
Example #9
0
    def test_mirror_mirror_on_the_wall_5(self, downloader_mock, stdout_mock):
        def tutorial_example():
            from stem.descriptor.remote import DescriptorDownloader
            from stem.util import str_tools

            # provides a mapping of observed bandwidth to the relay nicknames
            def get_bw_to_relay():
                bw_to_relay = {}

                downloader = DescriptorDownloader()

                try:
                    for desc in downloader.get_server_descriptors().run():
                        if desc.exit_policy.is_exiting_allowed():
                            bw_to_relay.setdefault(desc.observed_bandwidth,
                                                   []).append(desc.nickname)
                except Exception as exc:
                    print('Unable to retrieve the server descriptors: %s' %
                          exc)

                return bw_to_relay

            # prints the top fifteen relays

            bw_to_relay = get_bw_to_relay()
            count = 1

            for bw_value in sorted(bw_to_relay.keys(), reverse=True):
                for nickname in bw_to_relay[bw_value]:
                    print('%i. %s (%s/s)' %
                          (count, nickname, str_tools.size_label(bw_value, 2)))
                    count += 1

                    if count > 15:
                        return

        exit_descriptor = mocking.get_relay_server_descriptor(
            {
                'router': 'speedyexit 149.255.97.109 9001 0 0'
            }, content=True).replace(b'reject *:*', b'accept *:*')

        exit_descriptor = mocking.sign_descriptor_content(exit_descriptor)
        exit_descriptor = RelayDescriptor(exit_descriptor)

        downloader_mock().get_server_descriptors().run.return_value = [
            exit_descriptor,
            mocking.get_relay_server_descriptor(),  # non-exit
            exit_descriptor,
            exit_descriptor,
        ]

        tutorial_example()
        self.assertEqual(MIRROR_MIRROR_OUTPUT, stdout_mock.getvalue())
Example #10
0
  def test_published_leap_year(self):
    """
    Constructs with a published entry for a leap year, and when the date is
    invalid.
    """

    desc_text = get_relay_server_descriptor({'published': '2011-02-29 04:03:19'}, content = True)
    self._expect_invalid_attr(desc_text, 'published')

    desc_text = get_relay_server_descriptor({'published': '2012-02-29 04:03:19'}, content = True)
    expected_published = datetime.datetime(2012, 2, 29, 4, 3, 19)
    self.assertEqual(expected_published, RelayDescriptor(desc_text).published)
Example #11
0
    def test_protocols_with_no_mapping(self):
        """
    Checks a 'proto' line when it's not key=value pairs.
    """

        try:
            get_relay_server_descriptor({'proto': 'Desc Link=1-4'})
            self.fail('Did not raise expected exception')
        except ValueError as exc:
            self.assertEqual(
                "Protocol entires are expected to be a series of 'key=value' pairs but was: proto Desc Link=1-4",
                str(exc))
Example #12
0
    def test_mirror_mirror_on_the_wall_4(self, from_port_mock, stdout_mock):
        def tutorial_example():
            from stem.control import Controller
            from stem.util import str_tools

            # provides a mapping of observed bandwidth to the relay nicknames
            def get_bw_to_relay():
                bw_to_relay = {}

                with Controller.from_port(control_port=9051) as controller:
                    controller.authenticate()

                    for desc in controller.get_server_descriptors():
                        if desc.exit_policy.is_exiting_allowed():
                            bw_to_relay.setdefault(desc.observed_bandwidth,
                                                   []).append(desc.nickname)

                return bw_to_relay

            # prints the top fifteen relays

            bw_to_relay = get_bw_to_relay()
            count = 1

            for bw_value in sorted(bw_to_relay.keys(), reverse=True):
                for nickname in bw_to_relay[bw_value]:
                    print "%i. %s (%s/s)" % (
                        count, nickname, str_tools.get_size_label(bw_value, 2))
                    count += 1

                    if count > 15:
                        return

        exit_descriptor = mocking.get_relay_server_descriptor(
            {
                'router': 'speedyexit 149.255.97.109 9001 0 0'
            }, content=True).replace(b'reject *:*', b'accept *:*')

        exit_descriptor = mocking.sign_descriptor_content(exit_descriptor)
        exit_descriptor = RelayDescriptor(exit_descriptor)

        controller = from_port_mock().__enter__()
        controller.get_server_descriptors.return_value = [
            exit_descriptor,
            mocking.get_relay_server_descriptor(),  # non-exit
            exit_descriptor,
            exit_descriptor,
        ]

        tutorial_example()
        self.assertEqual(MIRROR_MIRROR_OUTPUT, stdout_mock.getvalue())
Example #13
0
  def test_mirror_mirror_on_the_wall(self):
    from stem.descriptor.server_descriptor import RelayDescriptor
    from stem.descriptor.reader import DescriptorReader
    from stem.util import str_tools

    exit_descriptor = mocking.get_relay_server_descriptor({
     'router': 'speedyexit 149.255.97.109 9001 0 0'
    }, content = True).replace('reject *:*', 'accept *:*')
    exit_descriptor = mocking.sign_descriptor_content(exit_descriptor)
    exit_descriptor = RelayDescriptor(exit_descriptor)

    reader_wrapper = mocking.get_object(DescriptorReader, {
      '__enter__': lambda x: x,
      '__exit__': mocking.no_op(),
      '__iter__': mocking.return_value(iter((
        exit_descriptor,
        mocking.get_relay_server_descriptor(),  # non-exit
        exit_descriptor,
        exit_descriptor,
      )))
    })

    # provides a mapping of observed bandwidth to the relay nicknames
    def get_bw_to_relay():
      bw_to_relay = {}

      with reader_wrapper as reader:
        for desc in reader:
          if desc.exit_policy.is_exiting_allowed():
            bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname)

      return bw_to_relay

    # prints the top fifteen relays

    bw_to_relay = get_bw_to_relay()
    count = 1

    for bw_value in sorted(bw_to_relay.keys(), reverse = True):
      for nickname in bw_to_relay[bw_value]:
        expected_line = "%i. speedyexit (102.13 KB/s)" % count
        printed_line = "%i. %s (%s/s)" % (count, nickname, str_tools.get_size_label(bw_value, 2))
        self.assertEqual(expected_line, printed_line)

        count += 1

        if count > 15:
          return

    self.assertEqual(4, count)
Example #14
0
  def test_mirror_mirror_on_the_wall_5(self, downloader_mock, stdout_mock):
    def tutorial_example():
      from stem.descriptor.remote import DescriptorDownloader
      from stem.util import str_tools

      # provides a mapping of observed bandwidth to the relay nicknames
      def get_bw_to_relay():
        bw_to_relay = {}

        downloader = DescriptorDownloader()

        try:
          for desc in downloader.get_server_descriptors().run():
            if desc.exit_policy.is_exiting_allowed():
              bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname)
        except Exception as exc:
          print('Unable to retrieve the server descriptors: %s' % exc)

        return bw_to_relay

      # prints the top fifteen relays

      bw_to_relay = get_bw_to_relay()
      count = 1

      for bw_value in sorted(bw_to_relay.keys(), reverse = True):
        for nickname in bw_to_relay[bw_value]:
          print('%i. %s (%s/s)' % (count, nickname, str_tools.size_label(bw_value, 2)))
          count += 1

          if count > 15:
            return

    exit_descriptor = mocking.get_relay_server_descriptor({
      'router': 'speedyexit 149.255.97.109 9001 0 0'
    }, content = True).replace(b'reject *:*', b'accept *:*')

    exit_descriptor = mocking.sign_descriptor_content(exit_descriptor)
    exit_descriptor = RelayDescriptor(exit_descriptor)

    downloader_mock().get_server_descriptors().run.return_value = [
      exit_descriptor,
      mocking.get_relay_server_descriptor(),  # non-exit
      exit_descriptor,
      exit_descriptor,
    ]

    tutorial_example()
    self.assertEqual(MIRROR_MIRROR_OUTPUT, stdout_mock.getvalue())
Example #15
0
  def test_nickname_missing(self):
    """
    Constructs with a malformed router entry.
    """

    desc_text = get_relay_server_descriptor({"router": " 71.35.133.197 9001 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "nickname")
Example #16
0
  def test_port_newline(self):
    """
    Constructs with a newline replacing the ORPort.
    """

    desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 \n 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "or_port")
Example #17
0
  def test_with_opt(self):
    """
    Includes an 'opt <keyword> <value>' entry.
    """

    desc = get_relay_server_descriptor({'opt': 'contact www.atagar.com/contact/'})
    self.assertEqual(b'www.atagar.com/contact/', desc.contact)
Example #18
0
  def test_unrecognized_line(self):
    """
    Includes unrecognized content in the descriptor.
    """

    desc = get_relay_server_descriptor({'pepperjack': 'is oh so tasty!'})
    self.assertEqual(['pepperjack is oh so tasty!'], desc.get_unrecognized_lines())
Example #19
0
  def test_published_no_time(self):
    """
    Constructs with a published entry without a time component.
    """

    desc_text = get_relay_server_descriptor({"published": "2012-01-01"}, content = True)
    self._expect_invalid_attr(desc_text, "published")
Example #20
0
  def test_nickname_too_long(self):
    """
    Constructs with a nickname that is an invalid length.
    """

    desc_text = get_relay_server_descriptor({"router": "saberrider2008ReallyLongNickname 71.35.133.197 9001 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "nickname", "saberrider2008ReallyLongNickname")
Example #21
0
  def test_address_malformed(self):
    """
    Constructs with an invalid ip address.
    """

    desc_text = get_relay_server_descriptor({"router": "caerSidi 371.35.133.197 9001 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "address", "371.35.133.197")
Example #22
0
  def test_ntor_onion_key(self):
    """
    Checks a 'ntor-onion-key' line.
    """

    desc = get_relay_server_descriptor({'ntor-onion-key': 'Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU='})
    self.assertEqual('Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU=', desc.ntor_onion_key)
Example #23
0
 def test_port_newline(self):
   """
   Constructs with a newline replacing the ORPort.
   """
   
   desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 \n 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "or_port")
Example #24
0
  def test_with_opt(self):
    """
    Includes an 'opt <keyword> <value>' entry.
    """

    desc = get_relay_server_descriptor({"opt": "contact www.atagar.com/contact/"})
    self.assertEquals(b"www.atagar.com/contact/", desc.contact)
    def test_proceeding_line(self):
        """
    Includes a line prior to the 'router' entry.
    """

        desc_text = "hibernate 1\n" + get_relay_server_descriptor(content=True)
        self._expect_invalid_attr(desc_text)
Example #26
0
 def test_published_no_time(self):
   """
   Constructs with a published entry without a time component.
   """
   
   desc_text = get_relay_server_descriptor({"published": "2012-01-01"}, content = True)
   self._expect_invalid_attr(desc_text, "published")
Example #27
0
    def test_annotations(self):
        """
    Checks that content before a descriptor are parsed as annotations.
    """

        desc_text = b"@pepperjack very tasty\n@mushrooms not so much\n"
        desc_text += get_relay_server_descriptor(content=True)
        desc_text += b"\ntrailing text that should be ignored, ho hum"

        # running _parse_file should provide an iterator with a single descriptor
        desc_iter = stem.descriptor.server_descriptor._parse_file(
            io.BytesIO(desc_text))
        desc_entries = list(desc_iter)
        self.assertEquals(1, len(desc_entries))
        desc = desc_entries[0]

        self.assertEquals("caerSidi", desc.nickname)
        self.assertEquals(b"@pepperjack very tasty",
                          desc.get_annotation_lines()[0])
        self.assertEquals(b"@mushrooms not so much",
                          desc.get_annotation_lines()[1])
        self.assertEquals(
            {
                b"@pepperjack": b"very tasty",
                b"@mushrooms": b"not so much"
            }, desc.get_annotations())
        self.assertEquals([], desc.get_unrecognized_lines())
Example #28
0
  def test_port_malformed(self):
    """
    Constructs with an ORPort that isn't numeric.
    """

    desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 900a1 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "or_port")
Example #29
0
  def test_nickname_invalid_char(self):
    """
    Constructs with an invalid relay nickname.
    """

    desc_text = get_relay_server_descriptor({"router": "$aberrider2008 71.35.133.197 9001 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "nickname", "$aberrider2008")
Example #30
0
  def test_unrecognized_line(self):
    """
    Includes unrecognized content in the descriptor.
    """

    desc = get_relay_server_descriptor({"pepperjack": "is oh so tasty!"})
    self.assertEquals(["pepperjack is oh so tasty!"], desc.get_unrecognized_lines())
Example #31
0
  def test_protocols_no_circuit_versions(self):
    """
    Constructs with a protocols line without circuit versions.
    """

    desc_text = get_relay_server_descriptor({"opt": "protocols Link 1 2"}, content = True)
    self._expect_invalid_attr(desc_text, "circuit_protocols")
Example #32
0
 def test_port_malformed(self):
   """
   Constructs with an ORPort that isn't numeric.
   """
   
   desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 900a1 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "or_port")
    def test_trailing_line(self):
        """
    Includes a line after the 'router-signature' entry.
    """

        desc_text = get_relay_server_descriptor(content=True) + "\nhibernate 1"
        self._expect_invalid_attr(desc_text)
Example #34
0
 def test_protocols_no_circuit_versions(self):
   """
   Constructs with a protocols line without circuit versions.
   """
   
   desc_text = get_relay_server_descriptor({"opt": "protocols Link 1 2"}, content = True)
   self._expect_invalid_attr(desc_text, "circuit_protocols")
Example #35
0
  def test_ntor_onion_key(self):
    """
    Checks a 'ntor-onion-key' line.
    """

    desc = get_relay_server_descriptor({"ntor-onion-key": "Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU="})
    self.assertEquals("Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU=", desc.ntor_onion_key)
Example #36
0
  def test_port_too_high(self):
    """
    Constructs with an ORPort that is too large.
    """

    desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 900001 0 0"}, content = True)
    self._expect_invalid_attr(desc_text, "or_port", 900001)
Example #37
0
 def test_nickname_missing(self):
   """
   Constructs with a malformed router entry.
   """
   
   desc_text = get_relay_server_descriptor({"router": " 71.35.133.197 9001 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "nickname")
Example #38
0
 def test_nickname_too_long(self):
   """
   Constructs with a nickname that is an invalid length.
   """
   
   desc_text = get_relay_server_descriptor({"router": "saberrider2008ReallyLongNickname 71.35.133.197 9001 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "nickname", "saberrider2008ReallyLongNickname")
Example #39
0
 def test_proceeding_line(self):
   """
   Includes a line prior to the 'router' entry.
   """
   
   desc_text = "hibernate 1\n" + get_relay_server_descriptor(content = True)
   self._expect_invalid_attr(desc_text)
Example #40
0
 def test_trailing_line(self):
   """
   Includes a line after the 'router-signature' entry.
   """
   
   desc_text = get_relay_server_descriptor(content = True) + "\nhibernate 1"
   self._expect_invalid_attr(desc_text)
Example #41
0
 def test_unrecognized_line(self):
   """
   Includes unrecognized content in the descriptor.
   """
   
   desc = get_relay_server_descriptor({"pepperjack": "is oh so tasty!"})
   self.assertEquals(["pepperjack is oh so tasty!"], desc.get_unrecognized_lines())
Example #42
0
 def test_with_opt(self):
   """
   Includes an 'opt <keyword> <value>' entry.
   """
   
   desc = get_relay_server_descriptor({"opt": "contact www.atagar.com/contact/"})
   self.assertEquals("www.atagar.com/contact/", desc.contact)
Example #43
0
    def test_minimal_descriptor(self):
        """
    Exports a single minimal tor server descriptor.
    """

        # we won't have a header prior to python 2.7
        if not stem.prereq.is_python_27():
            test.runner.skip(self, "(header added in python 2.7)")
            return

        desc = get_relay_server_descriptor()

        desc_csv = export_csv(desc,
                              included_fields=('nickname', 'address',
                                               'published'),
                              header=False)
        expected = "caerSidi,71.35.133.197,2012-03-01 17:15:27\n"
        self.assertEquals(expected, desc_csv)

        desc_csv = export_csv(desc,
                              included_fields=('nickname', 'address',
                                               'published'),
                              header=True)
        expected = "nickname,address,published\n" + expected
        self.assertEquals(expected, desc_csv)
Example #44
0
 def test_nickname_invalid_char(self):
   """
   Constructs with an invalid relay nickname.
   """
   
   desc_text = get_relay_server_descriptor({"router": "$aberrider2008 71.35.133.197 9001 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "nickname", "$aberrider2008")
Example #45
0
 def test_address_malformed(self):
   """
   Constructs with an invalid ip address.
   """
   
   desc_text = get_relay_server_descriptor({"router": "caerSidi 371.35.133.197 9001 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "address", "371.35.133.197")
Example #46
0
    def test_invalid_attributes(self):
        """
    Attempts to make a csv with attributes that don't exist.
    """

        desc = get_relay_server_descriptor()
        self.assertRaises(ValueError, export_csv, desc, ('nickname', 'blarg!'))
Example #47
0
 def test_port_too_high(self):
   """
   Constructs with an ORPort that is too large.
   """
   
   desc_text = get_relay_server_descriptor({"router": "caerSidi 71.35.133.197 900001 0 0"}, content = True)
   self._expect_invalid_attr(desc_text, "or_port", 900001)
Example #48
0
 def test_invalid_attributes(self):
   """
   Attempts to make a csv with attributes that don't exist.
   """
   
   desc = get_relay_server_descriptor()
   self.assertRaises(ValueError, export_csv, desc, ('nickname', 'blarg!'))
Example #49
0
    def test_mirror_mirror_on_the_wall_4(self, reader_mock, stdout_mock):
        reader = reader_mock().__enter__()
        reader.__iter__.return_value = iter(
            [mocking.get_relay_server_descriptor()])

        exec_documentation_example('past_descriptors.py')
        self.assertEqual('found relay caerSidi (None)\n',
                         stdout_mock.getvalue())
Example #50
0
    def test_unrecognized_line(self):
        """
    Includes unrecognized content in the descriptor.
    """

        desc = get_relay_server_descriptor({'pepperjack': 'is oh so tasty!'})
        self.assertEqual(['pepperjack is oh so tasty!'],
                         desc.get_unrecognized_lines())
Example #51
0
    def test_with_opt(self):
        """
    Includes an 'opt <keyword> <value>' entry.
    """

        desc = get_relay_server_descriptor(
            {'opt': 'contact www.atagar.com/contact/'})
        self.assertEqual(b'www.atagar.com/contact/', desc.contact)
Example #52
0
    def test_address_malformed(self):
        """
    Constructs with an invalid ip address.
    """

        desc_text = get_relay_server_descriptor(
            {'router': 'caerSidi 371.35.133.197 9001 0 0'}, content=True)
        self._expect_invalid_attr(desc_text, 'address', '371.35.133.197')
Example #53
0
 def test_multiple_descriptor_types(self):
   """
   Attempts to make a csv with multiple descriptor types.
   """
   
   server_desc = get_relay_server_descriptor()
   bridge_desc = get_bridge_server_descriptor()
   self.assertRaises(ValueError, export_csv, (server_desc, bridge_desc))
Example #54
0
  def test_ipv6_policy(self):
    """
    Checks a 'ipv6-policy' line.
    """

    expected = stem.exit_policy.MicroExitPolicy('accept 22-23,53,80,110')
    desc = get_relay_server_descriptor({'ipv6-policy': 'accept 22-23,53,80,110'})
    self.assertEqual(expected, desc.exit_policy_v6)
Example #55
0
 def test_ipv6_policy(self):
   """
   Checks a 'ipv6-policy' line.
   """
   
   expected = stem.exit_policy.MicrodescriptorExitPolicy("accept 22-23,53,80,110")
   desc = get_relay_server_descriptor({"ipv6-policy": "accept 22-23,53,80,110"})
   self.assertEquals(expected, desc.exit_policy_v6)
Example #56
0
    def test_multiple_descriptor_types(self):
        """
    Attempts to make a csv with multiple descriptor types.
    """

        server_desc = get_relay_server_descriptor()
        bridge_desc = get_bridge_server_descriptor()
        self.assertRaises(ValueError, export_csv, (server_desc, bridge_desc))
Example #57
0
  def test_duplicate_field(self):
    """
    Constructs with a field appearing twice.
    """

    desc_text = get_relay_server_descriptor({'<replace>': ''}, content = True)
    desc_text = desc_text.replace(b'<replace>', b'contact foo\ncontact bar')
    self._expect_invalid_attr(desc_text, 'contact', b'foo')
Example #58
0
 def test_duplicate_field(self):
   """
   Constructs with a field appearing twice.
   """
   
   desc_text = get_relay_server_descriptor({"<replace>": ""}, content = True)
   desc_text = desc_text.replace("<replace>", "contact foo\ncontact bar")
   self._expect_invalid_attr(desc_text, "contact", "foo")
Example #59
0
 def test_bridge_unsanitized_relay(self):
   """
   Checks that parsing a normal relay descriptor as a bridge will fail due to
   its unsanatized content.
   """
   
   desc_text = get_relay_server_descriptor({"router-digest": "006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4"}, content = True)
   desc = BridgeDescriptor(desc_text)
   self.assertFalse(desc.is_scrubbed())