def testNameAppendAndExtract(self):
        size = 10

        iblt = InvertibleBloomLookupTable(size)
        prefix = Name("/test/memphis").appendNumber(1).toUri()
        newHash = Common.murmurHash3Blob(11, prefix)
        iblt.insert(newHash)

        expectedEncoding = [
            0x78, 0xda, 0x63, 0x64, 0x60, 0x60, 0xd8, 0x55, 0xb5, 0xfc, 0x5b,
            0xb2, 0xef, 0xe2, 0x6c, 0x06, 0x0a, 0x00, 0x23, 0x1d, 0xcd, 0x01,
            0x00, 0x65, 0x29, 0x0d, 0xb1
        ]

        ibltName = Name("sync")
        encodedIblt = iblt.encode()
        self.assertTrue(encodedIblt.equals(Blob(expectedEncoding)))
        ibltName.append(encodedIblt)

        received = InvertibleBloomLookupTable(size)
        received.initialize(ibltName.get(-1).getValue())

        self.assertTrue(iblt.equals(received))

        receivedDifferentSize = InvertibleBloomLookupTable(20)
        try:
            receivedDifferentSize.initialize(ibltName.get(-1).getValue())
            self.fail("Did not throw the expected exception")
        except RuntimeError:
            pass
        else:
            self.fail("Did not throw the expected exception")
Ejemplo n.º 2
0
    def test_append(self):
        # could possibly split this into different tests
        uri = "/localhost/user/folders/files/%00%0F"
        name = Name(uri)
        name2 = Name("/localhost").append(Name("/user/folders/"))
        self.assertEqual(name2.size(), 3, 'Name constructed by appending names has ' + str(name2.size()) + ' components instead of 3')
        self.assertTrue(name2.get(2).getValue().equals(Blob(bytearray("folders"))), 'Name constructed with append has wrong suffix')
        name2 = name2.append("files")
        self.assertEqual(name2.size(), 4, 'Name constructed by appending string has ' + str(name2.size()) + ' components instead of 4')
        name2 = name2.appendSegment(15)
        self.assertTrue(name2.get(4).getValue().equals(Blob(bytearray([0x00, 0x0F]))), 'Name constructed by appending segment has wrong segment value')

        self.assertTrue(name2.equals(name), 'Name constructed with append is not equal to URI constructed name')
        self.assertEqual(name2.toUri(), name.toUri(), 'Name constructed with append has wrong URI')
Ejemplo n.º 3
0
    def test_append(self):
        # could possibly split this into different tests
        uri = "/localhost/user/folders/files/%00%0F"
        name = Name(uri)
        name2 = Name("/localhost").append(Name("/user/folders/"))
        self.assertEqual(name2.size(), 3, 'Name constructed by appending names has ' + str(name2.size()) + ' components instead of 3')
        self.assertTrue(name2.get(2).getValue().equals(Blob(bytearray("folders"))), 'Name constructed with append has wrong suffix')
        name2 = name2.append("files")
        self.assertEqual(name2.size(), 4, 'Name constructed by appending string has ' + str(name2.size()) + ' components instead of 4')
        name2 = name2.appendSegment(15)
        self.assertTrue(name2.get(4).getValue().equals(Blob(bytearray([0x00, 0x0F]))), 'Name constructed by appending segment has wrong segment value')

        self.assertTrue(name2.equals(name), 'Name constructed with append is not equal to URI constructed name')
        self.assertEqual(name2.toUri(), name.toUri(), 'Name constructed with append has wrong URI')
Ejemplo n.º 4
0
    def test_typed_name_component(self):
        otherTypeCode = 99
        uri = "/ndn/" + str(otherTypeCode) + "=value"
        name = Name()
        name.append("ndn").append("value", ComponentType.OTHER_CODE, otherTypeCode)
        self.assertEqual(uri, name.toUri())

        nameFromUri = Name(uri)
        self.assertEqual("value", str(nameFromUri.get(1).getValue()))
        self.assertEqual(otherTypeCode, nameFromUri.get(1).getOtherTypeCode())

        decodedName = Name()
        decodedName.wireDecode(name.wireEncode())
        self.assertEqual("value", str(decodedName.get(1).getValue()))
        self.assertEqual(otherTypeCode, decodedName.get(1).getOtherTypeCode())
Ejemplo n.º 5
0
def createKeyChain():
    """
    Create an in-memory KeyChain with default keys.

    :return: A tuple with the new KeyChain and certificate name.
    :rtype: (KeyChain,Name)
    """
    identityStorage = MemoryIdentityStorage()
    privateKeyStorage = MemoryPrivateKeyStorage()
    keyChain = KeyChain(IdentityManager(identityStorage, privateKeyStorage),
                        NoVerifyPolicyManager())

    # Initialize the storage.
    keyName = Name("/testname/DSK-123")
    certificateName = keyName.getSubName(
        0,
        keyName.size() - 1).append("KEY").append(
            keyName.get(-1)).append("ID-CERT").append("0")
    identityStorage.addKey(keyName, KeyType.RSA,
                           Blob(DEFAULT_RSA_PUBLIC_KEY_DER, False))
    privateKeyStorage.setKeyPairForKeyName(keyName, KeyType.RSA,
                                           DEFAULT_RSA_PUBLIC_KEY_DER,
                                           DEFAULT_RSA_PRIVATE_KEY_DER)

    return keyChain, certificateName
Ejemplo n.º 6
0
    def test_typed_name_component(self):
        otherTypeCode = 99
        uri = "/ndn/" + str(otherTypeCode) + "=value"
        name = Name()
        name.append("ndn").append("value", ComponentType.OTHER_CODE,
                                  otherTypeCode)
        self.assertEqual(uri, name.toUri())

        nameFromUri = Name(uri)
        self.assertEqual("value", str(nameFromUri.get(1).getValue()))
        self.assertEqual(otherTypeCode, nameFromUri.get(1).getOtherTypeCode())

        decodedName = Name()
        decodedName.wireDecode(name.wireEncode())
        self.assertEqual("value", str(decodedName.get(1).getValue()))
        self.assertEqual(otherTypeCode, decodedName.get(1).getOtherTypeCode())
Ejemplo n.º 7
0
    def _updateCapabilities(self):
        """
        Send the controller a list of our commands.
        """
        fullCommandName = Name(
            self._policyManager.getTrustRootIdentity()).append(
                'updateCapabilities')
        capabilitiesMessage = UpdateCapabilitiesCommandMessage()

        for command in self._commands:
            commandName = Name(self.prefix).append(Name(command.suffix))
            capability = capabilitiesMessage.capabilities.add()
            for i in range(commandName.size()):
                capability.commandPrefix.components.append(
                    str(commandName.get(i).getValue()))

            for kw in command.keywords:
                capability.keywords.append(kw)

            capability.needsSignature = command.isSigned

        encodedCapabilities = ProtobufTlv.encode(capabilitiesMessage)
        fullCommandName.append(encodedCapabilities)
        interest = Interest(fullCommandName)
        interest.setInterestLifetimeMilliseconds(5000)
        self.face.makeCommandInterest(interest)
        signature = self._policyManager._extractSignature(interest)

        self.log.info("Sending capabilities to controller")
        self.face.expressInterest(interest, self._onCapabilitiesAck,
                                  self._onCapabilitiesTimeout)

        # update twice a minute
        self.loop.call_later(30, self._updateCapabilities)
