コード例 #1
0
 def setUp(self):
     self.path = "/tmp/repo_unit_test"
     try:
         os.stat(self.path)
     except:
         os.mkdir(self.path)
     with open(self.path + "/f1", 'w+') as content_file:
         content_file.write("data1")
     with open(self.path + "/f2", 'w+') as content_file:
         content_file.write("data2")
     with open("/tmp/f3", 'w+') as content_file:
         content_file.write("data3")
     manager = multiprocessing.Manager()
     self.repository = SimpleFileSystemRepository(self.path,
                                                  Name("/test/data"),
                                                  manager=manager)
コード例 #2
0
ファイル: test_BasicThunkLayer.py プロジェクト: marvsz/PiCN
    def setUp(self):
        try:
            shutil.rmtree(self.path)
            os.remove("/tmp/repo")
        except:
            pass
        self.path = "/tmp/repo"
        try:
            os.stat(self.path)
        except:
            os.mkdir(self.path)
        with open(self.path + "/d2", 'w+') as content_file:
            content_file.write("data2")
        factory = PiCNSyncDataStructFactory()

        factory.register("cs", ContentStoreMemoryExact)
        factory.register("fib", ForwardingInformationBaseMemoryPrefix)
        factory.register("pit", PendingInterstTableMemoryExact)
        factory.register("faceidtable", FaceIDDict)
        factory.register("thunkTable", ThunkList)
        factory.register("planTable", PlanTable)
        factory.create_manager()

        self.cs = factory.manager.cs()
        self.fib = factory.manager.fib()
        self.pit = factory.manager.pit()
        self.faceidtable = factory.manager.faceidtable()
        self.thunkTable = factory.manager.thunkTable()

        self.parser = DefaultNFNParser()
        self.planTable = factory.manager.planTable(self.parser)
        self.repo = SimpleFileSystemRepository("/tmp/repo", Name("/dat/data"),
                                               multiprocessing.Manager())

        self.thunklayer = BasicThunkLayer(self.cs, self.fib, self.pit,
                                          self.faceidtable, self.thunkTable,
                                          self.planTable, self.parser,
                                          self.repo)
        self.thunklayer.queue_to_higher = multiprocessing.Queue()
        self.thunklayer.queue_to_lower = multiprocessing.Queue()
        self.thunklayer.queue_from_higher = multiprocessing.Queue()
        self.thunklayer.queue_from_lower = multiprocessing.Queue()

        self.thunklayer.start_process()
コード例 #3
0
    def setUp(self):
        self.path = "/tmp/repo_unit_test"
        try:
            os.stat( self.path)
        except:
            os.mkdir( self.path)
        with open( self.path + "/f1", 'w+') as content_file:
            content_file.write("data1")
        with open( self.path + "/f2", 'w+') as content_file:
            content_file.write("data2")
        manager = multiprocessing.Manager()
        self.repository = SimpleFileSystemRepository(self.path, Name("/test/data"), manager=manager)
        self.repositoryLayer = BasicRepositoryLayer(self.repository)

        self.q1_from_lower = multiprocessing.Queue()
        self.q1_to_lower = multiprocessing.Queue()

        self.repositoryLayer.queue_from_lower = self.q1_from_lower
        self.repositoryLayer.queue_to_lower = self.q1_to_lower
