Ejemplo n.º 1
0
    def test_add_permanent(self, mock_set_logging, mock_loadConfig, mock_time):
        mock_time.return_value = 0

        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        # add sysDescr and expect it to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 61

        # add snmpOutNoSuchNames and expect sysDescr & snmpOutNoSuchNames
        # to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 122

        # update snmpOutNoSuchNames, but expect sysDescr to still be there

        oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)
Ejemplo n.º 2
0
def addVacmView(snmpEngine, viewName, viewType, subTree, subTreeMask):
    vacmViewTreeFamilyEntry, tblIdx = __cookVacmViewInfo(
        snmpEngine, viewName, subTree)

    # Allow bitmask specification in form of an OID
    if rfc1902.OctetString('.').asOctets() in rfc1902.OctetString(subTreeMask):
        subTreeMask = rfc1902.ObjectIdentifier(subTreeMask)

    if isinstance(subTreeMask, rfc1902.ObjectIdentifier):
        subTreeMask = tuple(subTreeMask)
        if len(subTreeMask) < len(subTree):
            subTreeMask += (1,) * (len(subTree) - len(subTreeMask))

        subTreeMask = rfc1902.OctetString.fromBinaryString(
            ''.join(str(x) for x in subTreeMask))

    snmpEngine.msgAndPduDsp.mibInstrumController.writeVars(
        ((vacmViewTreeFamilyEntry.name + (6,) + tblIdx, 'destroy'),)
    )

    snmpEngine.msgAndPduDsp.mibInstrumController.writeVars(
        ((vacmViewTreeFamilyEntry.name + (1,) + tblIdx, viewName),
         (vacmViewTreeFamilyEntry.name + (2,) + tblIdx, subTree),
         (vacmViewTreeFamilyEntry.name + (3,) + tblIdx, subTreeMask),
         (vacmViewTreeFamilyEntry.name + (4,) + tblIdx, viewType),
         (vacmViewTreeFamilyEntry.name + (6,) + tblIdx, 'createAndGo'))
    )
    def walk(self, oid):
        """Does a SNMP WALK request and returns the result as OID list."""

        if self._active_connection is None:
            raise RuntimeError('No transport host set')

        self._info('Walk starts at OID %s' % (oid, ))
        oid = utils.parse_oid(oid)

        error_indication, error, _, var_bind_table = \
            self._active_connection.cmd_gen.nextCmd(
                self._active_connection.authentication_data,
                self._active_connection.transport_target,
                oid
        )

        if error_indication:
            raise RuntimeError('SNMP WALK failed: %s' % error_indication)
        if error != 0:
            raise RuntimeError('SNMP WALK failed: %s' % error.prettyPrint())

        oids = list()
        for var_bind_table_row in var_bind_table:
            oid, obj = var_bind_table_row[0]
            oid = ''.join(('.', str(oid)))
            if obj.isSuperTypeOf(rfc1902.ObjectIdentifier()):
                obj = ''.join(('.', str(obj)))
            else:
                obj = obj.prettyOut(obj)
            self._info('%s: %s' % (oid, obj))
            oids.append((oid, obj))

        return oids