Ejemplo n.º 8
0
    def test_full_name(self):
        data = Data()
        data.wireDecode(codedData)

        # Check the full name format.
        self.assertEqual(data.getFullName().size(), data.getName().size() + 1)
        self.assertEqual(data.getName(), data.getFullName().getPrefix(-1))
        self.assertEqual(data.getFullName().get(-1).getValue().size(), 32)

        # Check the independent digest calculation.
        sha256 = hashes.Hash(hashes.SHA256(), backend=default_backend())
        sha256.update(Blob(codedData).toBytes())
        newDigest = Blob(bytearray(sha256.finalize()), False)
        self.assertTrue(newDigest.equals(
            data.getFullName().get(-1).getValue()))

        # Check the expected URI.
        self.assertEqual(
            data.getFullName().toUri(), "/ndn/abc/sha256digest=" +
            "96556d685dcb1af04be4ae57f0e7223457d4055ea9b3d07c0d337bef4a8b3ee9")

        # Changing the Data packet should change the full name.
        saveFullName = Name(data.getFullName())
        data.setContent(Blob())
        self.assertNotEqual(data.getFullName().get(-1), saveFullName.get(-1))
Ejemplo n.º 9
0
 def testTimestamp(self):
     expected = Name("/%FC%00%04%7BE%E3%1B%00%00")
     self.assertTrue(expected.get(0).isTimestamp())
     # 40 years (not counting leap years) in microseconds.
     number = 40 * 365 * 24 * 3600 * 1000000
     self.assertEqual(Name().appendTimestamp(number), expected,  "appendTimestamp did not create the expected component")
     self.assertEqual(expected[0].toTimestamp(), number,  "toTimestamp did not return the expected value")
Ejemplo n.º 10
0
    def apply_exclude(self, last_node, exclude):
        """
        @param last_node - the node to start search from
        @param exlucde - exclude filter the interest contains
        @returns all nodes that fullfil the selector
        """
        _id = last_node._id
        query = 'START s=node(%s)\n' % _id + \
                'MATCH (s)-[:%s]->(m)\n' % (RELATION_C2C) + \
                'RETURN (m)'
        records = neo4j.CypherQuery(self.db_handler, query).execute()
        _nodes = [record.values[0] for record in records.data]

        if not exclude:
            return _nodes

        nodes = []
        for node in _nodes:
            name = Name()
            name.set(node.get_properties()[PROPERTY_COMPONENT])
            comp = name.get(0)
            if not exclude.matches(comp):
                nodes.append(node)

        return nodes
Ejemplo n.º 11
0
    def _updateCapabilities(self):
        """
        Send the controller a list of our commands.
        """ 
        fullCommandName = Name(self._policyManager.getTrustRootIdentity()
                ).append('updateCapabilities')
        capabilitiesMessage = UpdateCapabilitiesCommandMessage()

        for command in self._commands:
            commandName = Name(self.prefix).append(Name(command.suffix))
            capability = capabilitiesMessage.capabilities.add()
            for i in range(commandName.size()):
                capability.commandPrefix.components.append(
                        str(commandName.get(i).getValue()))

            for kw in command.keywords:
                capability.keywords.append(kw)

            capability.needsSignature = command.isSigned

        encodedCapabilities = ProtobufTlv.encode(capabilitiesMessage)
        fullCommandName.append(encodedCapabilities)
        interest = Interest(fullCommandName)
        interest.setInterestLifetimeMilliseconds(5000)
        self.face.makeCommandInterest(interest)
        signature = self._policyManager._extractSignature(interest)

        self.log.info("Sending capabilities to controller")
        self.face.expressInterest(interest, self._onCapabilitiesAck, self._onCapabilitiesTimeout)

        # update twice a minute
        self.loop.call_later(30, self._updateCapabilities)
Ejemplo n.º 12
0
 def testTimestamp(self):
     expected = Name("/%FC%00%04%7BE%E3%1B%00%00")
     self.assertTrue(expected.get(0).isTimestamp())
     # 40 years (not counting leap years) in microseconds.
     number = 40 * 365 * 24 * 3600 * 1000000
     self.assertEqual(Name().appendTimestamp(number), expected,  "appendTimestamp did not create the expected component")
     self.assertEqual(expected[0].toTimestamp(), number,  "toTimestamp did not return the expected value")
Ejemplo n.º 13
0
 def testSequenceNumber(self):
     expected = Name("/%FE%00%98%96%80")
     self.assertTrue(expected.get(0).isSequenceNumber())
     number = 10000000
     self.assertEqual(
         Name().appendSequenceNumber(number), expected,
         "appendSequenceNumber did not create the expected component")
     self.assertEqual(expected[0].toSequenceNumber(), number,
                      "toSequenceNumber did not return the expected value")
Ejemplo n.º 14
0
 def testVersion(self):
     expected = Name("/%FD%00%0FB%40")
     self.assertTrue(expected.get(0).isVersion())
     number = 1000000
     self.assertEqual(
         Name().appendVersion(number), expected,
         "appendVersion did not create the expected component")
     self.assertEqual(expected[0].toVersion(), number,
                      "toVersion did not return the expected value")
Ejemplo n.º 15
0
 def testSegmentOffset(self):
     expected = Name("/%FB%00%01%86%A0")
     self.assertTrue(expected.get(0).isSegmentOffset())
     number = 100000
     self.assertEqual(
         Name().appendSegmentOffset(number), expected,
         "appendSegmentOffset did not create the expected component")
     self.assertEqual(expected[0].toSegmentOffset(), number,
                      "toSegmentOffset did not return the expected value")
Ejemplo n.º 16
0
    def setUp(self):
        self.decryptionKeys = {}  # key: Name, value: Blob
        self.encryptionKeys = {}  # key: Name, value: Data

        # Reuse the policy_config subdirectory for the temporary SQLite files.
        self.databaseFilePath = "policy_config/test.db"
        try:
            os.remove(self.databaseFilePath)
        except OSError:
            # no such file
            pass

        self.groupName = Name("/Prefix/READ")
        self.contentName = Name("/Prefix/SAMPLE/Content")
        self.cKeyName = Name("/Prefix/SAMPLE/Content/C-KEY/1")
        self.eKeyName = Name("/Prefix/READ/E-KEY/1/2")
        self.dKeyName = Name("/Prefix/READ/D-KEY/1/2")
        self.uKeyName = Name("/U/Key")
        self.uName = Name("/U")

        # Generate the E-KEY and D-KEY.
        params = RsaKeyParams()
        self.fixtureDKeyBlob = RsaAlgorithm.generateKey(params).getKeyBits()
        self.fixtureEKeyBlob = RsaAlgorithm.deriveEncryptKey(
            self.fixtureDKeyBlob).getKeyBits()

        # Generate the user key.
        self.fixtureUDKeyBlob = RsaAlgorithm.generateKey(params).getKeyBits()
        self.fixtureUEKeyBlob = RsaAlgorithm.deriveEncryptKey(
            self.fixtureUDKeyBlob).getKeyBits()

        # Load the C-KEY.
        self.fixtureCKeyBlob = Blob(AES_KEY, False)

        # Set up the keyChain.
        identityStorage = MemoryIdentityStorage()
        privateKeyStorage = MemoryPrivateKeyStorage()
        self.keyChain = KeyChain(
            IdentityManager(identityStorage, privateKeyStorage),
            NoVerifyPolicyManager())

        # Initialize the storage.
        keyName = Name("/testname/DSK-123")
        self.certificateName = keyName.getSubName(
            0,
            keyName.size() - 1).append("KEY").append(
                keyName.get(-1)).append("ID-CERT").append("0")
        identityStorage.addKey(keyName, KeyType.RSA,
                               Blob(DEFAULT_RSA_PUBLIC_KEY_DER, False))
        privateKeyStorage.setKeyPairForKeyName(keyName, KeyType.RSA,
                                               DEFAULT_RSA_PUBLIC_KEY_DER,
                                               DEFAULT_RSA_PRIVATE_KEY_DER)
    def createCheckInterest(self, fullName, checkNum):
        insertionName = Name(self.repoPrefix).append('insert check')
        commandParams = RepoCommandParameterMessage()
        interestName = Name(fullName)

        commandParams.repo_command_parameter.process_id = checkNum
        for i in range(interestName.size()):
            commandParams.repo_command_parameter.name.component.append(str(interestName.get(i).getValue()))

        commandName = insertionName.append(ProtobufTlv.encode(commandParams))
        interest = Interest(commandName)

        return interest
