예제 #1
0
    async def test_transfer_success_case(self):
        await self.system_clock_fast_forward(speed_multiplier=25)

        commutator, error = await self.login('player', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_1 = modules.get_ship(commutator, ShipType.MINER.value, "miner-1")
        self.assertIsNotNone(miner_1)
        miner_1_cargo = modules.get_cargo(commutator=miner_1, name='cargo')
        self.assertIsNotNone(miner_1_cargo)

        miner_2 = modules.get_ship(commutator, ShipType.MINER.value, "miner-2")
        self.assertIsNotNone(miner_2)
        miner_2_cargo = modules.get_cargo(commutator=miner_2, name='cargo')
        self.assertIsNotNone(miner_2_cargo)

        # Opening a port on miner_2
        access_key = 12456
        status, port = await miner_2_cargo.open_port(access_key=access_key)
        self.assertTrue(status.is_success())
        self.assertNotEqual(0, port)

        total_transferred_amount: float = 0.0  # Will be accumulated in progress callback

        def cb_progress_report(item: ResourceItem):
            self.assertEqual(ResourceType.e_METALS, item.resource_type)
            nonlocal total_transferred_amount
            total_transferred_amount += item.amount

        # Transferring resources from miner_1 to miner_2
        status = await miner_1_cargo.transfer(port=port,
                                              access_key=access_key,
                                              progress_cb=cb_progress_report,
                                              resource=ResourceItem(
                                                  ResourceType.e_METALS,
                                                  30000))
        self.assertEqual(ResourceContainerI.Status.SUCCESS, status)
        self.assertAlmostEqual(30000, total_transferred_amount)

        # Check resources in containers
        content = await miner_1_cargo.get_content()
        self.assertAlmostEqual(20000, content.resources[ResourceType.e_METALS])
        self.assertAlmostEqual(20000,
                               content.resources[ResourceType.e_SILICATES])
        self.assertAlmostEqual(15000, content.resources[ResourceType.e_ICE])

        content = await miner_2_cargo.get_content()
        self.assertAlmostEqual(35000, content.resources[ResourceType.e_METALS])
        self.assertAlmostEqual(5000,
                               content.resources[ResourceType.e_SILICATES])
        self.assertAlmostEqual(10000, content.resources[ResourceType.e_ICE])
    async def test_mining(self):
        await self.system_clock_fast_forward(speed_multiplier=50)

        commutator, error = await self.login('oreman', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_ship = modules.get_ship(commutator, "Miner", "miner-1")
        self.assertIsNotNone(miner_ship)

        miner = modules.get_asteroid_miner(miner_ship, "miner")
        self.assertIsNotNone(miner)

        status = await miner.bind_to_cargo("cargo")
        self.assertEqual(AsteroidMinerI.Status.SUCCESS, status)
        self.assertEqual("cargo", miner.cargo_name)

        # Looking for the asteroid, that should be nearby
        scanner: modules.CelestialScanner = modules.get_celestial_scanner(
            miner_ship, "scanner")
        self.assertIsNotNone(scanner)

        result, error = await scanner.scan_sync(scanning_radius_km=1,
                                                minimal_radius_m=5)
        self.assertIsNone(error)
        self.assertIsNotNone(result)
        self.assertEqual(1, len(result))
        asteroid = result[0]

        # Mining until we have 1000 of metals
        collected_resources: Dict[ResourceType, float] = {
            ResourceType.e_METALS: 0
        }

        def progress_cb(status: AsteroidMinerI.Status,
                        resources: ResourcesDict) -> bool:
            for resource_type, amount in resources.items():
                if resource_type in collected_resources:
                    collected_resources[resource_type] += amount
                else:
                    collected_resources[resource_type] = amount
            return collected_resources[ResourceType.e_METALS] < 1000

        # Mining an asteroid
        await self.system_clock_fast_forward(speed_multiplier=500)
        status = await miner.start_mining(asteroid_id=asteroid.object_id,
                                          progress_cb=progress_cb)
        self.assertEqual(AsteroidMinerI.Status.SUCCESS, status)
        await self.system_clock_fast_forward(speed_multiplier=50)

        # Check the cargo content
        cargo = modules.get_cargo(miner_ship, "cargo")
        self.assertIsNotNone(cargo)
        content = await cargo.get_content()
        self.assertIsNotNone(content)
        self.assertLessEqual(1000, content.resources[ResourceType.e_METALS])
예제 #3
0
    async def test_transfer_fails_cases(self):
        await self.system_clock_fast_forward(speed_multiplier=25)

        commutator, error = await self.login('player', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_1 = modules.get_ship(commutator, ShipType.MINER.value, "miner-1")
        self.assertIsNotNone(miner_1)
        miner_1_cargo = modules.get_cargo(commutator=miner_1, name='cargo')
        self.assertIsNotNone(miner_1_cargo)

        miner_2 = modules.get_ship(commutator, ShipType.MINER.value, "miner-2")
        self.assertIsNotNone(miner_2)
        miner_2_cargo = modules.get_cargo(commutator=miner_2, name='cargo')
        self.assertIsNotNone(miner_2_cargo)

        # Port is not opened error:
        status = await miner_1_cargo.transfer(port=4,
                                              access_key=123456,
                                              resource=ResourceItem(
                                                  ResourceType.e_METALS,
                                                  30000))
        self.assertEqual(ResourceContainerI.Status.PORT_IS_NOT_OPENED, status)

        # Opening a port on miner_2
        access_key = 12456
        status, port = await miner_2_cargo.open_port(access_key=access_key)
        self.assertTrue(status.is_success())
        self.assertNotEqual(0, port)

        # Invalid access key
        status = await miner_1_cargo.transfer(port=port,
                                              access_key=access_key - 1,
                                              resource=ResourceItem(
                                                  ResourceType.e_METALS,
                                                  30000))
        self.assertEqual(ResourceContainerI.Status.INVALID_ACCESS_KEY, status)
    async def test_cargo_is_full(self):
        await self.system_clock_fast_forward(speed_multiplier=50)

        commutator, error = await self.login('oreman', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_ship = modules.get_ship(commutator, "Miner", "miner-1")
        self.assertIsNotNone(miner_ship)

        miner = modules.get_asteroid_miner(miner_ship, "miner")
        self.assertIsNotNone(miner)

        status, miner_spec = await miner.get_specification()
        self.assertEqual(status, AsteroidMinerI.Status.SUCCESS)
        self.assertIsNotNone(miner_spec)

        status = await miner.bind_to_cargo("tiny_cargo")
        self.assertEqual(AsteroidMinerI.Status.SUCCESS, status)
        self.assertEqual("tiny_cargo", miner.cargo_name)

        # Looking for the asteroid, that should be nearby
        scanner: modules.CelestialScanner = modules.get_celestial_scanner(
            miner_ship, "scanner")
        self.assertIsNotNone(scanner)

        result, error = await scanner.scan_sync(scanning_radius_km=1,
                                                minimal_radius_m=5)
        self.assertIsNone(error)
        self.assertIsNotNone(result)
        self.assertEqual(1, len(result))
        asteroid = result[0]

        # Mining an asteroid
        def progress_cb(status: AsteroidMinerI.Status,
                        item: ResourceItem) -> bool:
            return True

        # This will take a long time
        await self.system_clock_fast_forward(1000)
        status = await miner.start_mining(asteroid_id=asteroid.object_id,
                                          progress_cb=progress_cb)
        self.assertEqual(AsteroidMinerI.Status.NO_SPACE_AVAILABLE, status)

        # Check that cargo is full of ice
        cargo = modules.get_cargo(miner_ship, "tiny_cargo")
        self.assertIsNotNone(cargo)
        content = await cargo.get_content()
        self.assertIsNotNone(content)
        self.assertAlmostEqual(content.volume, content.used)
예제 #5
0
    async def test_get_content(self):
        await self.system_clock_fast_forward(speed_multiplier=25)

        commutator, error = await self.login('player', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_1 = modules.get_ship(commutator, ShipType.MINER.value, "miner-1")
        self.assertIsNotNone(miner_1)

        cargo = modules.get_cargo(commutator=miner_1, name='cargo')
        self.assertIsNotNone(cargo)

        content = await cargo.get_content()
        self.assertAlmostEqual(20000,
                               content.resources[ResourceType.e_SILICATES])
        self.assertAlmostEqual(50000, content.resources[ResourceType.e_METALS])
        self.assertAlmostEqual(15000, content.resources[ResourceType.e_ICE])
예제 #6
0
    async def test_open_close_port(self):
        await self.system_clock_fast_forward(speed_multiplier=25)

        commutator, error = await self.login('player', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_1 = modules.get_ship(commutator, ShipType.MINER.value, "miner-1")
        self.assertIsNotNone(miner_1)

        cargo = modules.get_cargo(commutator=miner_1, name='cargo')
        self.assertIsNotNone(cargo)

        self.assertIsNone(cargo.get_opened_port())

        # Trying to close a port, that has not been opened
        status = await cargo.close_port()
        self.assertEqual(ResourceContainerI.Status.PORT_IS_NOT_OPENED, status)

        # Opening a port
        access_key = 12456
        status, port = await cargo.open_port(access_key=access_key)
        self.assertTrue(status.is_success())
        self.assertNotEqual(0, port)

        self.assertEqual(port, cargo.get_opened_port()[0])
        self.assertEqual(access_key, cargo.get_opened_port()[1])

        # Trying to open yet another port
        status, port = await cargo.open_port(access_key=access_key * 2)
        self.assertEqual(ResourceContainerI.Status.PORT_ALREADY_OPEN, status)
        self.assertEqual(0, port)

        # Closing port (twice)
        status = await cargo.close_port()
        self.assertEqual(ResourceContainerI.Status.SUCCESS, status)
        status = await cargo.close_port()
        self.assertEqual(ResourceContainerI.Status.PORT_IS_NOT_OPENED, status)

        # Opening a port again
        status, port = await cargo.open_port(access_key=access_key)
        self.assertTrue(status.is_success())
        self.assertNotEqual(0, port)
예제 #7
0
    async def test_transfer_monitoring(self):
        await self.system_clock_fast_forward(speed_multiplier=10)

        commutator, error = await self.login('player', "127.0.0.1")
        self.assertIsNotNone(commutator)
        self.assertIsNone(error)

        miner_1 = modules.get_ship(commutator, ShipType.MINER.value, "miner-1")
        self.assertIsNotNone(miner_1)
        miner_1_cargo = modules.get_cargo(commutator=miner_1, name='cargo')
        self.assertIsNotNone(miner_1_cargo)

        miner_2 = modules.get_ship(commutator, ShipType.MINER.value, "miner-2")
        self.assertIsNotNone(miner_2)
        miner_2_cargo = modules.get_cargo(commutator=miner_2, name='cargo')
        self.assertIsNotNone(miner_2_cargo)

        # Opening a port on miner_2
        access_key = 12456
        status, port = await miner_2_cargo.open_port(access_key=access_key)
        self.assertTrue(status.is_success())
        self.assertNotEqual(0, port)

        # Will be collected during transferring
        transactions: List[ResourceItem] = []
        # Will be collected in monitoring tasks
        miner_1_cargo_journal: List[ResourceContainerI.Content] = []
        miner_2_cargo_journal: List[ResourceContainerI.Content] = []

        async def do_monitoring(
                container: modules.ResourceContainer,
                journal: List[ResourceContainerI.Content]) \
                -> ResourceContainerI.Status:
            async for status, content in container.monitor():
                if content:
                    journal.append(content)
                else:
                    return status
            return ResourceContainerI.Status.SUCCESS

        miner_1_cargo_monitoring = asyncio.create_task(
            do_monitoring(miner_1_cargo, miner_1_cargo_journal), )

        miner_2_cargo_monitoring = asyncio.create_task(
            do_monitoring(miner_2_cargo, miner_2_cargo_journal), )

        status = await miner_1_cargo.transfer(port=port,
                                              access_key=access_key,
                                              progress_cb=transactions.append,
                                              resource=ResourceItem(
                                                  ResourceType.e_METALS,
                                                  30000))

        # Wait some additional time for monitoring events
        await asyncio.sleep(0.2)

        self.assertTrue(miner_1_cargo_monitoring.cancel())
        self.assertTrue(miner_2_cargo_monitoring.cancel())
        await asyncio.wait(
            [miner_1_cargo_monitoring, miner_2_cargo_monitoring])

        # Check that all data are consistent
        self.assertEqual(len(miner_1_cargo_journal),
                         len(miner_2_cargo_journal))
        self.assertEqual(len(miner_1_cargo_journal), len(transactions) + 1)
        self.assertEqual(len(miner_2_cargo_journal), len(transactions) + 1)

        current_content = miner_1_cargo_journal[0]
        for updated_content, transaction in \
                zip(miner_1_cargo_journal[1:], transactions):
            resource_type = transaction.resource_type
            amount = transaction.amount
            self.assertAlmostEqual(
                updated_content.resources[resource_type],
                current_content.resources[resource_type] - amount)
            current_content = updated_content

        current_content = miner_2_cargo_journal[0]
        for updated_content, transaction in \
                zip(miner_2_cargo_journal[1:], transactions):
            resource_type = transaction.resource_type
            amount = transaction.amount
            self.assertAlmostEqual(
                updated_content.resources[resource_type],
                current_content.resources[resource_type] + amount)
            current_content = updated_content