1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
"""
Unit tests for stem.descriptor.export.
"""
import StringIO
import unittest
import stem.prereq
import test.runner
from stem.descriptor.export import export_csv, export_csv_file
from test.mocking import get_relay_server_descriptor, \
get_bridge_server_descriptor
try:
# added in python 3.3
from unittest.mock import Mock, patch
except ImportError:
from mock import Mock, patch
class TestExport(unittest.TestCase):
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
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)
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
def test_multiple_descriptors(self):
"""
Exports multiple descriptors, making sure that we get them back in the same
order.
"""
nicknames = ('relay1', 'relay3', 'relay2', 'caerSidi', 'zeus')
descriptors = []
for nickname in nicknames:
router_line = '%s 71.35.133.197 9001 0 0' % nickname
descriptors.append(get_relay_server_descriptor({'router': router_line}))
expected = '\n'.join(nicknames) + '\n'
self.assertEqual(expected, export_csv(descriptors, included_fields = ('nickname',), header = False))
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
def test_file_output(self):
"""
Basic test for the export_csv_file() function, checking that it provides
the same output as export_csv().
"""
desc = get_relay_server_descriptor()
desc_csv = export_csv(desc)
csv_buffer = StringIO.StringIO()
export_csv_file(csv_buffer, desc)
self.assertEqual(desc_csv, csv_buffer.getvalue())
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
def test_excludes_private_attr(self):
"""
Checks that the default attributes for our csv output doesn't include private fields.
"""
# 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)
self.assertTrue(',signature' in desc_csv)
self.assertFalse(',_digest' in desc_csv)
self.assertFalse(',_annotation_lines' in desc_csv)
def test_empty_input(self):
"""
Exercises when we don't provide any descriptors.
"""
self.assertEquals('', export_csv([]))
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
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!'))
@patch('stem.descriptor.server_descriptor.RelayDescriptor._verify_digest', Mock())
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))
|