Ejemplo n.º 18
0
def createCheckInterest(fullName, checkNum):
    insertionName = Name("/repotest/repo/insert check")
    commandParams = RepoCommandParameterMessage()
    interestName = Name(fullName)

    commandParams.repo_command_parameter.process_id = checkNum
    for i in range(interestName.size()):
        commandParams.repo_command_parameter.name.component.append(interestName.get(i).toEscapedString())

    commandName = insertionName.append(ProtobufTlv.encode(commandParams))
    interest = Interest(commandName)

    return interest
Ejemplo n.º 19
0
    def setUp(self):
        self.decryptionKeys = {} # key: Name, value: Blob
        self.encryptionKeys = {} # key: Name, value: Data

        # Reuse the policy_config subdirectory for the temporary SQLite files.
        self.databaseFilePath = "policy_config/test.db"
        try:
            os.remove(self.databaseFilePath)
        except OSError:
            # no such file
            pass

        self.groupName = Name("/Prefix/READ")
        self.contentName = Name("/Prefix/SAMPLE/Content")
        self.cKeyName = Name("/Prefix/SAMPLE/Content/C-KEY/1")
        self.eKeyName = Name("/Prefix/READ/E-KEY/1/2")
        self.dKeyName = Name("/Prefix/READ/D-KEY/1/2")
        self.uKeyName = Name("/U/Key")
        self.uName = Name("/U")

        # Generate the E-KEY and D-KEY.
        params = RsaKeyParams()
        self.fixtureDKeyBlob = RsaAlgorithm.generateKey(params).getKeyBits()
        self.fixtureEKeyBlob = RsaAlgorithm.deriveEncryptKey(
          self.fixtureDKeyBlob).getKeyBits()

        # Generate the user key.
        self.fixtureUDKeyBlob = RsaAlgorithm.generateKey(params).getKeyBits()
        self.fixtureUEKeyBlob = RsaAlgorithm.deriveEncryptKey(
          self.fixtureUDKeyBlob).getKeyBits()

        # Load the C-KEY.
        self.fixtureCKeyBlob = Blob(AES_KEY, False)

        # Set up the keyChain.
        identityStorage = MemoryIdentityStorage()
        privateKeyStorage = MemoryPrivateKeyStorage()
        self.keyChain = KeyChain(
          IdentityManager(identityStorage, privateKeyStorage),
          NoVerifyPolicyManager())

        # Initialize the storage.
        keyName = Name("/testname/DSK-123")
        self.certificateName = keyName.getSubName(0, keyName.size() - 1).append(
          "KEY").append(keyName.get(-1)).append("ID-CERT").append("0")
        identityStorage.addKey(
          keyName, KeyType.RSA, Blob(DEFAULT_RSA_PUBLIC_KEY_DER, False))
        privateKeyStorage.setKeyPairForKeyName(
          keyName, KeyType.RSA, DEFAULT_RSA_PUBLIC_KEY_DER,
          DEFAULT_RSA_PRIVATE_KEY_DER)
Ejemplo n.º 20
0
    def onInterest(self, prefix, interest, transport, registeredPrefixId):
        print "received interest"
        initInterest = Name(interest.getName())
        print "interest name:", initInterest.toUri()
        #d = Data(interest.getName().getPrefix(prefix.size()+1))
        #self.excludeDevice = interest.getName().get(prefix.size())
        #initInterest = interest.getName()
        d = Data(interest.getName().append(self.deviceComponent))

        try:
            if (initInterest == self.prefix):

                print "start to set data's content"

                currentString = ','.join(currentList)
                d.setContent("songList of " + self.device + ":" +
                             currentString + "\n")

            else:
                self.excludeDevice = initInterest.get(prefix.size())
                print "excludeDevice", self.excludeDevice.toEscapedString()
                if (self.excludeDevice != self.deviceComponent):
                    print "start to set data's content"

                    currentString = ','.join(currentList)
                    d.setContent("songList of " + self.device + ":" +
                                 currentString + "\n")
                else:

                    print "remove register"
                    self.face.removeRegisteredPrefix(registeredPrefixId)
                    time.sleep(30)
                    #sleep 30s which means user cannot update the song list twice within 1 minutes
                    print "register again"
                    self.face.registerPrefix(self.prefix, self.onInterest,
                                             self.onRegisterFailed)

        except KeyboardInterrupt:
            print "key interrupt"
            sys.exit(1)
        except Exception as e:
            print e
            d.setContent("Bad command\n")
        finally:
            self.keychain.sign(d, self.certificateName)

        encodedData = d.wireEncode()
        transport.send(encodedData.toBuffer())
        print d.getName().toUri()
        print d.getContent()
Ejemplo n.º 21
0
    def onInterest(self, prefix, interest, transport, registeredPrefixId):
	print "received interest"
        initInterest = Name(interest.getName())
        print "interest name:",initInterest.toUri()
        #d = Data(interest.getName().getPrefix(prefix.size()+1))
        #self.excludeDevice = interest.getName().get(prefix.size())
	#initInterest = interest.getName()
	d = Data(interest.getName().append(self.deviceComponent))
	
		  
        try:
	    if(initInterest == self.prefix):
	    
		print "start to set data's content"
                
		currentString = ','.join(currentList)
		d.setContent("songList of " +self.device+":"+currentString+ "\n")
		
		
            else:
		self.excludeDevice = initInterest.get(prefix.size())
		print "excludeDevice",self.excludeDevice.toEscapedString()
		if(self.excludeDevice != self.deviceComponent):
			print "start to set data's content"
                
			currentString = ','.join(currentList)
			d.setContent("songList of " +self.device+":"+currentString+ "\n")
		else:

			print"remove register"
                	self.face.removeRegisteredPrefix(registeredPrefixId)
                	time.sleep(30)
                	#sleep 30s which means user cannot update the song list twice within 1 minutes
			print"register again"
                	self.face.registerPrefix(self.prefix, self.onInterest, self.onRegisterFailed)
	    

	except KeyboardInterrupt:
		print "key interrupt"
		sys.exit(1)
	except Exception as e:
		print e
		d.setContent("Bad command\n")
	finally:
		self.keychain.sign(d,self.certificateName)

	encodedData = d.wireEncode()
	transport.send(encodedData.toBuffer())
	print d.getName().toUri()
	print d.getContent()
Ejemplo n.º 22
0
    def onInterest(self, prefix, interest, transport, registeredPrefixId):
        initInterest = Name(interest.getName())
        print "interest name:",initInterest.toUri()
	d = Data(interest.getName().append(self.deviceComponent))
	
		  
        try:
	    if(initInterest == self.listPrefix):
	    
		print "initial db,start to set data's content"
                
		currentString = ','.join(currentList)
		d.setContent(currentString)
		encodedData = d.wireEncode()
		transport.send(encodedData.toBuffer())
		print d.getName().toUri()
		print d.getContent()
		
		
		
            else:
		self.excludeDevice = initInterest.get(self.listPrefix.size())
		excDevice = self.excludeDevice.toEscapedString()
		if(excDevice != str("exc")+self.device):
			print "not init db,start to set data's content"
                
			currentString = ','.join(currentList)
			d.setContent(currentString)
			encodedData = d.wireEncode()
			transport.send(encodedData.toBuffer())
			print d.getName().toUri()
			print d.getContent()
			
		else:
			
			print"controller has exclude me, I have to remove register!!!!!!!"
                	self.face.removeRegisteredPrefix(registeredPrefixId)
			print"register again"
                	self.face.registerPrefix(self.listPrefix,self.onInterest,self.onRegisterFailed)
    

	except KeyboardInterrupt:
		print "key interrupt"
		sys.exit(1)
	except Exception as e:
		print e
		d.setContent("Bad command\n")
	finally:
		self.keychain.sign(d,self.certificateName)