Ejemplo n.º 4
0
    def test_sendTrap(self, mock_ntforg, mock_snmp_config):

        self.mock_queue = mock.MagicMock

        with mock.patch(
                'bdssnmpadaptor.config.open',
                side_effect=[io.StringIO(self.CONFIG),
                             io.StringIO(self.CONFIG),
                             io.StringIO(self.CONFIG)]):
            ntf = snmp_notificator.SnmpNotificationOriginator(
                mock.MagicMock(config={}), self.mock_queue)

        self.my_loop.run_until_complete(ntf.sendTrap({}))

        mock_snmpEngine = mock_snmp_config.getSnmpEngine.return_value

        expectedVarBinds = [
            (rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.3.0'), mock.ANY),
            (rfc1902.ObjectIdentifier('1.3.6.1.6.3.1.1.4.1.0'), rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.103.1.0.1.1')),
            (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.1.0'), rfc1902.Integer32(1)),
            (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.2.0'), rfc1902.OctetString('error')),
            (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.3.0'), rfc1902.Integer32(0)),
            (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.4.0'), rfc1902.OctetString('error')),
        ]

        ntf._ntfOrg.sendVarBinds.assert_called_once_with(
            mock_snmpEngine, mock.ANY, None, '', expectedVarBinds, mock.ANY)
Ejemplo n.º 5
0
    def test___init__(self):
        oid = oid_db.OidDbItem(
            oid='1.3.6.7.8',
            name='ifIndex',
            value=rfc1902.OctetString(hexValue='123456789'),
        )

        self.assertEqual(rfc1902.ObjectIdentifier('1.3.6.7.8'), oid.oid)
        self.assertEqual('ifIndex', oid.name)
        self.assertEqual(b'\x124Vx\x90', oid.value)
Ejemplo n.º 6
0
    def test_add_expire(self, mock_set_logging, mock_loadConfig, mock_time):
        mock_time.return_value = 0

        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        # add sysDescr.0 and expect it to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 61

        # add sysORDescr.1 and expect sysDescr.0 & sysORDescr.1
        # to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysORDescr', 1, value='descr')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 122

        # add sysORDescr.2 and expect sysORDescr.1 to expire

        oidDb.add('SNMPv2-MIB', 'sysORDescr', 2, value='descr')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        not_expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1')

        oidItem = oidDb.getObjectByOid(not_expected)

        self.assertIsNone(oidItem)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.2')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)
Ejemplo n.º 7
0
    def _get_call_context(self, ac_info, next_flag=False, set_flag=False):
        if ac_info is None:
            return {'nextFlag': next_flag, 'setFlag': set_flag}

        ac_fun, snmp_engine = ac_info  # we injected snmpEngine object earlier

        # this API is first introduced in pysnmp 4.2.6
        execCtx = snmp_engine.observer.getExecutionContext(
            'rfc3412.receiveMessage:request')

        (transport_domain, transport_address, security_model, security_name,
         security_level, context_engine_id, context_name,
         pdu_type) = (execCtx['transportDomain'], execCtx['transportAddress'],
                      execCtx['securityModel'], execCtx['securityName'],
                      execCtx['securityLevel'], execCtx['contextEngineId'],
                      execCtx['contextName'],
                      execCtx['pdu'].__class__.__name__)

        if isinstance(transport_address, udp.UdpTransportAddress):
            transport_protocol = 'udpv4'

        elif isinstance(transport_address, udp6.Udp6TransportAddress):
            transport_protocol = 'udpv6'

        else:
            transport_protocol = 'unknown'

        log.info('SNMP EngineID %s, transportDomain %s, transportAddress %s, '
                 'securityModel %s, securityName %s, securityLevel '
                 '%s' % (hasattr(snmp_engine, 'snmpEngineID')
                         and snmp_engine.snmpEngineID.prettyPrint()
                         or '<unknown>', transport_domain, transport_address,
                         security_model, security_name, security_level))

        return {
            'snmpEngine': snmp_engine,
            'transportDomain': rfc1902.ObjectIdentifier(transport_domain),
            'transportAddress': transport_address,
            'transportEndpoint': transport_address.getLocalAddress(),
            'transportProtocol': transport_protocol,
            'securityModel': security_model,
            'securityName': security_name,
            'securityLevel': security_level,
            'contextEngineId': context_engine_id,
            'contextName': context_name,
            'pduType': pdu_type,
            'nextFlag': next_flag,
            'setFlag': set_flag
        }
Ejemplo n.º 8
0
    def test_add_value(self, mock_set_logging, mock_loadConfig):
        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expectedOid)

        self.assertEqual(expectedOid, oidItem.oid)

        expectedValue = rfc1902.OctetString('my system')
        self.assertEqual(expectedValue, oidItem.value)

        self.assertIsNone(oidItem.code)
Ejemplo n.º 9
0
    def test_add_code(self, mock_set_logging, mock_loadConfig):
        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        code = """
# no op
pass
"""
        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='', code=code)

        expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expectedOid)

        self.assertEqual(expectedOid, oidItem.oid)
        self.assertEqual('', str(oidItem.value))
        self.assertIsInstance(oidItem.code, types.CodeType)
Ejemplo n.º 10
0
    def get_next(self, oid):
        """Does a SNMP GET-NEXT request and returns the result as OID list."""

        if self._active_connection is None:
            raise RuntimeError('No transport host set')

        self._info('GET-NEXT starts at OID %s' % (oid, ))
        oid = utils.parse_oid(oid)
        self._info("This is a test after oid = utils.parse_oid(oid)")
        error_indication, error, _, var_bind_table = \
            self._active_connection.cmd_gen.nextOneCmd(
                self._active_connection.authentication_data,
                self._active_connection.transport_target,
                oid
        )

        if error_indication:
            raise RuntimeError('SNMP GET-NEXT 1 failed: %s' % error_indication)
        if error != 0:
            if error == 13:
                return ()
            else:
                raise RuntimeError('SNMP GET-NEXT 2 failed: %s' %
                                   error.prettyPrint())

        vbTuple = ()
        for var_bind_table_row in var_bind_table:
            oid, obj = var_bind_table_row[0]
            oid = ''.join(('.', str(oid)))
            if obj.isSuperTypeOf(rfc1902.ObjectIdentifier()):
                obj = ''.join(('.', str(obj)))
            else:
                obj = obj.prettyOut(obj)
            self._info('%s: %s' % (oid, obj))
            vbTuple = (oid, obj)

        return vbTuple
Ejemplo n.º 11
0
    def resolveWithMib(self, mibViewController):
        """Perform MIB variable ID and associated value conversion.

        Parameters
        ----------
        mibViewController : :py:class:`~pysnmp.smi.view.MibViewController`
            class instance representing MIB browsing functionality.

        Returns
        -------
        : :py:class:`~pysnmp.smi.rfc1902.ObjectType`
            reference to itself

        Raises
        ------
        SmiError
           In case of fatal MIB hanling errora

        Notes
        -----
        Calling this method involves
        :py:meth:`~pysnmp.smi.rfc1902.ObjectIdentity.resolveWithMib`
        method invocation.

        Examples
        --------
        >>> objectType = ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), 'Linux i386')
        >>> objectType.resolveWithMib(mibViewController)
        ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), DisplayString('Linux i386'))
        >>> str(objectType)
        'SNMPv2-MIB::sysDescr."0" = Linux i386'
        >>>

        """
        if self.__state & self.stClean:
            return self

        self.__args[0].resolveWithMib(mibViewController)

        MibScalar, MibTableColumn = mibViewController.mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar',
                                                                               'MibTableColumn')

        if not isinstance(self.__args[0].getMibNode(),
                          (MibScalar, MibTableColumn)):
            if not isinstance(self.__args[1], AbstractSimpleAsn1Item):
                raise SmiError('MIB object %r is not OBJECT-TYPE (MIB not loaded?)' % (self.__args[0],))
            self.__state |= self.stClean
            return self

        if isinstance(self.__args[1], (rfc1905.UnSpecified,
                                       rfc1905.NoSuchObject,
                                       rfc1905.NoSuchInstance,
                                       rfc1905.EndOfMibView)):
            self.__state |= self.stClean
            return self

        try:
            self.__args[1] = self.__args[0].getMibNode().getSyntax().clone(self.__args[1])
        except PyAsn1Error:
            raise SmiError('MIB object %r having type %r failed to cast value %r: %s' % (
                self.__args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class__.__name__, self.__args[1],
                sys.exc_info()[1]))

        if self.__args[1].isSuperTypeOf(rfc1902.ObjectIdentifier()):
            self.__args[1] = ObjectIdentity(self.__args[1]).resolveWithMib(mibViewController)

        self.__state |= self.stClean

        debug.logger & debug.flagMIB and debug.logger('resolved %r syntax is %r' % (self.__args[0], self.__args[1]))

        return self
Ejemplo n.º 12
0
    def resolveWithMib(self, mibViewController, ignoreErrors=True):
        """Perform MIB variable ID and associated value conversion.

        Parameters
        ----------
        mibViewController : :py:class:`~pysnmp.smi.view.MibViewController`
            class instance representing MIB browsing functionality.

        Other Parameters
        ----------------
        ignoreErrors: :py:class:`bool`
            If `True` (default), ignore MIB object name or value casting
            failures if possible.

        Returns
        -------
        : :py:class:`~pysnmp.smi.rfc1902.ObjectType`
            reference to itself

        Raises
        ------
        SmiError
           In case of fatal MIB hanling errora

        Notes
        -----
        Calling this method involves
        :py:meth:`~pysnmp.smi.rfc1902.ObjectIdentity.resolveWithMib`
        method invocation.

        Examples
        --------
        >>> from pysmi.hlapi import varbinds
        >>> mibViewController = varbinds.AbstractVarBinds.getMibViewController( engine )
        >>> objectType = ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), 'Linux i386')
        >>> objectType.resolveWithMib(mibViewController)
        ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), DisplayString('Linux i386'))
        >>> str(objectType)
        'SNMPv2-MIB::sysDescr."0" = Linux i386'
        >>>

        """
        if self._state & self.ST_CLEAM:
            return self

        self._args[0].resolveWithMib(mibViewController)

        MibScalar, MibTableColumn = mibViewController.mibBuilder.importSymbols(
            'SNMPv2-SMI', 'MibScalar', 'MibTableColumn')

        if not isinstance(self._args[0].getMibNode(),
                          (MibScalar, MibTableColumn)):

            if (ignoreErrors
                    and not isinstance(self._args[1], AbstractSimpleAsn1Item)):
                raise SmiError('MIB object %r is not OBJECT-TYPE '
                               '(MIB not loaded?)' % (self._args[0], ))

            self._state |= self.ST_CLEAM

            return self

        if isinstance(self._args[1],
                      (rfc1905.UnSpecified, rfc1905.NoSuchObject,
                       rfc1905.NoSuchInstance, rfc1905.EndOfMibView)):
            self._state |= self.ST_CLEAM
            return self

        syntax = self._args[0].getMibNode().getSyntax()

        try:
            self._args[1] = syntax.clone(self._args[1])

        except PyAsn1Error as exc:
            err = ('MIB object %r having type %r failed to cast value '
                   '%r: %s' %
                   (self.__args[0].prettyPrint(),
                    self.__args[0].getMibNode().getSyntax().__class__.__name__,
                    self.__args[1], sys.exc_info()[1]))

            debug.logger & debug.FLAG_MIB and debug.logger(err)

            if (not ignoreErrors
                    or not isinstance(self.__args[1], AbstractSimpleAsn1Item)):
                raise SmiError(err)

        if rfc1902.ObjectIdentifier().isSuperTypeOf(self._args[1],
                                                    matchConstraints=False):
            self._args[1] = ObjectIdentity(
                self._args[1]).resolveWithMib(mibViewController)

        self._state |= self.ST_CLEAM

        debug.logger & debug.FLAG_MIB and debug.logger(
            'resolved %r syntax is %r' % (self._args[0], self._args[1]))

        return self
Ejemplo n.º 13
0
class OidDbTestCase(unittest.TestCase):

    MIB_OBJECTS = [
        (('SNMPv2-MIB', 'sysDescr', 0), 'my system'),
        (('SNMPv2-MIB', 'snmpOutNoSuchNames', 0), 123),
        (('SNMPv2-MIB', 'snmpEnableAuthenTraps', 0), 1)
    ]

    OIDS = [
        rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0'),
        rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0'),
        rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.30.0'),
    ]

    def setUp(self):
        with mock.patch.object(oid_db, 'loadConfig', autospec=True):
            with mock.patch.object(oid_db, 'set_logging', autospec=True):
                self.oidDb = oid_db.OidDb(mock.MagicMock(config={}))

                for ident, value in reversed(self.MIB_OBJECTS):
                    self.oidDb.add(*ident, value=value)

        super(OidDbTestCase, self).setUp()

    @mock.patch.object(oid_db, 'loadConfig', autospec=True)
    @mock.patch.object(oid_db, 'set_logging', autospec=True)
    def test_add_value(self, mock_set_logging, mock_loadConfig):
        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expectedOid)

        self.assertEqual(expectedOid, oidItem.oid)

        expectedValue = rfc1902.OctetString('my system')
        self.assertEqual(expectedValue, oidItem.value)

        self.assertIsNone(oidItem.code)

    @mock.patch.object(oid_db, 'loadConfig', autospec=True)
    @mock.patch.object(oid_db, 'set_logging', autospec=True)
    def test_add_code(self, mock_set_logging, mock_loadConfig):
        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        code = """
# no op
pass
"""
        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='', code=code)

        expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expectedOid)

        self.assertEqual(expectedOid, oidItem.oid)
        self.assertEqual('', str(oidItem.value))
        self.assertIsInstance(oidItem.code, types.CodeType)

    @mock.patch('time.time', autospec=True)
    @mock.patch.object(oid_db, 'loadConfig', autospec=True)
    @mock.patch.object(oid_db, 'set_logging', autospec=True)
    def test_add_expire(self, mock_set_logging, mock_loadConfig, mock_time):
        mock_time.return_value = 0

        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        # add sysDescr.0 and expect it to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 61

        # add sysORDescr.1 and expect sysDescr.0 & sysORDescr.1
        # to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysORDescr', 1, value='descr')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 122

        # add sysORDescr.2 and expect sysORDescr.1 to expire

        oidDb.add('SNMPv2-MIB', 'sysORDescr', 2, value='descr')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        not_expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1')

        oidItem = oidDb.getObjectByOid(not_expected)

        self.assertIsNone(oidItem)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.2')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

    @mock.patch('time.time', autospec=True)
    @mock.patch.object(oid_db, 'loadConfig', autospec=True)
    @mock.patch.object(oid_db, 'set_logging', autospec=True)
    def test_add_permanent(self, mock_set_logging, mock_loadConfig, mock_time):
        mock_time.return_value = 0

        oidDb = oid_db.OidDb(mock.MagicMock(config={}))

        # add sysDescr and expect it to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system')

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 61

        # add snmpOutNoSuchNames and expect sysDescr & snmpOutNoSuchNames
        # to be in the OID DB

        oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        mock_time.return_value = 122

        # update snmpOutNoSuchNames, but expect sysDescr to still be there

        oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

        expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0')

        oidItem = oidDb.getObjectByOid(expected)

        self.assertEqual(expected, oidItem.oid)

    def test_getNextOid(self):
        for idx, oid in enumerate(self.OIDS[:-1]):
            nextOid = self.oidDb.getNextOid(oid)

            self.assertEqual(self.OIDS[idx + 1], nextOid)

    def test_getObjFromOid_good(self):
        oidItem = self.oidDb.getObjectByOid(self.OIDS[1])

        self.assertEqual(self.OIDS[1], oidItem.oid)

    def test_getObjFromOid_not_exists(self):
        oidItem = self.oidDb.getObjectByOid(self.OIDS[1] + (1,))

        self.assertIsNone(oidItem)