Example #1
0
 def test_recreate_deleted(self):
     view = View(self.log, self.root_key)
     view.build()
     home_path = os.path.join(os.sep, 'home-' + utils.random_ascii())
     user_path = os.path.join(home_path, 'user-' + utils.random_ascii())
     view.mkdir(home_path)
     view.mkdir(user_path)
     file_path = os.path.join(user_path, utils.random_ascii())
     file_content = utils.random_ascii()
     view.write(file_path, file_content)
     self.assertEqual(file_content.encode(), view.get(file_path).content)
     view.delete(home_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(file_path)
     view.mkdir(home_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(file_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
     # File
     view.mkdir(user_path)
     new_file_content = utils.random_ascii()
     view.write(file_path, new_file_content)
     self.assertEqual(new_file_content.encode(),
                      view.get(file_path).content)
     # Reload
     self.rebuild(view)
     self.assertEqual(new_file_content.encode(),
                      view.get(file_path).content)
     view.get(user_path)
     view.delete(file_path)
     new_file_content = utils.random_ascii()
     view.write(file_path, new_file_content)
     self.assertEqual(new_file_content.encode(),
                      view.get(file_path).content)
Example #2
0
 def test_recreate_deleted(self):
     view = View(self.log, self.root_key)
     view.build()
     home_path = os.path.join(os.sep, 'home-' + utils.random_ascii())
     user_path = os.path.join(home_path, 'user-' + utils.random_ascii())
     view.mkdir(home_path)
     view.mkdir(user_path)
     file_path = os.path.join(user_path, utils.random_ascii())
     file_content = utils.random_ascii()
     view.write(file_path, file_content)
     self.assertEqual(file_content.encode(), view.get(file_path).content)
     view.delete(home_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(file_path)
     view.mkdir(home_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(file_path)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
     # File
     view.mkdir(user_path)
     new_file_content = utils.random_ascii()
     view.write(file_path, new_file_content)
     self.assertEqual(new_file_content.encode(), view.get(file_path).content)
     # Reload
     self.rebuild(view)
     self.assertEqual(new_file_content.encode(), view.get(file_path).content)
     view.get(user_path)
     view.delete(file_path)
     new_file_content = utils.random_ascii()
     view.write(file_path, new_file_content)
     self.assertEqual(new_file_content.encode(), view.get(file_path).content)
Example #3
0
 def test_hardlink(self):
     view = View(self.log, self.root_key)
     view.build()
     rata_node = view.mkdir('/rata')
     view.link('/home', rata_node.entry.hash)
     print(view.get('/home') == rata_node)
     kakas_node = view.write('/kakas', b'hola')
     view.link('/kakas_link', kakas_node.entry.hash)
     self.assertEqual(b'hola', view.get('/kakas_link').content)
     view.delete('/kakas')
     self.assertEqual(b'hola', view.get('/kakas_link').content)
     print(view.get('/kakas').content)
Example #4
0
 def test_hardlink(self):
     view = View(self.log, self.root_key)
     view.build()
     rata_node = view.mkdir('/rata')
     view.link('/home', rata_node.entry.hash)
     print(view.get('/home') == rata_node)
     kakas_node = view.write('/kakas', b'hola')
     view.link('/kakas_link', kakas_node.entry.hash)
     self.assertEqual(b'hola', view.get('/kakas_link').content)
     view.delete('/kakas')
     self.assertEqual(b'hola', view.get('/kakas_link').content)
     print(view.get('/kakas').content)
Example #5
0
 def test_deleted_nested_dir(self):
     view = View(self.log, self.root_key)
     view.build()
     home_path = os.path.join(os.sep, 'home-' + utils.random_ascii())
     user_path = os.path.join(home_path, 'user-' + utils.random_ascii())
     view.mkdir(home_path)
     view.mkdir(user_path)
     view.delete(home_path)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
     self.rebuild(view)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
Example #6
0
 def test_deleted_nested_dir(self):
     view = View(self.log, self.root_key)
     view.build()
     home_path = os.path.join(os.sep, 'home-' + utils.random_ascii())
     user_path = os.path.join(home_path, 'user-' + utils.random_ascii())
     view.mkdir(home_path)
     view.mkdir(user_path)
     view.delete(home_path)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
     self.rebuild(view)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
     with self.assertRaises(exceptions.DoesNotExist):
         view.get(user_path)
Example #7
0
 def test_delete(self):
     view = View(self.log, self.root_key)
     view.build()
     # Delete File
     file_path = os.path.join(os.sep, utils.random_ascii())
     content = utils.random_ascii()
     view.write(file_path, content)
     self.assertEqual(LogEntry.WRITE, view.get(file_path).entry.action)
     self.assertEqual(content.encode(), view.get(file_path).content)
     view.delete(file_path)
     self.assertEqual(LogEntry.DELETE, view.get(file_path).entry.action)
     # Reload
     self.rebuild(view)
     self.assertEqual(LogEntry.DELETE, view.get(file_path).entry.action)
     # Delete Dir
     home_path = os.path.join(os.sep, utils.random_ascii())
     view.mkdir(home_path)
     self.assertEqual(LogEntry.MKDIR, view.paths.get(home_path).entry.action)
     view.delete(home_path)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
Example #8
0
 def test_delete(self):
     view = View(self.log, self.root_key)
     view.build()
     # Delete File
     file_path = os.path.join(os.sep, utils.random_ascii())
     content = utils.random_ascii()
     view.write(file_path, content)
     self.assertEqual(LogEntry.WRITE, view.get(file_path).entry.action)
     self.assertEqual(content.encode(), view.get(file_path).content)
     view.delete(file_path)
     self.assertEqual(LogEntry.DELETE, view.get(file_path).entry.action)
     # Reload
     self.rebuild(view)
     self.assertEqual(LogEntry.DELETE, view.get(file_path).entry.action)
     # Delete Dir
     home_path = os.path.join(os.sep, utils.random_ascii())
     view.mkdir(home_path)
     self.assertEqual(LogEntry.MKDIR,
                      view.paths.get(home_path).entry.action)
     view.delete(home_path)
     self.assertEqual(LogEntry.DELETE, view.get(home_path).entry.action)
Example #9
0
 def test_write(self):
     view = View(self.log, self.root_key)
     view.build()
     path = os.path.join(os.sep, utils.random_ascii())
     content = utils.random_ascii()
     view.write(path, content)
     self.assertEqual(LogEntry.WRITE, view.get(path).entry.action)
     self.assertEqual(content.encode(), view.get(path).content)
     self.rebuild(view)
     self.assertEqual(content.encode(), view.get(path).content)
     with self.assertRaises(exceptions.Exists):
         view.mkdir(path)
     view.delete(path)
     view.mkdir(path)
     path = os.path.join(path, 'content-%s' % utils.random_ascii())
     alt_content = utils.random_ascii()
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     alt_content += utils.random_ascii()
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     alt_content = utils.random_ascii(512**2)
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     view.delete(path)
     self.assertEqual(LogEntry.DELETE, view.get(path).entry.action)
     view.mkdir(path)
     self.assertEqual(LogEntry.MKDIR, view.get(path).entry.action)
     view.delete(path)
     self.assertEqual(LogEntry.DELETE, view.get(path).entry.action)
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
Example #10
0
 def test_write(self):
     view = View(self.log, self.root_key)
     view.build()
     path = os.path.join(os.sep, utils.random_ascii())
     content = utils.random_ascii()
     view.write(path, content)
     self.assertEqual(LogEntry.WRITE, view.get(path).entry.action)
     self.assertEqual(content.encode(), view.get(path).content)
     self.rebuild(view)
     self.assertEqual(content.encode(), view.get(path).content)
     with self.assertRaises(exceptions.Exists):
         view.mkdir(path)
     view.delete(path)
     view.mkdir(path)
     path = os.path.join(path, 'content-%s' % utils.random_ascii())
     alt_content = utils.random_ascii()
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     alt_content += utils.random_ascii()
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     alt_content = utils.random_ascii(512**2)
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
     view.delete(path)
     self.assertEqual(LogEntry.DELETE, view.get(path).entry.action)
     view.mkdir(path)
     self.assertEqual(LogEntry.MKDIR, view.get(path).entry.action)
     view.delete(path)
     self.assertEqual(LogEntry.DELETE, view.get(path).entry.action)
     view.write(path, alt_content)
     self.assertEqual(alt_content.encode(), view.get(path).content)
Example #11
0
class HandlerTests(unittest.TestCase):
    def init(self):
        __, self.logpath = tempfile.mkstemp()
        __, self.logpath_b = tempfile.mkstemp()
        self.addCleanup(os.remove, self.logpath)
        self.addCleanup(os.remove, self.logpath_b)
        self.log, self.root_key = utils.bootstrap(self.logpath)
        shutil.copy2(self.logpath, self.logpath_b)
        self.log_b = Log(self.logpath_b)
        self.log.load()
        self.log_b.load()
        self.view = View(self.log, self.root_key)
        self.view_b = View(self.log_b, self.root_key)
        self.view.build()
        self.view_b.build()
        protocol = BasefsSyncProtocol(self.log)
        protocol_b = BasefsSyncProtocol(self.log_b)
        protocol.transport = utils.Socket()
        protocol_b.transport = utils.Socket()
        return protocol, protocol_b

    def test_sync(self):
        protocol, protocol_b = self.init()
        self.assertEqual(protocol.initial_request(),
                         protocol_b.initial_request())
        path = os.path.join(os.sep, 'home-' + utils.random_ascii())
        node = self.view.mkdir(path)
        protocol.update_merkle(node.entry)
        self.assertNotEqual(protocol.initial_request(),
                            protocol_b.initial_request())
        # 1
        request = protocol_b.initial_request()
        # 2
        protocol.data_received(request)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash,
                         response.decode().splitlines()[1])
        # 3
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.PATH_REQ, response.decode().splitlines()[0])
        self.assertEqual(path, response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 5
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)

        # delete
        dnode = self.view.delete(path)
        protocol.update_merkle(dnode.entry)
        request = protocol_b.initial_request()
        # 2
        protocol.data_received(request)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash,
                         response.decode().splitlines()[1])
        # 3
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*%s %s' % (path, node.entry.hash),
                         response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 5
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)

    def test_sync_reverse(self):
        # Reverse communication
        protocol, protocol_b = self.init()
        path = os.path.join(os.sep, 'home-' + utils.random_ascii())
        node = self.view.mkdir(path)
        protocol.update_merkle(node.entry)
        # 1
        request = protocol.initial_request()
        # 2
        protocol_b.data_received(request)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash,
                         response.decode().splitlines()[1])
        # 3
        protocol.data_received(response)
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        response = protocol.transport.read()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 4
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)

        # delete
        dnode = self.view.delete(path)
        protocol.update_merkle(dnode.entry)
        request = protocol.initial_request()
        # 2
        protocol_b.data_received(request)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash,
                         response.decode().splitlines()[1])
        # 3
        protocol.data_received(response)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual(
            '*%s %s %s' % (path, node.entry.hash, dnode.entry.hash),
            response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.ENTRY_REQ, response.decode().splitlines()[0])
        self.assertEqual(dnode.entry.hash, response.decode().splitlines()[1])
        # 5
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        self.assertEqual(3, len(response.decode().splitlines()))
        # BAD request
        before = self.log.print_tree()
        protocol.data_received(response)
        self.assertEqual(before, self.log.print_tree())
        # 6
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
Example #12
0
class HandlerTests(unittest.TestCase):
    def init(self):
        __, self.logpath = tempfile.mkstemp()
        __, self.logpath_b = tempfile.mkstemp()
        self.addCleanup(os.remove, self.logpath)
        self.addCleanup(os.remove, self.logpath_b)
        self.log, self.root_key = utils.bootstrap(self.logpath)
        shutil.copy2(self.logpath, self.logpath_b)
        self.log_b = Log(self.logpath_b)
        self.log.load()
        self.log_b.load()
        self.view = View(self.log, self.root_key)
        self.view_b = View(self.log_b, self.root_key)
        self.view.build()
        self.view_b.build()
        protocol = BasefsSyncProtocol(self.log)
        protocol_b = BasefsSyncProtocol(self.log_b)
        protocol.transport = utils.Socket()
        protocol_b.transport = utils.Socket()
        return protocol, protocol_b
    
    def test_sync(self):
        protocol, protocol_b = self.init()
        self.assertEqual(protocol.initial_request(), protocol_b.initial_request())
        path = os.path.join(os.sep, 'home-' + utils.random_ascii())
        node = self.view.mkdir(path)
        protocol.update_merkle(node.entry)
        self.assertNotEqual(protocol.initial_request(), protocol_b.initial_request())
        # 1
        request = protocol_b.initial_request()
        # 2
        protocol.data_received(request)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash, response.decode().splitlines()[1])
        # 3
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.PATH_REQ, response.decode().splitlines()[0])
        self.assertEqual(path, response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 5
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)
        
        # delete
        dnode = self.view.delete(path)
        protocol.update_merkle(dnode.entry)
        request = protocol_b.initial_request()
        # 2
        protocol.data_received(request)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash, response.decode().splitlines()[1])
        # 3
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*%s %s' % (path, node.entry.hash), response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4 
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 5
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)
        
    def test_sync_reverse(self):
        # Reverse communication
        protocol, protocol_b = self.init()
        path = os.path.join(os.sep, 'home-' + utils.random_ascii())
        node = self.view.mkdir(path)
        protocol.update_merkle(node.entry)
        # 1
        request = protocol.initial_request()
        # 2
        protocol_b.data_received(request)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash, response.decode().splitlines()[1])
        # 3
        protocol.data_received(response)
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        response = protocol.transport.read()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(3, len(response.decode().splitlines()))
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        # 4
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)
        
        # delete
        dnode = self.view.delete(path)
        protocol.update_merkle(dnode.entry)
        request = protocol.initial_request()
        # 2
        protocol_b.data_received(request)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*/ ' + self.log.root.hash, response.decode().splitlines()[1])
        # 3
        protocol.data_received(response)
        response = protocol.transport.read()
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.LS, response.decode().splitlines()[0])
        self.assertEqual('*%s %s %s' % (path, node.entry.hash, dnode.entry.hash), response.decode().splitlines()[1])
        self.assertEqual(2, len(response.decode().splitlines()))
        # 4 
        protocol_b.data_received(response)
        response = protocol_b.transport.read()
        protocol_b.transport = utils.Socket()
        self.assertEqual(protocol.ENTRY_REQ, response.decode().splitlines()[0])
        self.assertEqual(dnode.entry.hash, response.decode().splitlines()[1])
        # 5
        protocol.data_received(response)
        response = protocol.transport.read()
        with self.assertRaises(ValueError):
            protocol.transport.read(close_check=True)
        protocol.transport = utils.Socket()
        self.assertEqual(protocol.ENTRIES, response.decode().splitlines()[0])
        self.assertEqual(protocol.CLOSE, response.decode().splitlines()[-1])
        self.assertEqual(3, len(response.decode().splitlines()))
        # BAD request
        before = self.log.print_tree()
        protocol.data_received(response)
        self.assertEqual(before, self.log.print_tree())
        # 6
        protocol_b.data_received(response)
        with self.assertRaises(ValueError):
            protocol_b.transport.read(close_check=True)
        self.assertDictEqual(protocol.merkle, protocol_b.merkle)
        self.assertEqual(self.log.print_tree(), self.log_b.print_tree())