コード例 #4
0
    def __init__(self, foldername: Optional[str], prefix: Name,
                 port=9000, log_level=255, encoder: BasicEncoder = None,
                 autoconfig: bool = False, autoconfig_routed: bool = False, interfaces: List[BaseInterface] = None,
                 use_thunks=False):
        """
        :param foldername: If None, use an in-memory repository. Else, use a file system repository.
        """

        logger = Logger("ICNRepoSession", log_level)
        logger.info("Start PiCN Data Repository with Sessions")

        # packet encoder
        if encoder is None:
            self.encoder = SimpleStringEncoder(log_level=log_level)
        else:
            encoder.set_log_level(log_level)
            self.encoder = encoder

        # chunkifyer
        self.chunkifyer = SimpleContentChunkifyer()

        # repo
        manager = multiprocessing.Manager()

        if foldername is None:
            self.repo: BaseRepository = SimpleMemoryRepository(prefix, manager, logger)
        else:
            self.repo: BaseRepository = SimpleFileSystemRepository(foldername, prefix, manager, logger)

        # initialize layers
        synced_data_struct_factory = PiCNSyncDataStructFactory()
        synced_data_struct_factory.register("faceidtable", FaceIDDict)

        if use_thunks:
            synced_data_struct_factory.register("thunktable", ThunkList)
            synced_data_struct_factory.register("plantable", PlanTable)
        synced_data_struct_factory.create_manager()
        faceidtable = synced_data_struct_factory.manager.faceidtable()

        if use_thunks:
            self.parser = DefaultNFNParser()
            thunktable = synced_data_struct_factory.manager.thunktable()
            plantable = synced_data_struct_factory.manager.plantable(self.parser)

        if interfaces is not None:
            self.interfaces = interfaces
            mgmt_port = port
        else:
            interfaces = [UDP4Interface(port)]
            mgmt_port = interfaces[0].get_port()

        self.linklayer = BasicLinkLayer(interfaces, faceidtable, log_level=log_level)
        self.packetencodinglayer = BasicPacketEncodingLayer(self.encoder, log_level=log_level)
        self.chunklayer = BasicChunkLayer(self.chunkifyer, log_level=log_level)
        self.repolayer = SessionRepositoryLayer(self.repo, log_level=log_level)

        if use_thunks:
            self.thunklayer = BasicThunkLayer(None, None, None, faceidtable, thunktable, plantable, self.parser, self.repo, log_level=log_level)
            logger.info("Using Thunks")

        if use_thunks:
            self.lstack: LayerStack = LayerStack([
                self.repolayer,
                self.chunklayer,
                self.thunklayer,
                self.packetencodinglayer,
                self.linklayer
            ])
        else:
            self.lstack: LayerStack = LayerStack([
                self.repolayer,
                self.chunklayer,
                self.packetencodinglayer,
                self.linklayer
            ])

        if autoconfig:
            self.autoconfiglayer = AutoconfigRepoLayer(name=prefix.string_components[-1],
                                                       addr='127.0.0.1',
                                                       linklayer=self.linklayer, repo=self.repo,
                                                       register_global=autoconfig_routed, log_level=log_level)
            self.lstack.insert(self.autoconfiglayer, below_of=self.chunklayer)

        # mgmt
        self.mgmt = Mgmt(None, None, None, self.linklayer, mgmt_port,
                         self.start_repo, repo_path=foldername,
                         repo_prfx=prefix, log_level=log_level)
コード例 #5
0
class test_SimpleFileSystemRepository(unittest.TestCase):
    """Test the Simple File System Repository"""
    def setUp(self):
        self.path = "/tmp/repo_unit_test"
        try:
            os.stat(self.path)
        except:
            os.mkdir(self.path)
        with open(self.path + "/f1", 'w+') as content_file:
            content_file.write("data1")
        with open(self.path + "/f2", 'w+') as content_file:
            content_file.write("data2")
        with open("/tmp/f3", 'w+') as content_file:
            content_file.write("data3")
        manager = multiprocessing.Manager()
        self.repository = SimpleFileSystemRepository(self.path,
                                                     Name("/test/data"),
                                                     manager=manager)

    def tearDown(self):
        try:
            shutil.rmtree(self.path)
            os.remove("/tmp/repo_unit_test")
        except:
            pass

    def test_content_available(self):
        """Test if the function is_content_available works correct"""
        try:
            os.remove("/tmp/repo_unit_test/f3")  #ensure there is no f3
        except:
            pass
        self.assertTrue(
            self.repository.is_content_available(Name("/test/data/f1")))
        self.assertTrue(
            self.repository.is_content_available(Name("/test/data/f2")))
        self.assertFalse(
            self.repository.is_content_available(Name("/test/data/f3")))

    def test_get_content(self):
        """test if the function get content works correct"""
        c1_cmp = Content("/test/data/f1", "data1")
        c1 = self.repository.get_content(Name("/test/data/f1"))
        self.assertEqual(c1, c1_cmp)

        c2_cmp = Content("/test/data/f2", "data2")
        c2 = self.repository.get_content(Name("/test/data/f2"))
        self.assertEqual(c2, c2_cmp)

        c3 = self.repository.get_content(Name("/test/data/f3"))
        self.assertEqual(c3, None)

    def test_get_content_directory_traversal(self):
        """test if the function get content do not allow directory traversal"""
        c4 = self.repository.get_content(Name("/test/data/../f3"))
        self.assertEqual(c4, None)

        c5 = self.repository.get_content(Name("/test/data/..%2Ff3"))
        self.assertEqual(c5, None)

        c6 = self.repository.get_content(Name("/test/data/..%2ff3"))
        self.assertEqual(c6, None)

        n1 = Name("/test/data")
        n1 += "../f3"
        c7 = self.repository.get_content(n1)
        self.assertEqual(c7, None)

        n2 = Name("/test/data")
        n2 += "..%2ff3"
        c8 = self.repository.get_content(n2)
        self.assertEqual(c8, None)

        n3 = Name("/test/data")
        n3 += "..%2Ff3"
        c9 = self.repository.get_content(n3)
        self.assertEqual(c9, None)

    def test_get_content_invalid_prefix(self):
        """test if the function get content do not return data from a invalid prefix"""
        c10 = self.repository.get_content(Name("/data/test/f1"))
        self.assertEqual(c10, None)

    def test_get_size(self):
        """test the functionality of the get size function"""
        c1 = self.repository.get_content(Name("/test/data/f1"))
        size = len(c1.content)
        self.assertEqual(size,
                         self.repository.get_data_size(Name("/test/data/f1")))