Ejemplo n.º 23
0
def createInsertInterest(fullName):
    # we have to do the versioning when we poke the repo
    interestName = Name(fullName)
    logger.debug('Creating insert interest for: '+interestName.toUri())
    
    insertionName = Name("/repotest/repo/insert")
    commandParams = RepoCommandParameterMessage()

    for i in range(interestName.size()):
        commandParams.repo_command_parameter.name.component.append(interestName.get(i).toEscapedString())

    commandParams.repo_command_parameter.start_block_id = 0
    commandParams.repo_command_parameter.end_block_id = 0

    commandName = insertionName.append(ProtobufTlv.encode(commandParams))
    interest = Interest(commandName)

    return interest
Ejemplo n.º 24
0
        def _sendInterest(self, syncStates, isRecovery):
            """
            Send a Chat Interest to fetch chat messages after the user gets the Sync
            data packet back but will not send interest.
            """
            # This is used by _onData to decide whether to display the chat messages.
            self._isRecoverySyncState = isRecovery

            sendList = []  # of str
            sessionNoList = []  # of int
            sequenceNoList = []  # of int
            for j in range(len(syncStates)):
                syncState = syncStates[j]
                nameComponents = Name(syncState.getDataPrefix())
                tempName = nameComponents.get(-1).toEscapedString()
                sessionNo = syncState.getSessionNo()
                if not tempName == Name(
                        self._userPrefix)[-1].toEscapedString():
                    index = -1
                    for k in range(len(sendList)):
                        if sendList[k] == syncState.getDataPrefix():
                            index = k
                            break

                    if index != -1:
                        sessionNoList[index] = sessionNo
                        sequenceNoList[index] = syncState.getSequenceNo()
                    else:
                        sendList.append(syncState.getDataPrefix())
                        sessionNoList.append(sessionNo)
                        sequenceNoList.append(syncState.getSequenceNo())

            for i in range(len(sendList)):
                uri = (sendList[i] + "/" + str(sessionNoList[i]) + "/" +
                       str(sequenceNoList[i]))
                interest = Interest(Name(uri))
                interest.setInterestLifetimeMilliseconds(self._syncLifetime)
                self._face.expressInterest(interest, self._onData,
                                           self._chatTimeout)
    def createInsertInterest(self, fullName):
        '''
            For poking the repo
        '''
        # we have to do the versioning before we poke the repo
        interestName = Name(fullName)
        logger.debug('Creating insert interest for: '+interestName.toUri())
        
        insertionName = Name(self.repoPrefix).append('insert')
        commandParams = RepoCommandParameterMessage()

        for i in range(interestName.size()):
            commandParams.repo_command_parameter.name.component.append(interestName.get(i).getValue().toRawStr())

        commandParams.repo_command_parameter.start_block_id = 0
        commandParams.repo_command_parameter.end_block_id = 0

        commandName = insertionName.append(ProtobufTlv.encode(commandParams))
        interest = Interest(commandName)

        interest.setInterestLifetimeMilliseconds(2000)

        return interest
Ejemplo n.º 26
0
    def _sendInterest(self, syncStates, isRecovery):
        """
        Send a Chat Interest to fetch chat messages after the user gets the Sync
        data packet back but will not send interest.
        """
        # This is used by _onData to decide whether to display the chat messages.
        self._isRecoverySyncState = isRecovery

        sendList = []       # of str
        sessionNoList = []  # of int
        sequenceNoList = [] # of int
        for j in range(len(syncStates)):
            syncState = syncStates[j]
            nameComponents = Name(syncState.getDataPrefix())
            tempName = nameComponents.get(-1).toEscapedString()
            sessionNo = syncState.getSessionNo()
            if not tempName == self._screenName:
                index = -1
                for k in range(len(sendList)):
                    if sendList[k] == syncState.getDataPrefix():
                        index = k
                        break

                if index != -1:
                    sessionNoList[index] = sessionNo
                    sequenceNoList[index] = syncState.getSequenceNo()
                else:
                    sendList.append(syncState.getDataPrefix())
                    sessionNoList.append(sessionNo)
                    sequenceNoList.append(syncState.getSequenceNo())

        for i in range(len(sendList)):
            uri = (sendList[i] + "/" + str(sessionNoList[i]) + "/" +
              str(sequenceNoList[i]))
            interest = Interest(Name(uri))
            interest.setInterestLifetimeMilliseconds(self._syncLifetime)
            self._face.expressInterest(interest, self._onData, self._chatTimeout)
Ejemplo n.º 27
0
    def test_full_name(self):
        data = Data()
        data.wireDecode(codedData)

        # Check the full name format.
        self.assertEqual(data.getFullName().size(), data.getName().size() + 1)
        self.assertEqual(data.getName(), data.getFullName().getPrefix(-1))
        self.assertEqual(data.getFullName().get(-1).getValue().size(), 32)

        # Check the independent digest calculation.
        sha256 = hashes.Hash(hashes.SHA256(), backend=default_backend())
        sha256.update(Blob(codedData).toBytes())
        newDigest = Blob(bytearray(sha256.finalize()), False)
        self.assertTrue(newDigest.equals(data.getFullName().get(-1).getValue()))

        # Check the expected URI.
        self.assertEqual(
          data.getFullName().toUri(), "/ndn/abc/sha256digest=" +
            "96556d685dcb1af04be4ae57f0e7223457d4055ea9b3d07c0d337bef4a8b3ee9")

        # Changing the Data packet should change the full name.
        saveFullName = Name(data.getFullName())
        data.setContent(Blob())
        self.assertNotEqual(data.getFullName().get(-1), saveFullName.get(-1))
Ejemplo n.º 28
0
    def _sendInterest(self, syncStates):
        """
        This is called by StateVectorSync2018 when it receives new sync states 
        from another member. Send a Chat Interest to fetch chat messages after
        the user gets the Sync data packet back but will not send interest.
        """
        sendList = []  # of str
        sessionNoList = []  # of int
        sequenceNoList = []  # of int
        for j in range(len(syncStates)):
            syncState = syncStates[j]
            nameComponents = Name(syncState.getDataPrefix())
            tempName = nameComponents.get(-1).toEscapedString()
            sessionNo = 10000000000
            if not tempName == self._screenName:
                index = -1
                for k in range(len(sendList)):
                    if sendList[k] == syncState.getDataPrefix():
                        index = k
                        break

                if index != -1:
                    sessionNoList[index] = sessionNo
                    sequenceNoList[index] = syncState.getSequenceNo()
                else:
                    sendList.append(syncState.getDataPrefix())
                    sessionNoList.append(sessionNo)
                    sequenceNoList.append(syncState.getSequenceNo())

        for i in range(len(sendList)):
            uri = (sendList[i] + "/" + str(sessionNoList[i]) + "/" +
                   str(sequenceNoList[i]))
            interest = Interest(Name(uri))
            interest.setInterestLifetimeMilliseconds(self._syncLifetime)
            self._face.expressInterest(interest, self._onData,
                                       self._chatTimeout)
