def __init__(self):
        self.module_name = 'traffic_data_simulator_tester'
        self.log_type = 'INFO'
        self.log_message = 'initialize_traffic_data_simulator: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator = TrafficDataSimulator()
        self.traffic_data_generator_process = None
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'initialize_traffic_data_simulator: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)
    def __init__(self):
        self.module_name = 'traffic_data_simulator_tester'
        self.log_type = 'INFO'
        self.log_message = 'initialize_traffic_data_simulator: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator = TrafficDataSimulator()
        self.traffic_data_generator_process = None
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'initialize_traffic_data_simulator: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)
class TrafficDataSimulatorTester(object):
    def __init__(self):
        self.module_name = 'traffic_data_simulator_tester'
        self.log_type = 'INFO'
        self.log_message = 'initialize_traffic_data_simulator: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator = TrafficDataSimulator()
        self.traffic_data_generator_process = None
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'initialize_traffic_data_simulator: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def start_traffic_data_generator_process(self):
        if self.traffic_data_generator_process is None:
            self.traffic_data_generator_process = Process(
                target=self.test_generate_traffic_data_for_bus_lines,
                args=()
            )
            self.traffic_data_generator_process.start()
            self.log_message = 'traffic_data_generator_process: starting'
        else:
            self.log_message = 'traffic_data_generator_process: already started'

        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def terminate_traffic_data_generator_process(self):
        if self.traffic_data_generator_process is not None:
            self.traffic_data_generator_process.terminate()
            self.traffic_data_generator_process.join()
            self.traffic_data_generator_process = None
            self.log_message = 'traffic_data_generator_process: terminated'
        else:
            'traffic_data_generator_process: None'

        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_clear_traffic_density(self):
        self.log_message = 'test_clear_traffic_density: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.clear_traffic_density()
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_clear_traffic_density: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_generate_traffic_data_between_two_bus_stops(self, starting_bus_stop=None, ending_bus_stop=None,
                                                         starting_bus_stop_name=None, ending_bus_stop_name=None):
        """
        Generate random traffic density values for the edges which connect two bus_stops.

        :param starting_bus_stop: bus_stop_document
        :param ending_bus_stop: bus_stop_document
        :param starting_bus_stop_name: string
        :param ending_bus_stop_name: string
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_between_two_bus_stops: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_between_two_bus_stops(
            starting_bus_stop=starting_bus_stop,
            ending_bus_stop=ending_bus_stop,
            starting_bus_stop_name=starting_bus_stop_name,
            ending_bus_stop_name=ending_bus_stop_name
        )
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_between_two_bus_stops: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_generate_traffic_data_between_multiple_bus_stops(self, bus_stops=None, bus_stop_names=None):
        """
        Generate random traffic density values for the edges which connect multiple bus_stops.

        :param bus_stops: [bus_stop_document]
        :param bus_stop_names: [string]
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_between_multiple_bus_stops: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_between_multiple_bus_stops(
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names
        )
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_between_multiple_bus_stops: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_generate_traffic_data_for_bus_line(self, bus_line=None, bus_line_id=None):
        """
        Generate random traffic density values for the edge_documents which are included in a bus_line_document.

        :param bus_line: bus_line_document
        :param bus_line_id: int
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_for_bus_line: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_for_bus_line(
            bus_line=bus_line,
            bus_line_id=bus_line_id
        )
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_for_bus_line: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_generate_traffic_data_for_bus_lines(self, bus_lines=None):
        """
        Generate random traffic density values for the edge_documents which are included in a bus_line_documents.

        :param bus_lines: [bus_line_document]
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_for_bus_lines: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_for_bus_lines(bus_lines=bus_lines)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_for_bus_lines: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

    def test_traffic_data_generator_process(self):
        time_difference = 0
        initial_time = time.time()

        while time_difference < traffic_data_simulator_max_operation_timeout:
            self.test_generate_traffic_data_for_bus_lines()
            time.sleep(traffic_data_simulator_timeout)
            time_difference = time.time() - initial_time

    def test_set_traffic_density_limits(self, lowest_traffic_density_value, highest_traffic_density_value):
        """
        Set the lowest and highest traffic density values.

        :param lowest_traffic_density_value: float: [0, 1]
        :param highest_traffic_density_value: float: [0, 1]
        :return: None
        """
        self.log_message = 'test_set_traffic_density_limits: starting'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.set_traffic_density_limits(
            lowest_traffic_density_value=lowest_traffic_density_value,
            highest_traffic_density_value=highest_traffic_density_value
        )
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_set_traffic_density_limits: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name, log_type=self.log_type, log_message=self.log_message)
class TrafficDataSimulatorTester(object):
    def __init__(self):
        self.module_name = 'traffic_data_simulator_tester'
        self.log_type = 'INFO'
        self.log_message = 'initialize_traffic_data_simulator: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator = TrafficDataSimulator()
        self.traffic_data_generator_process = None
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'initialize_traffic_data_simulator: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def start_traffic_data_generator_process(self):
        if self.traffic_data_generator_process is None:
            self.traffic_data_generator_process = Process(
                target=self.test_generate_traffic_data_for_bus_lines, args=())
            self.traffic_data_generator_process.start()
            self.log_message = 'traffic_data_generator_process: starting'
        else:
            self.log_message = 'traffic_data_generator_process: already started'

        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def terminate_traffic_data_generator_process(self):
        if self.traffic_data_generator_process is not None:
            self.traffic_data_generator_process.terminate()
            self.traffic_data_generator_process.join()
            self.traffic_data_generator_process = None
            self.log_message = 'traffic_data_generator_process: terminated'
        else:
            'traffic_data_generator_process: None'

        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_clear_traffic_density(self):
        self.log_message = 'test_clear_traffic_density: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.clear_traffic_density()
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_clear_traffic_density: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_generate_traffic_data_between_two_bus_stops(
            self,
            starting_bus_stop=None,
            ending_bus_stop=None,
            starting_bus_stop_name=None,
            ending_bus_stop_name=None):
        """
        Generate random traffic density values for the edges which connect two bus_stops.

        :param starting_bus_stop: bus_stop_document
        :param ending_bus_stop: bus_stop_document
        :param starting_bus_stop_name: string
        :param ending_bus_stop_name: string
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_between_two_bus_stops: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_between_two_bus_stops(
            starting_bus_stop=starting_bus_stop,
            ending_bus_stop=ending_bus_stop,
            starting_bus_stop_name=starting_bus_stop_name,
            ending_bus_stop_name=ending_bus_stop_name)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_between_two_bus_stops: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_generate_traffic_data_between_multiple_bus_stops(
            self, bus_stops=None, bus_stop_names=None):
        """
        Generate random traffic density values for the edges which connect multiple bus_stops.

        :param bus_stops: [bus_stop_document]
        :param bus_stop_names: [string]
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_between_multiple_bus_stops: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_between_multiple_bus_stops(
            bus_stops=bus_stops, bus_stop_names=bus_stop_names)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_between_multiple_bus_stops: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_generate_traffic_data_for_bus_line(self,
                                                bus_line=None,
                                                bus_line_id=None):
        """
        Generate random traffic density values for the edge_documents which are included in a bus_line_document.

        :param bus_line: bus_line_document
        :param bus_line_id: int
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_for_bus_line: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_for_bus_line(
            bus_line=bus_line, bus_line_id=bus_line_id)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_for_bus_line: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_generate_traffic_data_for_bus_lines(self, bus_lines=None):
        """
        Generate random traffic density values for the edge_documents which are included in a bus_line_documents.

        :param bus_lines: [bus_line_document]
        :return: None
        """
        self.log_message = 'test_generate_traffic_data_for_bus_lines: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.generate_traffic_data_for_bus_lines(
            bus_lines=bus_lines)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_generate_traffic_data_for_bus_lines: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

    def test_traffic_data_generator_process(self):
        time_difference = 0
        initial_time = time.time()

        while time_difference < traffic_data_simulator_max_operation_timeout:
            self.test_generate_traffic_data_for_bus_lines()
            time.sleep(traffic_data_simulator_timeout)
            time_difference = time.time() - initial_time

    def test_set_traffic_density_limits(self, lowest_traffic_density_value,
                                        highest_traffic_density_value):
        """
        Set the lowest and highest traffic density values.

        :param lowest_traffic_density_value: float: [0, 1]
        :param highest_traffic_density_value: float: [0, 1]
        :return: None
        """
        self.log_message = 'test_set_traffic_density_limits: starting'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)

        self.start_time = time.time()
        self.traffic_data_simulator.set_traffic_density_limits(
            lowest_traffic_density_value=lowest_traffic_density_value,
            highest_traffic_density_value=highest_traffic_density_value)
        self.elapsed_time = time.time() - self.start_time

        self.log_message = 'test_set_traffic_density_limits: finished - elapsed_time = ' \
                           + str(self.elapsed_time) + ' sec'
        log(module_name=self.module_name,
            log_type=self.log_type,
            log_message=self.log_message)