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)
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)
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)
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)
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)
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())
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())