Ejemplo n.º 29
0
def createKeyChain():
    """
    Create an in-memory KeyChain with default keys.

    :return: A tuple with the new KeyChain and certificate name.
    :rtype: (KeyChain,Name)
    """
    identityStorage = MemoryIdentityStorage()
    privateKeyStorage = MemoryPrivateKeyStorage()
    keyChain = KeyChain(
      IdentityManager(identityStorage, privateKeyStorage),
      NoVerifyPolicyManager())

    # Initialize the storage.
    keyName = Name("/testname/DSK-123")
    certificateName = keyName.getSubName(0, keyName.size() - 1).append(
      "KEY").append(keyName.get(-1)).append("ID-CERT").append("0")
    identityStorage.addKey(
      keyName, KeyType.RSA, Blob(DEFAULT_RSA_PUBLIC_KEY_DER, False))
    privateKeyStorage.setKeyPairForKeyName(
      keyName, KeyType.RSA, DEFAULT_RSA_PUBLIC_KEY_DER,
      DEFAULT_RSA_PRIVATE_KEY_DER)

    return keyChain, certificateName
Ejemplo n.º 30
0
 def testSegmentOffset(self):
     expected = Name("/%FB%00%01%86%A0")
     self.assertTrue(expected.get(0).isSegmentOffset())
     number = 100000
     self.assertEqual(Name().appendSegmentOffset(number), expected,  "appendSegmentOffset did not create the expected component")
     self.assertEqual(expected[0].toSegmentOffset(), number,  "toSegmentOffset did not return the expected value")
Ejemplo n.º 31
0
    def test_implicit_sha256_digest(self):
        name = Name()

        digest = bytearray([
            0x28, 0xba, 0xd4, 0xb5, 0x27, 0x5b, 0xd3, 0x92, 0xdb, 0xb6, 0x70,
            0xc7, 0x5c, 0xf0, 0xb6, 0x6f, 0x13, 0xf7, 0x94, 0x2b, 0x21, 0xe8,
            0x0f, 0x55, 0xc0, 0xe8, 0x6b, 0x37, 0x47, 0x53, 0xa5, 0x48, 0x00,
            0x00
        ])

        name.appendImplicitSha256Digest(digest[0:32])
        name.appendImplicitSha256Digest(digest[0:32])
        self.assertEqual(name.get(0), name.get(1))

        gotError = True
        try:
            name.appendImplicitSha256Digest(digest[0:34])
            gotError = False
        except:
            pass
        if not gotError:
            self.fail("Expected error in appendImplicitSha256Digest")

        gotError = True
        try:
            name.appendImplicitSha256Digest(digest[0:30])
            gotError = False
        except:
            pass
        if not gotError:
            self.fail("Expected error in appendImplicitSha256Digest")

        # Add name.get(2) as a generic component.
        name.append(digest[0:32])
        self.assertTrue(name.get(0).compare(name.get(2)) < 0)
        self.assertEqual(name.get(0).getValue(), name.get(2).getValue())

        # Add name.get(3) as a generic component whose first byte is greater.
        name.append(digest[1:32])
        self.assertTrue(name.get(0).compare(name.get(3)) < 0)

        self.assertEqual(
            name.get(0).toEscapedString(), "sha256digest=" +
            "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548")

        self.assertEqual(name.get(0).isImplicitSha256Digest(), True)
        self.assertEqual(name.get(2).isImplicitSha256Digest(), False)

        gotError = True
        try:
            Name("/hello/sha256digest=hmm")
            gotError = False
        except:
            pass
        if not gotError:
            self.fail("Expected error in new Name from URI")

        # Check canonical URI encoding (lower case).
        name2 = Name(
            "/hello/sha256digest=" +
            "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548")
        self.assertEqual(name.get(0), name2.get(1))

        # Check that it will accept a hex value in upper case too.
        name2 = Name(
            "/hello/sha256digest=" +
            "28BAD4B5275BD392DBB670C75CF0B66F13F7942B21E80F55C0E86B374753A548")
        self.assertEqual(name.get(0), name2.get(1))

        # This is not a valid sha256digest component. It should be treated as generic.
        name2 = Name(
            "/hello/SHA256DIGEST=" +
            "28BAD4B5275BD392DBB670C75CF0B66F13F7942B21E80F55C0E86B374753A548")
        self.assertNotEqual(name.get(0), name2.get(1))
        self.assertTrue(name2.get(1).isGeneric())
Ejemplo n.º 32
0
 def testSequenceNumber(self):
     expected = Name("/%FE%00%98%96%80")
     self.assertTrue(expected.get(0).isSequenceNumber())
     number = 10000000
     self.assertEqual(Name().appendSequenceNumber(number), expected,  "appendSequenceNumber did not create the expected component")
     self.assertEqual(expected[0].toSequenceNumber(), number,  "toSequenceNumber did not return the expected value")
Ejemplo n.º 33
0
 def test_prefix(self):
     name = Name(self.expectedURI)
     name2 = name.getPrefix(2)
     self.assertEqual(name2.size(),2, 'Name prefix has ' + str(name2.size()) + ' components instead of 2')
     for i in range(2):
         self.assertTrue(name.get(i).getValue().equals(name2.get(i).getValue()))
Ejemplo n.º 34
0
 def test_get_component(self):
     name = Name(self.expectedURI)
     comp2 = name.get(2)
     self.assertTrue(self.comp2.equals(comp2), 'Component at index 2 is incorrect')
Ejemplo n.º 35
0
 def test_get_component(self):
     name = Name(self.expectedURI)
     comp2 = name.get(2)
     self.assertTrue(self.comp2.equals(comp2), 'Component at index 2 is incorrect')
Ejemplo n.º 36
0
    publisher.start()

    try:
        # sleep a second, like the repo-ng test
        time.sleep(1)
        while not done:
            #pick a random data name
            data_part = suffix# str(randint(0,N))

            fullName = Name(data_prefix).append(Name(data_part))

            # currently we need to provide the version ourselves when we
            # poke the repo
            ts = int(time.time()*1000)
            fullName.appendVersion(int(ts))
            versionComponent = fullName.get(-1)
            versionStr = versionComponent.toEscapedString()
            logger.debug('inserting: ' + versionStr)

            if shouldCollectStats:
                insertTable.append({'version':versionStr, 'insert_request':time.time()})
            data = generateData(fullName)
            dataCache.add(data)

            if shouldCollectStats:
                info = getInfoForVersion(versionStr)
                if info is not None:
                    info['insert_complete'] = time.time()
            time.sleep(0.1)
            print '.',
            sys.stdout.flush()
Ejemplo n.º 37
0
 def test_prefix(self):
     name = Name(self.expectedURI)
     name2 = name.getPrefix(2)
     self.assertEqual(name2.size(),2, 'Name prefix has ' + str(name2.size()) + ' components instead of 2')
     for i in range(2):
         self.assertTrue(name.get(i).getValue().equals(name2.get(i).getValue()))
Ejemplo n.º 38
0
 def testVersion(self):
     expected = Name("/%FD%00%0FB%40")
     self.assertTrue(expected.get(0).isVersion())
     number = 1000000
     self.assertEqual(Name().appendVersion(number), expected,  "appendVersion did not create the expected component")
     self.assertEqual(expected[0].toVersion(), number,  "toVersion did not return the expected value")
