def test_multiwalk(self): response_1 = readbytes('apiv1/multiwalk_response_1.hex') response_2 = readbytes('apiv1/multiwalk_response_2.hex') response_3 = readbytes('apiv1/multiwalk_response_3.hex') self.transport.send.side_effect = [ response_1, response_2, response_3, ] result = snmp.multiwalk('127.0.0.1', 'private', [ '1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.1.2.1', ]) expected = [ VarBind(OID('1.3.6.1.2.1.2.2.1.1.1'), 1), VarBind(OID('1.3.6.1.2.1.2.2.1.1.6'), 6), ] result = list(result) self.assertEqual(result, expected) expected_types = [ (ObjectIdentifier, int), (ObjectIdentifier, int), ] returned_values = [(row.oid, row.value) for row in result] assert_of_types(returned_values, expected_types)
def test_table_base_oid(self, mck_walk): """ The "table" function should be capable of detecting the "num_base_nodes" value by itself """ mck_walk.return_value = [ VarBind('1.2.1.1.1.1.1', OctetString(b'row 1.1.1 col 1')), VarBind('1.2.1.1.2.1.1', OctetString(b'row 2.1.1 col 1')), VarBind('1.2.1.2.1.1.1', OctetString(b'row 1.1.1 col 2')), VarBind('1.2.1.2.2.1.1', OctetString(b'row 2.1.1 col 2')), ] result = table('192.0.2.1', 'private', '1.2') expected = [ { '0': '1.1.1', '1': OctetString('row 1.1.1 col 1'), '2': OctetString('row 1.1.1 col 2') }, { '0': '2.1.1', '1': OctetString('row 2.1.1 col 1'), '2': OctetString('row 2.1.1 col 2') }, ] self.assertEqual(sorted(result, key=lambda x: x['0']), expected)
def test_walk(self): response_1 = readbytes('walk_response_1.hex') response_2 = readbytes('walk_response_2.hex') response_3 = readbytes('walk_response_3.hex') num_call = 0 def mocked_responses(*args, **kwargs): nonlocal num_call num_call += 1 if num_call == 1: return response_1 elif num_call == 2: return response_2 elif num_call == 3: return response_3 else: raise AssertionError('Expected no more than 3 calls!') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), 10000000), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), 4294967295) ] with patch('puresnmp.send') as mck: mck.side_effect = mocked_responses result = list(walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5')) self.assertEqual(result, expected)
async def test_multi_walk(self): response_1 = readbytes('multiwalk_response_1.hex') response_2 = readbytes('multiwalk_response_2.hex') response_3 = readbytes('multiwalk_response_3.hex') expected = [VarBind( ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.1'), Integer(1) ), VarBind( ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.1'), OctetString(b'lo') ), VarBind( ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.78'), Integer(78) ), VarBind( ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.78'), OctetString(b'eth0') )] with patch('puresnmp.aio.api.raw.Transport') as mck: mck().send = AsyncMock() mck().get_request_id.return_value = 0 mck().send.side_effect = [response_1, response_2, response_3] result = [] async for x in multiwalk('::1', 'public', [ '1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.2.2.1.2' ]): result.append(x) # TODO (advanced): should order matter in the following result? assert len(result) == len(expected)
def test_getnext(self): expected = VarBind('1.3.6.1.6.3.1.1.6.1.0', 354522558) with patch('puresnmp.api.pythonic.raw') as mck: mck.multigetnext.return_value = [ VarBind('1.3.6.1.6.3.1.1.6.1.0', Integer(354522558)) ] result = getnext('::1', 'private', '1.3.6.1.5') self.assertEqual(result, expected)
async def test_getnext(self): expected = VarBind('1.3.6.1.6.3.1.1.6.1.0', 354522558) with patch('puresnmp.aio.api.pythonic.raw', new_callable=AsyncMock) as mck: mck.multigetnext.return_value = [ VarBind('1.3.6.1.6.3.1.1.6.1.0', Integer(354522558)) ] result = await getnext('::1', 'private', '1.3.6.1.5') assert result == expected
def test_traps(self): data_generator = readbytes_multiple("trap_requests.hex") def socket_response_generator(): for blob in data_generator: yield SocketResponse(blob, SocketInfo("192.0.2.1", 64001)) expected = [ VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(794602)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123456)), VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(795345)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123457)), VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(795538)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123459)), ] result = [] with patch('puresnmp.api.raw.Transport') as mck: mck().listen.return_value = socket_response_generator() for trap in traps(): result.extend(trap.varbinds) self.assertEqual(result, expected)
def test_traps(self): data_generator = readbytes_multiple('trap_requests.hex') expected = [ VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(794602)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123456)), VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(795345)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123457)), VarBind(ObjectIdentifier((1, 3, 6, 1, 2, 1, 1, 3, 0)), TimeTicks(795538)), VarBind(ObjectIdentifier((1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0)), ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1))), VarBind(ObjectIdentifier((1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1)), Integer(123459)), ] result = [] with patch('puresnmp.api.raw.Transport') as mck: mck().listen.return_value = data_generator for trap in traps(): result.extend(trap.varbinds) self.assertEqual(result, expected)
async def test_bulkwalk(self): request_ids = [1001613222, 1001613223, 1001613224] with patch('puresnmp.aio.api.pythonic.raw', new_callable=AsyncGenMock) as mck: mck.multiwalk.return_value = [ VarBind('1.3.6.1.2.1.2.2.1.1.1', Integer(1)), VarBind('1.3.6.1.2.1.2.2.1.1.10', Integer(10)), VarBind('1.3.6.1.2.1.2.2.1.2.1', OctetString(b"lo")), VarBind('1.3.6.1.2.1.2.2.1.22.10', ObjectIdentifier(0, 0)) ] result = [] async for x in bulkwalk('127.0.0.1', 'private', ['1.3.6.1.2.1.2.2'], bulk_size=20): result.append(x) expected = [ VarBind('1.3.6.1.2.1.2.2.1.1.1', 1), VarBind('1.3.6.1.2.1.2.2.1.1.10', 10), VarBind('1.3.6.1.2.1.2.2.1.2.1', b"lo"), VarBind('1.3.6.1.2.1.2.2.1.22.10', '0.0'), ] assert result == expected
async def test_multi_walk(self): expected = [ VarBind('1.3.6.1.2.1.2.2.1.1.1', 1), VarBind('1.3.6.1.2.1.2.2.1.2.1', b'lo'), VarBind('1.3.6.1.2.1.2.2.1.1.78', 78), VarBind('1.3.6.1.2.1.2.2.1.2.78', b'eth0') ] with patch('puresnmp.aio.api.pythonic.raw', new_callable=AsyncGenMock) as mck: mck.multiwalk.return_value = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.1'), 1), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.1'), b'lo'), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.78'), 78), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.78'), b'eth0') ] result = [] async for x in multiwalk( '::1', 'public', ['1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.2.2.1.2']): result.append(x) # TODO (advanced): should order matter in the following result? assert len(result) == len(expected)
def test_multi_walk(self): expected = [ VarBind('1.3.6.1.2.1.2.2.1.1.1', 1), VarBind('1.3.6.1.2.1.2.2.1.2.1', b'lo'), VarBind('1.3.6.1.2.1.2.2.1.1.78', 78), VarBind('1.3.6.1.2.1.2.2.1.2.78', b'eth0') ] with patch('puresnmp.api.pythonic.raw') as mck: mck.multiwalk.return_value = [ VarBind( ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.1'), 1, ), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.1'), b'lo'), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.78'), 78), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.78'), b'eth0') ] result = list( multiwalk('::1', 'public', ['1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.2.2.1.2'])) # TODO (advanced): should order matter in the following result? six.assertCountEqual(self, result, expected)
def test_walk(self): expected = [ VarBind('1.3.6.1.2.1.2.2.1.5.1', 10000000), VarBind('1.3.6.1.2.1.2.2.1.5.13', 4294967295) ] with patch('puresnmp.api.pythonic.raw') as mck: mck.walk.return_value = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), Gauge(10000000)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), Integer(4294967295)) ] result = list(walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5')) self.assertEqual(result, expected)
async def test_table(self): with patch('puresnmp.aio.api.pythonic.raw', new_callable=AsyncGenMock) as mck: oid = ObjectIdentifier.from_string mck.walk.return_value = [ VarBind(oid('1.2.1.1'), OctetString(b'test-11')), VarBind(oid('1.2.2.1'), OctetString(b'test-21')), VarBind(oid('1.2.1.2'), OctetString(b'test-21')), VarBind(oid('1.2.2.2'), OctetString(b'test-22')), ] result = await table('1.2.3.4', 'private', ['1.2']) expected = [ {'0': '1', '1': b'test-11', '2': b'test-21'}, {'0': '2', '1': b'test-21', '2': b'test-22'}, ] assert len(result) == len(expected)
def test_walk(self): response_1 = readbytes('walk_response_1.hex') response_2 = readbytes('walk_response_2.hex') response_3 = readbytes('walk_response_3.hex') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), Gauge(10000000)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), Gauge(4294967295)) ] with patch('puresnmp.api.raw.send') as mck: mck.side_effect = [response_1, response_2, response_3] result = list(walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5')) self.assertEqual(result, expected)
async def test_getnext(self): data = readbytes('getnext_response.hex') expected = VarBind('1.3.6.1.6.3.1.1.6.1.0', Integer(354522558)) with patch('puresnmp.aio.api.raw.send', new_callable=AsyncMock) as mck: mck.return_value = data result = await getnext('::1', 'private', '1.3.6.1.5') assert result == expected
def test_getnext(self): data = readbytes('getnext_response.hex') expected = VarBind('1.3.6.1.6.3.1.1.6.1.0', Integer(354522558)) with patch('puresnmp.api.raw.send') as mck: mck.return_value = data result = getnext('::1', 'private', '1.3.6.1.5') self.assertEqual(result, expected)
def test_walk(self): responses = readbytes_multiple('apiv1/walk_response.hex') self.transport.send.side_effect = responses result = snmp.walk('127.0.0.1', 'private', '1.3.6.1.2.1.2.2.1.1') result = list(result) expected = [ VarBind(oid=OID('1.3.6.1.2.1.2.2.1.1.1'), value=1), VarBind(oid=OID('1.3.6.1.2.1.2.2.1.1.12'), value=12) ] six.assertCountEqual(self, result, expected) self.assertEqual(self.transport.send.call_count, 3) expected_types = [ (ObjectIdentifier, int), (ObjectIdentifier, int), ] returned_values = [(row.oid, row.value) for row in result] assert_of_types(returned_values, expected_types)
def test_multigetnext(self): response = readbytes('apiv1/multigetnext_response.hex') self.transport.send.return_value = response result = snmp.multigetnext('192.168.1.1', 'private', ['1.3.6.1.2.1.3.1.1', '1.3.6.1.2.1.4']) expected = [ VarBind(OID('1.3.6.1.2.1.3.1.1.1.12.1.172.17.0.1'), 12), VarBind(OID('1.3.6.1.2.1.4.1.0'), 1) ] self.assertEqual(result, expected) self.assertTrue(self.transport.send.called, 'method was not called') expected_types = [ (ObjectIdentifier, int), (ObjectIdentifier, int), ] returned_values = [(row.oid, row.value) for row in result] returned_types = [(type(row.oid), type(row.value)) for row in result] assert_of_types(returned_values, expected_types)
async def test_walk(self): expected = [ VarBind('1.3.6.1.2.1.2.2.1.5.1', 10000000), VarBind('1.3.6.1.2.1.2.2.1.5.13', 4294967295) ] with patch('puresnmp.aio.api.pythonic.raw', new_callable=AsyncGenMock) as mck: mck.walk.return_value = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), Gauge(10000000)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), Integer(4294967295)) ] result = [] async for x in walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5'): result.append(x) assert result == expected
async def test_walk(self): response_1 = readbytes('walk_response_1.hex') response_2 = readbytes('walk_response_2.hex') response_3 = readbytes('walk_response_3.hex') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), Gauge(10000000)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), Gauge(4294967295)) ] with patch('puresnmp.aio.api.raw.send', new_callable=AsyncMock) as mck: mck.side_effect = [response_1, response_2, response_3] result = [] async for x in walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5'): result.append(x) assert result == expected
def test_getnext(self): response = readbytes('apiv1/getnext_response.hex') self.transport.send.return_value = response result = snmp.getnext('192.168.1.1', 'private', '1.3.6.1.2.1.1.6.0', port=161, timeout=1) expected = VarBind(OID('1.3.6.1.2.1.1.7.0'), 72) self.assertEqual(result, expected) self.assertTrue(self.transport.send.called, 'method was not called') self.assertIsInstance(result.oid, ObjectIdentifier) self.assertIsInstance(result.value, int)
async def test_getnext(self): data = readbytes('getnext_response.hex') expected = VarBind('1.3.6.1.6.3.1.1.6.1.0', Integer(354522558)) with patch('puresnmp.aio.api.raw.Transport') as mck: mck().send = AsyncMock() mck().get_request_id.return_value = 0 mck().send.return_value = data result = await getnext('::1', 'private', '1.3.6.1.5') assert result == expected
async def test_walk(self): response_1 = readbytes('walk_response_1.hex') response_2 = readbytes('walk_response_2.hex') response_3 = readbytes('walk_response_3.hex') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.1'), Gauge(10000000)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.5.13'), Gauge(4294967295)) ] with patch('puresnmp.aio.api.raw.Transport') as mck: mck().send = AsyncMock() mck().send.side_effect = [response_1, response_2, response_3] mck().get_request_id.return_value = 0 result = [] async for x in walk('::1', 'public', '1.3.6.1.2.1.2.2.1.5'): result.append(x) assert result == expected
def test_table_complex_row_id(self, mck_walk): mck_walk.return_value = [ VarBind('1.2.1.1.1.1', OctetString(b'row 1.1.1 col 1')), VarBind('1.2.1.2.1.1', OctetString(b'row 2.1.1 col 1')), VarBind('1.2.2.1.1.1', OctetString(b'row 1.1.1 col 2')), VarBind('1.2.2.2.1.1', OctetString(b'row 2.1.1 col 2')), ] result = table('192.0.2.1', 'private', '1.2', num_base_nodes=2) expected = [ { '0': '1.1.1', '1': OctetString('row 1.1.1 col 1'), '2': OctetString('row 1.1.1 col 2') }, { '0': '2.1.1', '1': OctetString('row 2.1.1 col 1'), '2': OctetString('row 2.1.1 col 2') }, ] self.assertEqual(sorted(result, key=lambda x: x['0']), expected)
def test_multi_walk(self): response_1 = readbytes('multiwalk_response_1.hex') response_2 = readbytes('multiwalk_response_2.hex') response_3 = readbytes('multiwalk_response_3.hex') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.1'), 1), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.1'), b'lo'), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.78'), 78), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.78'), b'eth0') ] with patch('puresnmp.send') as mck: mck.side_effect = [response_1, response_2, response_3] result = list( multiwalk('::1', 'public', ['1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.2.2.1.2'])) # TODO (advanced): should order matter in the following result? self.assertCountEqual(result, expected)
def test_multiwalk_non_containment(self): ''' Running a multiwalk should raise an exception if the agent returns OIDs which are not properly increasing. ''' from puresnmp.pdu import GetResponse OID = ObjectIdentifier.from_string # First case: Returned OIDs are the same response = Sequence( Integer(1), OctetString(b'public'), GetResponse(123, [ VarBind(oid=OID('1.2.3'), value=Integer(30)), VarBind(oid=OID('2.3.4'), value=Integer(40)), ])) with patch('puresnmp.api.raw.Transport') as mck: mck().send.side_effect = [to_bytes(response)] mck().get_request_id.return_value = 0 with self.assertRaises(FaultySNMPImplementation): list(multiwalk('::1', 'public', [ '1.2.3', '2.3.4', ])) # Second case: Returned OIDs are smaller response = Sequence( Integer(1), OctetString(b'public'), GetResponse(123, [ VarBind(oid=OID('1.2.2'), value=Integer(30)), VarBind(oid=OID('2.3.3'), value=Integer(40)), ])) with patch('puresnmp.api.raw.Transport') as mck: mck().send.side_effect = [to_bytes(response)] mck().get_request_id.return_value = 0 with self.assertRaises(FaultySNMPImplementation): list(multiwalk('::1', 'public', [ '1.2.3', '2.3.4', ]))
def test_multi_walk(self): response_1 = readbytes('multiwalk_response_1.hex') response_2 = readbytes('multiwalk_response_2.hex') response_3 = readbytes('multiwalk_response_3.hex') expected = [ VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.1'), Integer(1)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.1'), OctetString(b'lo')), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.1.78'), Integer(78)), VarBind(ObjectIdentifier.from_string('1.3.6.1.2.1.2.2.1.2.78'), OctetString(b'eth0')) ] with patch('puresnmp.api.raw.send') as mck: mck.side_effect = [response_1, response_2, response_3] result = list( multiwalk('::1', 'public', ['1.3.6.1.2.1.2.2.1.1', '1.3.6.1.2.1.2.2.1.2'])) self.assertEqual(result, expected)
def test_traps(self): with patch('puresnmp.api.pythonic.raw') as mck: oid = ObjectIdentifier.from_string mck.traps.return_value = [ Trap(request_id=1, error_status=0, error_index=0, varbinds=[ VarBind(oid('1.2.1.1'), OctetString(b'fake-uptime')), VarBind(oid('1.2.1.2'), ObjectIdentifier(1, 2, 3, 4)), VarBind(oid('1.2.1.3'), Integer(13)), VarBind(oid('1.2.1.4'), OctetString(b'fake-value-2')), ]) ] result = [] for trap in traps(): result.append((trap.uptime, trap.oid, trap.values)) expected = [(b'fake-uptime', u'1.2.3.4', { u'1.2.1.3': 13, u'1.2.1.4': b'fake-value-2', })] self.assertEqual(result, expected)
def test_table(self): with patch('puresnmp.api.pythonic.raw') as mck: oid = ObjectIdentifier.from_string mck.walk.return_value = [ VarBind(oid('1.2.1.1'), OctetString(b'test-11')), VarBind(oid('1.2.2.1'), OctetString(b'test-21')), VarBind(oid('1.2.1.2'), OctetString(b'test-21')), VarBind(oid('1.2.2.2'), OctetString(b'test-22')), ] result = table('1.2.3.4', 'private', ['1.2']) expected = [ { '0': '1', '1': b'test-11', '2': b'test-21' }, { '0': '2', '1': b'test-21', '2': b'test-22' }, ] six.assertCountEqual(self, result, expected)
def test_bulkwalk(self): response = readbytes_multiple('apiv1/bulkwalk_response.hex') self.transport.send.side_effect = response result = list(snmp.bulkwalk('192.168.1.1', 'private', [ '1.3.6.1.2.1.1.9.1.4'])) expected = [ VarBind(OID('1.3.6.1.2.1.1.9.1.4.1'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.2'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.3'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.4'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.5'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.6'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.7'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.8'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.9'), datetime.timedelta(0)), VarBind(OID('1.3.6.1.2.1.1.9.1.4.10'), datetime.timedelta(0)) ] self.assertEqual(result, expected) self.assertTrue(self.transport.send.called, 'method was not called') expected_types = [(ObjectIdentifier, datetime.timedelta)] * 10 returned_values = [(row.oid, row.value) for row in result] assert_of_types(returned_values, expected_types)