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")
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')
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())
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
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)
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))
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")
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
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)
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")
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")
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")
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
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
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 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()
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()
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)
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
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
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)
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))
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)
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
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")
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())
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")
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()))
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')
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()
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")
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")
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))
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)
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?