Ejemplo n.º 39
0
def chunksStatistics(filepath, start, stop, session, noProd):
    col = loadCatTraces(filepath)
    
    if start != -1 and stop != -1 :
        colEvents = col.events_timestamps(start, stop)
    else :
        colEvents = col.events

    segmentsDic = {}
    segmentsInfo = {}
    bytesReceivedTimes = {}
    bytesReceivedSecTimes = {}
    packetSentSecTimes = {}
    curSent = 0;
    packetReceivedSecTimes = {}
    curReceived = 0;
    packetReceivedErrorSecTimes = {}
    curReceivedError = 0;
    packetSentErrorSecTimes = {}
    curSentError = 0;
    windowSizeTime = {}
    windowMultiplier = {}
    windowRttReset = {}
    curWindowSize = 0;
    numBytes = 0
    curBytes = 0
    firstTimeData = -1 #seconds
    firstTimeDataMs = -1
    lastTimeData = -1
    
    discoverySegment = 0
    discoveryInterest = start
    discoveryData  =  start
    # get events timestamp per segment (chunks)
    usedStrategies = []
    rtts = {}
    rttsMean = {}
    numRtt = 0
    
    rttTime = {}
    
    rttTimeMean = {}
    
    rttMin = {}
    rttMax = {}
    rttMinCalc ={}
    
    dataRejected = {}
    
    rttChunks = {}
    
    minRttMinCalc = 1000000;
    
    countPacket = 0
    countSegment = 0
    
    lifetimeTime = {}
    
    for event in colEvents:
        if event.name.startswith('chunksLog:') :
            if event.name == 'chunksLog:interest_discovery' :
                discoveryInterest = event.timestamp
            elif event.name == 'chunksLog:data_discovery' :
                discoverySegment = event['segment_number']
                discoveryData  =  event.timestamp
            elif event.name == 'chunksLog:interest_timeout' or event.name == 'chunksLog:data_sent' : #remove data sent
                if event['segment_number'] not in segmentsDic or event.name not in segmentsDic[event['segment_number']] :
                    segmentsDic.setdefault(event['segment_number'],{}).setdefault(event.name, 1)
                else :
                    segmentsDic[event['segment_number']][event.name] += 1
            elif event.name == 'chunksLog:interest_sent' or event.name == 'chunksLog:data_received' or event.name == 'chunksLog:interest_nack':
                segmentsDic.setdefault(event['segment_number'],{}).setdefault(event.name, event.timestamp)
                
                if event.name == 'chunksLog:interest_sent' :
                    if 'lifetime' in event :
                        if firstTimeData == -1 :
                            firstTimeData = event.timestamp / 1e9
                            firstTimeDataMs = event.timestamp / 1e6
                        
                        slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                        #print(slot)
                        if slot not in lifetimeTime :
                            lifetimeTime.setdefault(slot, (event['lifetime'], 1))
                        else :
                            (r, c) = lifetimeTime[slot]
                            lifetimeTime[slot] = (r + event['lifetime'], c+1)
                
                if event.name == 'chunksLog:data_received' :
                    countSegment += 1
                    if 'rtt' in event :
                        #rtts.setdefault(numRtt, event['rtt'])
                        if firstTimeData == -1 :
                            firstTimeData = event.timestamp / 1e9
                            firstTimeDataMs = event.timestamp / 1e6
                        
                        slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                        #print(slot)
                        if  slot not in rttChunks :
                            rttChunks.setdefault(slot, (event['rtt'], 1))
                        else :
                            (r, c) = rttChunks[slot]
                            rttChunks[slot] = (r + event['rtt'], c+1)
                    
                for field in event.items() :
                    if field[0] == 'bytes' :
                        if firstTimeData == -1 :
                            firstTimeData = event.timestamp / 1e9
                            firstTimeDataMs = event.timestamp / 1e6
                        
                        slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                        if slot not in bytesReceivedSecTimes :
                            curBytes = packetSize/100 #float(field[1])/100
                            bytesReceivedSecTimes.setdefault(slot, curBytes)
                        else :
                            curBytes += packetSize/100 #float(field[1])/100
                            bytesReceivedSecTimes[slot] = curBytes
                        
                        numBytes += packetSize/100 #float(field[1])/100
                        bytesReceivedTimes.setdefault(slot, numBytes) #TODO
                        
                        if lastTimeData < slot :
                            lastTimeData = slot
                    segmentsInfo.setdefault(event['segment_number'],{}).setdefault(event.name, {}).setdefault(field[0], field[1])
                    
            elif event.name =='chunksLog:window' :
                if firstTimeData == -1 :
                    firstTimeData = event.timestamp / 1e9
                    firstTimeDataMs = event.timestamp / 1e6
                    
                slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                if  slot not in windowSizeTime :
                    windowSizeTime.setdefault(slot, (event['size'], 1))
                else :
                    (r, c) = windowSizeTime[slot]
                    windowSizeTime[slot] = (r + event['size'], c+1)
                    
            elif event.name =='chunksLog:rtoMulti_change' :
                if firstTimeData == -1 :
                    firstTimeData = event.timestamp / 1e9
                    firstTimeDataMs = event.timestamp / 1e6
                    
                slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                if  slot not in windowMultiplier :
                    windowMultiplier.setdefault(slot, (event['size'], 1))
                else :
                    (r, c) = windowMultiplier[slot]
                    windowMultiplier[slot] = (int(event['size']), 1)
                    
            elif event.name =='chunksLog:rtt_reset' :
                if firstTimeData == -1 :
                    firstTimeData = event.timestamp / 1e9
                    firstTimeDataMs = event.timestamp / 1e6
                    
                slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                if  slot not in windowRttReset :
                    windowRttReset.setdefault(slot, (1, 1))
                else :
                    (r, c) = windowRttReset[slot]
                    windowRttReset[slot] = (r + 1, 1)
                    
                    
        elif event.name.startswith('strategyLog:') :
            if event.name == 'strategyLog:interest_sent' or event.name == 'strategyLog:data_received':
                    
                if event.name == 'strategyLog:data_received' :
                    if event['strategy_name'] not in usedStrategies :
                        usedStrategies.append(event['strategy_name'])
                    
                    if 'rtt' in event :
                        if event['rtt'] != -1 :
                            #rtts.setdefault(numRtt, event['rtt'])
                            if firstTimeData == -1 :
                                firstTimeData = event.timestamp / 1e9
                                firstTimeDataMs = event.timestamp / 1e6
                            
                            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                            #print(slot)
                            if  slot not in rttTime :
                                rttTime.setdefault(slot, (event['rtt'], 1))
                            else :
                                (r, c) = rttTime[slot]
                                rttTime[slot] = (r + event['rtt'], c+1)
                        
                    if 'mean_rtt' in event :
                        if event['mean_rtt'] != -1 :
                            #rttsMean.setdefault(numRtt, event['mean_rtt'])
                            if firstTimeData == -1 :
                                firstTimeData = event.timestamp / 1e9
                                firstTimeDataMs = event.timestamp / 1e6
                            
                            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
                            #print(slot)
                            if  slot not in rttTimeMean :
                                rttTimeMean.setdefault(slot, (event['mean_rtt'], 1))
                            else :
                                (r, c) = rttTimeMean[slot]
                                rttTimeMean[slot] = (r + event['mean_rtt'], c+1)
                    numRtt += 1
                    
                    if 'num_retries' in event :
                        segmentComponent = event['interest_name'].split("?")[0]
                        lol = Name(segmentComponent)
                        if lol.get(-1).isSegment() :
                            segmentsDic.setdefault(lol.get(-1).toSegment(), {}).setdefault('num_retries', event['num_retries'])
                    
        if event.name == 'faceLog:packet_sent' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if slot not in packetSentSecTimes :
                curSent = 1
                packetSentSecTimes.setdefault(slot, curSent)
            else :
                curSent += 1
                packetSentSecTimes[slot] = curSent
                
        elif event.name == 'faceLog:packet_received' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
                
            countPacket += 1
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if slot not in packetReceivedSecTimes :
                curReceived = 1
                packetReceivedSecTimes.setdefault(slot, curReceived)
            else :
                curReceived += 1
                packetReceivedSecTimes[slot] = curReceived
                
        elif event.name == 'faceLog:packet_received_error' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if slot not in packetReceivedErrorSecTimes :
                curReceivedError = 1
                packetReceivedErrorSecTimes.setdefault(slot, curReceivedError)
            else :
                curReceivedError += 1
                packetReceivedErrorSecTimes[slot] = curReceivedError
                
        elif event.name == 'faceLog:packet_sent_error' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if slot not in packetSentErrorSecTimes :
                curSentError = 1
                packetSentErrorSecTimes.setdefault(slot, curSentError)
            else :
                curSentError += 1
                packetSentErrorSecTimes[slot] = curSentError
                
        
        elif event.name == 'strategyLog:rtt_min' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if  slot not in rttMin :
                rttMin.setdefault(slot, (event['rtt_min'], 1))
            else :
                (r, c) = rttMin[slot]
                rttMin[slot] = (r + event['rtt_min'], c+1)
            
        elif event.name == 'strategyLog:rtt_max' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
                
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if  slot not in rttMax :
                rttMax.setdefault(slot, (event['rtt_max'], 1))
            else :
                (r, c) = rttMax[slot]
                rttMax[slot] = (r + event['rtt_max'], c+1)
                
        elif event.name == 'strategyLog:rtt_min_calc' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
             
             
            if event['rtt_min_calc'] < minRttMinCalc :
                minRttMinCalc = event['rtt_min_calc']
                
                
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if  slot not in rttMinCalc :
                rttMinCalc.setdefault(slot, (event['rtt_min_calc'], 1))
            else :
                (r, c) = rttMinCalc[slot]
                rttMinCalc[slot] = (r + event['rtt_min_calc'], c+1)
                
        elif event.name == 'strategyLog:data_rejected' :
            if firstTimeData == -1 :
                firstTimeData = event.timestamp / 1e9
                firstTimeDataMs = event.timestamp / 1e6
            
            slot = int(((event.timestamp / 1e6 ) -  firstTimeDataMs) / 100)
            if slot not in dataRejected :
                dataRejected.setdefault(slot, 1)
            else :
                dataRejected[slot] = dataRejected[slot] + 1
        #elif event.name.startswith('strategyLog:') :
                    
    
    print("End first part, Packets " + str(countPacket) + " segments " + str(countSegment))
    if not noProd :
        for event in loadPutTraces(filepath).events_timestamps(start - prodStartSlack, stop + prodStopSlack):
            if event.name == 'chunksLog:data_sent' :
                if event['segment_number'] not in segmentsDic or event.name not in segmentsDic[event['segment_number']] :
                    segmentsDic.setdefault(event['segment_number'],{}).setdefault(event.name, 1)
                else :
                    segmentsDic[event['segment_number']][event.name] += 1

    
       
    # insert 0 where values is missing
    for i in range (0, lastTimeData) :
        if i not in bytesReceivedSecTimes :
            bytesReceivedSecTimes.setdefault(i,0)
            
    # insert last value where values is missing
    lastValue = 0
    for i in range (0, lastTimeData) :
        if i not in bytesReceivedTimes :
            bytesReceivedTimes.setdefault(i, lastValue)
        lastValue = bytesReceivedTimes[i]
                    
    # Insert segment used in discovery phase 
    segmentsDic.setdefault(discoverySegment,{}).setdefault('chunksLog:data_received', discoveryData)
    segmentsDic.setdefault(discoverySegment,{}).setdefault('chunksLog:interest_sent', discoveryInterest)
    
    startTimestamp = segmentsDic[0]['chunksLog:interest_sent']
    stopTimestamp = segmentsDic[0]['chunksLog:data_received']
    
    totSegments = 0;
    
    retriveTimes = [] # time to retrieve for each segments (from the interest sent to data received)
    timeoutRetries = [] # number of timeout for each segments
    stratRetries = [] # number of strategy retries for each segment
    bytesReceived = []
    datasSent = [] # number of data sent for each segments
    for segmentNo, segmentInfo in segmentsDic.items() :
        
        # Populatate received segments time list
        if 'chunksLog:data_received' in segmentInfo and 'chunksLog:interest_sent' in segmentInfo :
            tot = segmentInfo['chunksLog:data_received'] - segmentInfo['chunksLog:interest_sent']
            retriveTimes.append(tot)
            
            startTimestamp = min(segmentInfo['chunksLog:interest_sent'], startTimestamp)
            stopTimestamp = max(segmentInfo['chunksLog:data_received'], stopTimestamp)
        #else :
            #print ("Segment not received: " + str(segmentNo))
        
        # Populate timeout list    
        if 'chunksLog:interest_timeout' in segmentInfo :
            timeoutRetries.append(segmentInfo['chunksLog:interest_timeout'])
        else :
            timeoutRetries.append(0)
            
        # Populate data sent list    
        if 'chunksLog:data_sent' in segmentInfo :
            datasSent.append(segmentInfo['chunksLog:data_sent'])
        else :
            datasSent.append(0)
            
        if 'num_retries' in segmentInfo :
            stratRetries.append(segmentInfo['num_retries'])
        else :
            stratRetries.append(0)
            
        # Populate byte received
        
        if 'chunksLog:data_received' in segmentInfo :
            if segmentNo in segmentsInfo:
                if 'chunksLog:data_received' in segmentsInfo[segmentNo] :
                    bytesReceived.append(packetSize) #segmentsInfo[segmentNo]['chunksLog:data_received']['bytes']
                else :
                    bytesReceived.append(0)
            else :
                bytesReceived.append(0)   
        else :
            bytesReceived.append(0)
            
    ########## Print statistics
    mathTimes = np.array(retriveTimes)   # TODO use directly retrieveTimes
    mathTimeout = np.array(timeoutRetries)   # TODO use directly timeoutReties
    mathBytes = np.array(bytesReceived)   # TODO use directly timeoutReties
    mathDatasSent = np.array(datasSent)
    mathStratRetries = np.array(stratRetries)
    
    totTime = (stopTimestamp - startTimestamp)/ 1000000000
    
    # print('\n----------- Overall -----------')
    # print('Total time (s)          : {:.1f}'.format(totTime))
    # print('Number of segments      : {:d}'.format(len(segmentsDic)))
    # print('Total received data (MB): {:.3f}'.format(mathBytes.sum()/1000000))
    # print('Speed (KB/s)            : {:.3f}'.format((mathBytes.sum()/1000)/totTime))
    # print('\n--------- Retrieve times ---------')
    # print('Min (ms)             : {:.1f}'.format(mathTimes.min() / 1000000))
    # print('Max (ms)             : {:.1f}'.format(mathTimes.max() / 1000000))
    # print('Mean (ms)            : {:.1f}'.format(mathTimes.mean() / 1000000))
    # print('Dev. std. (ms)       : {:.1f}'.format(mathTimes.std() / 1000000))
    # print('\n---------- Timeouts ----------')
    # print('Min                  : {:.1f}'.format(mathTimeout.min()))
    # print('Max                  : {:.1f}'.format(mathTimeout.max()))
    # print('Mean                 : {:.1f}'.format(mathTimeout.mean()))
    # print('Dev. std.            : {:.1f}'.format(mathTimeout.std()))
    
    wlanSeg = wlanStateBySegmentNo(col, startTimestamp, stopTimestamp)
    wlanSegT = wlanStateByTimestamp(col, startTimestamp, stopTimestamp)
    
    history = getSessionHistory(col, start, stop)
    
    putStart = None
    putPacketSent = {}
    putPacketRec = {}
    
    if not noProd :
        colPut = loadPutTraces(filepath)
        putStart = getPutInput(colPut, start)
        if putStart != None :
            (putPacketSent, putPacketRec) = getPutPackets(colPut, start , stop)
        
    
    i = 0
    while i < max(len(packetReceivedSecTimes), len(packetSentSecTimes)) :
        if i not in packetSentSecTimes.keys() :
            packetSentSecTimes.setdefault(i, 0);
        if i not in packetReceivedSecTimes.keys() :
            packetReceivedSecTimes.setdefault(i, 0);
        i += 1
        
    i = 0
    # while i < max(len(rttTime), len(rttTimeMean)) :
    #     if i not in rttTime.keys() :
    #         rttTime.setdefault(i, (0,1));
    #     if i not in rttTimeMean.keys() :
    #         rttTimeMean.setdefault(i, (0,1));
    #     i += 1
    
    #getInterestRetries(col, wlanSegT)
    
    if totTime > 0 :
        graphs.statToHtml(session, putStart, stopTimestamp, totTime, segmentsDic, mathBytes, mathTimes, mathTimeout, mathStratRetries, \
                          mathDatasSent, bytesReceivedTimes, wlanSeg, wlanSegT, firstTimeData, bytesReceivedSecTimes, \
                          usedStrategies, history, packetSentSecTimes, packetReceivedSecTimes, putPacketSent, putPacketRec, packetReceivedErrorSecTimes, \
                          packetSentErrorSecTimes, rtts, rttsMean, rttTime, rttTimeMean, rttMin, rttMax, rttMinCalc, rttChunks, firstTimeDataMs, packetSize, \
                          windowSizeTime, windowMultiplier, dataRejected, lifetimeTime, windowRttReset)
    else :
        print("Not enough data, skipping results generation for this session")
