class TestWorldChunks(unittest.TestCase): def setUp(self): self.name = "unittest" self.bcp = BravoConfigParser() self.bcp.add_section("world unittest") self.bcp.set("world unittest", "url", "") self.bcp.set("world unittest", "serializer", "memory") self.w = World(self.bcp, self.name) self.w.pipeline = [] self.w.start() def tearDown(self): self.w.stop() def test_trivial(self): pass @inlineCallbacks def test_request_chunk_identity(self): first = yield self.w.request_chunk(0, 0) second = yield self.w.request_chunk(0, 0) self.assertIs(first, second) @inlineCallbacks def test_request_chunk_cached_identity(self): # Turn on the cache and get a few chunks in there, then request a # chunk that is in the cache. yield self.w.enable_cache(1) first = yield self.w.request_chunk(0, 0) second = yield self.w.request_chunk(0, 0) self.assertIs(first, second) @inlineCallbacks def test_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = array("B") chunk.blocks.fromstring(os.urandom(32768)) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = array("B") chunk.metadata.fromstring(os.urandom(32768)) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_get_block_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = array("B") chunk.blocks.fromstring(os.urandom(32768)) # Evict the chunk and grab it again. yield self.w.save_chunk(chunk) del chunk chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_block_readback_negative(self): chunk = yield self.w.request_chunk(-1, -1) # Fill the chunk with random stuff. chunk.blocks = array("B") chunk.blocks.fromstring(os.urandom(32768)) # Evict the chunk and grab it again. yield self.w.save_chunk(chunk) del chunk chunk = yield self.w.request_chunk(-1, -1) for x, y, z in product(xrange(2), repeat=3): block = yield self.w.get_block((x - 16, y, z - 16)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = array("B") chunk.metadata.fromstring(os.urandom(32768)) # Evict the chunk and grab it again. yield self.w.save_chunk(chunk) del chunk chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_world_level_mark_chunk_dirty(self): chunk = yield self.w.request_chunk(0, 0) # Reload chunk. yield self.w.save_chunk(chunk) del chunk chunk = yield self.w.request_chunk(0, 0) self.assertFalse(chunk.dirty) self.w.mark_dirty((12, 64, 4)) chunk = yield self.w.request_chunk(0, 0) self.assertTrue(chunk.dirty) @inlineCallbacks def test_world_level_mark_chunk_dirty_offset(self): chunk = yield self.w.request_chunk(1, 2) # Reload chunk. yield self.w.save_chunk(chunk) del chunk chunk = yield self.w.request_chunk(1, 2) self.assertFalse(chunk.dirty) self.w.mark_dirty((29, 64, 43)) chunk = yield self.w.request_chunk(1, 2) self.assertTrue(chunk.dirty) @inlineCallbacks def test_sync_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = array("B") chunk.blocks.fromstring(os.urandom(32768)) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = self.w.sync_get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) def test_sync_get_block_unloaded(self): self.assertRaises(ChunkNotLoaded, self.w.sync_get_block, (0, 0, 0)) def test_sync_get_metadata_neighboring(self): """ Even if a neighboring chunk is loaded, the target chunk could still be unloaded. Test with sync_get_metadata() to increase test coverage. """ d = self.w.request_chunk(0, 0) @d.addCallback def cb(chunk): self.assertRaises(ChunkNotLoaded, self.w.sync_get_metadata, (16, 0, 0)) return d
class TestWorldChunks(unittest.TestCase): def setUp(self): self.name = "unittest" self.d = tempfile.mkdtemp() bravo.config.configuration.add_section("world unittest") bravo.config.configuration.set("world unittest", "url", "file://%s" % self.d) bravo.config.configuration.set("world unittest", "serializer", "alpha") self.w = World(self.name) self.w.pipeline = [] self.w.start() def tearDown(self): self.w.stop() del self.w shutil.rmtree(self.d) bravo.config.configuration.remove_section("world unittest") def test_trivial(self): pass @inlineCallbacks def test_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.metadata.shape = (16, 16, 128) for x, y, z in product(xrange(2), xrange(2), xrange(2)): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_get_block_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), xrange(2), xrange(2)): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_block_readback_negative(self): chunk = yield self.w.request_chunk(-1, -1) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(-1, -1) for x, y, z in product(xrange(2), xrange(2), xrange(2)): block = yield self.w.get_block((x - 16, y, z - 16)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.metadata.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), xrange(2), xrange(2)): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_world_level_mark_chunk_dirty(self): chunk = yield self.w.request_chunk(0, 0) # Reload chunk. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) self.assertFalse(chunk.dirty) self.w.mark_dirty((12, 64, 4)) chunk = yield self.w.request_chunk(0, 0) self.assertTrue(chunk.dirty) @inlineCallbacks def test_world_level_mark_chunk_dirty_offset(self): chunk = yield self.w.request_chunk(1, 2) # Reload chunk. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(1, 2) self.assertFalse(chunk.dirty) self.w.mark_dirty((29, 64, 43)) chunk = yield self.w.request_chunk(1, 2) self.assertTrue(chunk.dirty) @inlineCallbacks def test_sync_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = self.w.sync_get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) def test_sync_get_block_unloaded(self): self.assertRaises(ChunkNotLoaded, self.w.sync_get_block, (0, 0, 0)) def test_sync_get_metadata_neighboring(self): """ Even if a neighboring chunk is loaded, the target chunk could still be unloaded. Test with sync_get_metadata() to increase test coverage. """ d = self.w.request_chunk(0, 0) @d.addCallback def cb(chunk): self.assertRaises(ChunkNotLoaded, self.w.sync_get_metadata, (16, 0, 0)) return d
class TestWorldChunks(unittest.TestCase): def setUp(self): self.name = "unittest" self.d = tempfile.mkdtemp() self.bcp = BravoConfigParser() self.bcp.add_section("world unittest") self.bcp.set("world unittest", "url", "file://%s" % self.d) self.bcp.set("world unittest", "serializer", "alpha") self.w = World(self.bcp, self.name) self.w.pipeline = [] self.w.start() def tearDown(self): self.w.stop() shutil.rmtree(self.d) def test_trivial(self): pass @inlineCallbacks def test_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = numpy.fromstring(numpy.random.bytes( chunk.blocks.size), dtype=numpy.uint8) chunk.metadata.shape = (16, 16, 128) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_get_block_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = yield self.w.get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_block_readback_negative(self): chunk = yield self.w.request_chunk(-1, -1) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(-1, -1) for x, y, z in product(xrange(2), repeat=3): block = yield self.w.get_block((x - 16, y, z - 16)) self.assertEqual(block, chunk.get_block((x, y, z))) @inlineCallbacks def test_get_metadata_readback(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.metadata = numpy.fromstring(numpy.random.bytes( chunk.blocks.size), dtype=numpy.uint8) chunk.metadata.shape = (16, 16, 128) # Evict the chunk and grab it again. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. metadata = yield self.w.get_metadata((x, y, z)) self.assertEqual(metadata, chunk.get_metadata((x, y, z))) @inlineCallbacks def test_world_level_mark_chunk_dirty(self): chunk = yield self.w.request_chunk(0, 0) # Reload chunk. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(0, 0) self.assertFalse(chunk.dirty) self.w.mark_dirty((12, 64, 4)) chunk = yield self.w.request_chunk(0, 0) self.assertTrue(chunk.dirty) @inlineCallbacks def test_world_level_mark_chunk_dirty_offset(self): chunk = yield self.w.request_chunk(1, 2) # Reload chunk. self.w.save_chunk(chunk) del chunk self.w.chunk_cache.clear() self.w.dirty_chunk_cache.clear() chunk = yield self.w.request_chunk(1, 2) self.assertFalse(chunk.dirty) self.w.mark_dirty((29, 64, 43)) chunk = yield self.w.request_chunk(1, 2) self.assertTrue(chunk.dirty) @inlineCallbacks def test_sync_get_block(self): chunk = yield self.w.request_chunk(0, 0) # Fill the chunk with random stuff. chunk.blocks = numpy.fromstring(numpy.random.bytes(chunk.blocks.size), dtype=numpy.uint8) chunk.blocks.shape = (16, 16, 128) for x, y, z in product(xrange(2), repeat=3): # This works because the chunk is at (0, 0) so the coords don't # need to be adjusted. block = self.w.sync_get_block((x, y, z)) self.assertEqual(block, chunk.get_block((x, y, z))) def test_sync_get_block_unloaded(self): self.assertRaises(ChunkNotLoaded, self.w.sync_get_block, (0, 0, 0)) def test_sync_get_metadata_neighboring(self): """ Even if a neighboring chunk is loaded, the target chunk could still be unloaded. Test with sync_get_metadata() to increase test coverage. """ d = self.w.request_chunk(0, 0) @d.addCallback def cb(chunk): self.assertRaises(ChunkNotLoaded, self.w.sync_get_metadata, (16, 0, 0)) return d