Example #1
0
    def mutation(self, individual: EvolutizTestSuite) -> Tuple[EvolutizTestSuite]:
        """Implements a mutation function for test suites.
        It consists of randomly choosing a test case of the test suite and mutating it.
        """
        device_manager = RequiredFeature('device_manager').request()
        devices = device_manager.get_idle_devices()
        device = random.choice(devices)

        device.mark_work_start()

        random_index = random.randint(0, len(individual)-1)
        individual[random_index] = self.mutate_test_case(device, individual[random_index])

        device.mark_work_stop()

        return individual,
    def run(self) -> List[Any]:
        device_manager = RequiredFeature('device_manager').request()

        if self.idle_devices_only:
            devices = device_manager.get_idle_devices()
        else:
            devices = device_manager.get_devices()

        if self.minimum_api is not None:
            devices = [
                device for device in devices
                if device.api_level() >= self.minimum_api
            ]

        total_devices = len(devices)
        if total_devices == 0:
            raise Exception(
                f"No devices found with api level greater or equal than "
                f"{str(self.minimum_api)} to apply function mapper.")

        # prepare devices queue
        devices_to_use: Queue[Device] = Queue(elements=devices)

        # prepare output queue
        output_queue: Queue[Output] = Queue()  # type: ignore

        # prepare items to map queue
        if self.items_to_map is None:
            for i in range(0, total_devices):
                thread = MultipleQueueConsumerThread(
                    self.func,
                    devices_queue=devices_to_use,
                    devices_are_consumable=True,
                    extra_args=self.extra_args,
                    extra_kwargs=self.extra_kwargs,
                    output_queue=output_queue,
                    fail_times_limit=self.fail_times_limit,
                    default_output=self.default_output,
                    name=f"MQCThread-{str(i)}")
                thread.start()

            watchdog_thread = WatchDogThread(output_queue, total_devices)
            self.wait_for_watchdog_to_finish(device_manager, watchdog_thread)

        else:
            items_queue = Queue(elements=self.items_to_map)

            for i in range(0, total_devices):
                thread = MultipleQueueConsumerThread(
                    self.func,
                    items_queue=items_queue,
                    items_are_consumable=True,
                    devices_queue=devices_to_use,
                    devices_are_consumable=False,
                    extra_args=self.extra_args,
                    extra_kwargs=self.extra_kwargs,
                    output_queue=output_queue,
                    fail_times_limit=self.fail_times_limit,
                    default_output=self.default_output,
                    name=f"MQCThread-{str(i)}")
                thread.start()

            watchdog_thread = WatchDogThread(output_queue,
                                             len(self.items_to_map))
            self.wait_for_watchdog_to_finish(device_manager, watchdog_thread)

        # collect output
        results = output_queue.pop_all()
        return results