Ejemplo n.º 40
0
    def test_parameters_sha256_digest(self):
        name = Name()

        digest = bytearray([
          0x28, 0xba, 0xd4, 0xb5, 0x27, 0x5b, 0xd3, 0x92,
          0xdb, 0xb6, 0x70, 0xc7, 0x5c, 0xf0, 0xb6, 0x6f,
          0x13, 0xf7, 0x94, 0x2b, 0x21, 0xe8, 0x0f, 0x55,
          0xc0, 0xe8, 0x6b, 0x37, 0x47, 0x53, 0xa5, 0x48,
          0x00, 0x00
        ])

        name.appendParametersSha256Digest(digest[0:32])
        name.appendParametersSha256Digest(digest[0:32])
        self.assertEqual(name.get(0), name.get(1))

        gotError = True
        try:
            name.appendParametersSha256Digest(digest[0:34])
            gotError = False
        except:
            pass
        if not gotError:
          self.fail("Expected error in appendParametersSha256Digest")

        gotError = True
        try:
            name.appendParametersSha256Digest(digest[0:30])
            gotError = False
        except:
            pass
        if not gotError:
          self.fail("Expected error in appendParametersSha256Digest")

        # Add name.get(2) as a generic component.
        name.append(digest[0:32])
        self.assertTrue(name.get(0).compare(name.get(2)) < 0)
        self.assertEqual(name.get(0).getValue(), name.get(2).getValue())

        # Add name.get(3) as a generic component whose first byte is greater.
        name.append(digest[1:32])
        self.assertTrue(name.get(0).compare(name.get(3)) < 0)

        self.assertEqual(
          name.get(0).toEscapedString(),
          "params-sha256=" +
          "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548")

        self.assertEqual(name.get(0).isParametersSha256Digest(), True)
        self.assertEqual(name.get(2).isParametersSha256Digest(), False)

        gotError = True
        try:
            Name("/hello/params-sha256=hmm")
            gotError = False
        except:
            pass
        if not gotError:
          self.fail("Expected error in new Name from URI")

        # Check canonical URI encoding (lower case).
        name2 = Name(
          "/hello/params-sha256=" +
          "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548")
        self.assertEqual(name.get(0), name2.get(1))

        # Check that it will accept a hex value in upper case too.
        name2 = Name(
          "/hello/params-sha256=" +
          "28BAD4B5275BD392DBB670C75CF0B66F13F7942B21E80F55C0E86B374753A548")
        self.assertEqual(name.get(0), name2.get(1))
Ejemplo n.º 41
0
    def sendInterest(self, syncStates, isRecovery):
        """
        FileSync:
            To be written (TBW)

        ChronoSync2013 docs:
        onReceivedSyncState: 
            When ChronoSync receives a sync state message, this calls onReceivedSyncState(syncStates, isRecovery) 
            where syncStates is the list of SyncState messages and isRecovery is true if this is the initial list of SyncState 
            messages or from a recovery interest. (For example, if isRecovery is true, a chat application would not 
            want to re-display all the associated chat messages.) The callback should send interests to fetch the application 
            data for the sequence numbers in the sync state.
        """
        self.isRecoverySyncState = isRecovery
        util.dump("onReceivedSyncState in recovery: ",
                  self.isRecoverySyncState)

        sendList = []  # of str
        sessionNoList = []  # of int
        sequenceNoList = []  # of int
        # Loops through the syncStates
        # ChronoSync2013: A SyncState holds the values of a sync state message which is passed to the
        #     onReceivedSyncState callback which was given to the ChronoSync2013 constructor.
        for j in range(len(syncStates)):
            syncState = syncStates[j]

            # ChronoSync2013: Get the application data prefix for this sync state message.
            nameComponents = Name(syncState.getDataPrefix())

            #TODO not used..
            tempName = nameComponents.get(-1).toEscapedString()
            # tempName is the random string
            # ChronoSync2013: Get the sequence number for this sync state message.
            sequenceNo = syncState.getSequenceNo()
            # ChronoSync2013: Get the session number associated with the application data prefix for this sync state message.
            sessionNo = syncState.getSessionNo()

            #Loop through sendList for not adding duplcates
            index = -1
            for k in range(len(sendList)):
                if sendList[k] == syncState.getDataPrefix():
                    index = k
                    break
            if index != -1:
                sessionNoList[index] = sessionNo
                sequenceNoList[index] = sequenceNo
            else:
                #append to sendList for sending out interest
                sendList.append(syncState.getDataPrefix())
                sessionNoList.append(sessionNo)
                sequenceNoList.append(sequenceNo)

        # Loop through all syncStates and send an interest for all.
        for i in range(len(sendList)):
            uri = (sendList[i] + "/" + str(sessionNoList[i]) + "/" +
                   str(sequenceNoList[i]))
            interestName = Name(uri)
            util.dump("Sync - sending interest: ", interestName.toUri())

            interest = Interest(interestName)
            interest.setInterestLifetimeMilliseconds(self.syncLifetime)
            self.face.expressInterest(interest, self.onData, self.onTimeout)
Ejemplo n.º 42
0
    try:
        # sleep a second, then tell the repo we want to insert some data
        time.sleep(1)
        while not done:
            #pick a random data name
            data_part = suffix #str(randint(0,N))

            fullName = Name(data_prefix).append(Name(data_part))

            # currently we need to provide the version ourselves when we
            # poke the repo
            ts = int(time.time()*1000)
            fullName.appendVersion(int(ts))
            command = createInsertInterest(fullName)

            versionStr = fullName.get(-1).toEscapedString()
            logger.debug('inserting: ' + versionStr)

            repo_face.makeCommandInterest(command)
            lastFailCount = failure.call_count
            lastSuccessCount = success.call_count

            repo_face.expressInterest(command, success, failure)
            insertTable.append({'version':versionStr, 'insert_request':time.time()})
            while success.call_count == lastSuccessCount and failure.call_count == lastFailCount:
                repo_face.processEvents()
                time.sleep(0.1)

            # only expecting to insert one segment (<1k) for each request         
            # check on the insert status
            # TODO: kick off a greenlet instead of setting global variable?