def test_rule_created_deleted(self):
        """INTR test: availability changed after basic rule operations
        """
        if self.__verbose_testing:
            print('##### test_rule_created_deleted')

        rule_1_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
            )
        )

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(),
            1,
            'One availability slot should have been created'
        )

        rule_jrpc.remove_rule(self.__gs_1_id, rule_1_pk)
        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(),
            0,
            'No availability slots should be available'
        )
示例#2
0
    def test_add_once_rule(self):
        """JRPC test: (O) cfg.gs.channel.addRule, cfg.gs.channel.removeRule
        Should correctly add a ONCE rule to the system.
        """
        if self.__verbose_testing:
            print('>>> TEST (test_gs_channel_add_rule)')

        # 1) add new rule to the database
        starting_time = misc.get_next_midnight() - datetime.timedelta(hours=12)
        ending_time = starting_time + datetime.timedelta(hours=4)

        rule_cfg = db_tools.create_jrpc_once_rule(starting_time=starting_time,
                                                  ending_time=ending_time)
        rule_id_1 = jrpc_rules.add_rule(self.__gs_1_id, rule_cfg)

        # 2) get the rule back through the JRPC interface
        rules_g1c1 = jrpc_rules.list_channel_rules(self.__gs_1_id)
        expected_r = {
            jrpc_serial.RULE_PK_K: rule_id_1,
            jrpc_serial.RULE_PERIODICITY: jrpc_serial.RULE_PERIODICITY_ONCE,
            jrpc_serial.RULE_OP: jrpc_serial.RULE_OP_ADD,
            jrpc_serial.RULE_DATES: {
                jrpc_serial.RULE_ONCE_S_TIME: starting_time.isoformat(),
                jrpc_serial.RULE_ONCE_E_TIME: ending_time.isoformat()
            }
        }

        if self.__verbose_testing:
            misc.print_list(rules_g1c1, name='DATABASE')
            misc.print_dictionary(expected_r)

        self.assertEqual(rules_g1c1[0], expected_r)

        jrpc_rules.remove_rule(self.__gs_1_id, rule_id_1)
        self.__verbose_testing = False
示例#3
0
    def test_remove_rule(self):
        """JRPC test: cfg.gs.channel.removeRule
        Should correctly remove any rule to the system.
        """
        if self.__verbose_testing:
            print('>>> TEST (test_gs_channel_add_rule)')

        rule_cfg = db_tools.create_jrpc_once_rule()
        rule_id = jrpc_rules.add_rule(self.__gs_1_id, rule_cfg)
        jrpc_rules.remove_rule(self.__gs_1_id, rule_id)

        self.assertRaises(rules.AvailabilityRule.DoesNotExist,
                          rules.AvailabilityRule.objects.get,
                          id=rule_id)
示例#4
0
    def test_remove_rule(self):
        """JRPC test: cfg.gs.channel.removeRule
        Should correctly remove any rule to the system.
        """
        if self.__verbose_testing:
            print('>>> TEST (test_gs_channel_add_rule)')

        rule_cfg = db_tools.create_jrpc_once_rule()
        rule_id = jrpc_rules.add_rule(self.__gs_1_id, rule_cfg)
        jrpc_rules.remove_rule(self.__gs_1_id, rule_id)

        self.assertRaises(
            rules.AvailabilityRule.DoesNotExist,
            rules.AvailabilityRule.objects.get, id=rule_id
        )
示例#5
0
    def test_rule_created_deleted(self):
        """INTR test: availability changed after basic rule operations
        """
        if self.__verbose_testing:
            print('##### test_rule_created_deleted')

        rule_1_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(starting_time=self.__rule_s_time,
                                           ending_time=self.__rule_e_time))

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          1, 'One availability slot should have been created')

        rule_jrpc.remove_rule(self.__gs_1_id, rule_1_pk)
        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          0, 'No availability slots should be available')
示例#6
0
    def test_add_once_rule(self):
        """JRPC test: (O) cfg.gs.channel.addRule, cfg.gs.channel.removeRule
        Should correctly add a ONCE rule to the system.
        """
        if self.__verbose_testing:
            print('>>> TEST (test_gs_channel_add_rule)')

        # 1) add new rule to the database
        starting_time = misc.get_next_midnight() - datetime.timedelta(hours=12)
        ending_time = starting_time + datetime.timedelta(hours=4)

        rule_cfg = db_tools.create_jrpc_once_rule(
            starting_time=starting_time,
            ending_time=ending_time
        )
        rule_id_1 = jrpc_rules.add_rule(self.__gs_1_id, rule_cfg)

        # 2) get the rule back through the JRPC interface
        rules_g1c1 = jrpc_rules.list_channel_rules(self.__gs_1_id)
        expected_r = {
            jrpc_serial.RULE_PK_K: rule_id_1,
            jrpc_serial.RULE_PERIODICITY: jrpc_serial.RULE_PERIODICITY_ONCE,
            jrpc_serial.RULE_OP: jrpc_serial.RULE_OP_ADD,
            jrpc_serial.RULE_DATES: {
                jrpc_serial.RULE_ONCE_S_TIME: starting_time.isoformat(),
                jrpc_serial.RULE_ONCE_E_TIME: ending_time.isoformat()
            }
        }

        if self.__verbose_testing:
            misc.print_list(rules_g1c1, name='DATABASE')
            misc.print_dictionary(expected_r)

        self.assertEqual(rules_g1c1[0], expected_r)

        jrpc_rules.remove_rule(self.__gs_1_id, rule_id_1)
        self.__verbose_testing = False
    def test_multiple_rules(self):
        """INTR test: multiple rules
        """
        if self.__verbose_testing:
            print('##### test_rule_created_deleted')

        rule_1_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
            )
        )

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 1
        )

        rule_2_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                operation=rule_jrpc.rule_serializers.RULE_OP_REMOVE,
                starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
            )
        )

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 0
        )

        rule_jrpc.remove_rule(self.__gs_1_id, rule_2_pk)

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 1
        )

        rule_3 = db_tools.create_jrpc_once_rule(
            operation=rule_serializers.RULE_OP_REMOVE,
            starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
        )
        rule_3_pk = rule_jrpc.add_rule(self.__gs_1_id, rule_3)

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 0
        )

        rule_jrpc.remove_rule(self.__gs_1_id, rule_3_pk)

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 1
        )

        rule_jrpc.remove_rule(self.__gs_1_id, rule_1_pk)

        self.assertEquals(
            availability_models.AvailabilitySlot.objects.count(), 0
        )
示例#8
0
    def test_multiple_rules(self):
        """INTR test: multiple rules
        """
        if self.__verbose_testing:
            print('##### test_rule_created_deleted')

        rule_1_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(starting_time=self.__rule_s_time,
                                           ending_time=self.__rule_e_time))

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          1)

        rule_2_pk = rule_jrpc.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                operation=rule_jrpc.rule_serializers.RULE_OP_REMOVE,
                starting_time=self.__rule_s_time,
                ending_time=self.__rule_e_time))

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          0)

        rule_jrpc.remove_rule(self.__gs_1_id, rule_2_pk)

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          1)

        rule_3 = db_tools.create_jrpc_once_rule(
            operation=rule_serializers.RULE_OP_REMOVE,
            starting_time=self.__rule_s_time,
            ending_time=self.__rule_e_time)
        rule_3_pk = rule_jrpc.add_rule(self.__gs_1_id, rule_3)

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          0)

        rule_jrpc.remove_rule(self.__gs_1_id, rule_3_pk)

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          1)

        rule_jrpc.remove_rule(self.__gs_1_id, rule_1_pk)

        self.assertEquals(availability_models.AvailabilitySlot.objects.count(),
                          0)
示例#9
0
    def test_generate_slots_once_rule(self):
        """UNIT test: services.configuration.models.rules - ONCE slots
        This test validates that a ONCE rule generates the right amount of
        slots depending on the interval relation with the start/end moments of
        the rule itself.
        """
        if self.__verbose_testing:
            print('>>> test_generate_slots_once_rule:')

        #######################################################################
        # ### XXXX SIGNAL DISCONNECTED
        django_signals.post_save.disconnect(
            availability_signals.once_rule_saved,
            sender=rule_models.AvailabilityRuleOnce
        )

        #######################################################################
        # ### 1) rule after interval
        rule_1_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight(),
                ending_time=sn_misc.get_next_midnight() + py_timedelta(hours=4)
            )
        )
        rule_1_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_1_id
        ).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_1_db_values[0], (
                    sn_misc.get_next_midnight() - py_timedelta(hours=12),
                    sn_misc.get_next_midnight() - py_timedelta(hours=3)
                )
            ),
            []
        )

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_1_id))

        #######################################################################
        # ### 2) rule before interval

        rule_2_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() - py_timedelta(
                    hours=6
                ),
                ending_time=sn_misc.get_next_midnight() - py_timedelta(
                    hours=4
                )
            )
        )
        rule_2_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_2_id
        ).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_2_db_values[0], (
                    sn_misc.get_next_midnight(),
                    sn_misc.get_next_midnight() + py_timedelta(hours=9)
                )
            ),
            []
        )

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_2_id))

        #######################################################################
        # ### 3) rule FULLY inside interval

        rule_3_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() + py_timedelta(
                    hours=2
                ),
                ending_time=sn_misc.get_next_midnight() + py_timedelta(
                    hours=4
                )
            )
        )
        rule_3_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_3_id
        ).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_3_db_values[0], (
                    sn_misc.get_next_midnight(),
                    sn_misc.get_next_midnight() + py_timedelta(hours=9)
                )
            ), [(
                sn_misc.get_next_midnight() + py_timedelta(hours=2),
                sn_misc.get_next_midnight() + py_timedelta(hours=4)
            )]
        )

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_3_id))

        #######################################################################
        # ### 4) rule start before the interval

        rule_4_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() - py_timedelta(
                    hours=1
                ),
                ending_time=sn_misc.get_next_midnight() + py_timedelta(
                    hours=4
                )
            )
        )
        rule_4_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_4_id
        ).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_4_db_values[0], (
                    sn_misc.get_next_midnight(),
                    sn_misc.get_next_midnight() + py_timedelta(hours=9)
                )
            ), [(
                sn_misc.get_next_midnight(),
                sn_misc.get_next_midnight() + py_timedelta(hours=4)
            )]
        )

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_4_id))

        #######################################################################
        # ### 5) rule ends after the interval

        rule_5_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() + py_timedelta(
                    hours=2
                ),
                ending_time=sn_misc.get_next_midnight() + py_timedelta(
                    hours=12
                )
            )
        )
        rule_5_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_5_id
        ).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_5_db_values[0], (
                    sn_misc.get_next_midnight(),
                    sn_misc.get_next_midnight() + py_timedelta(hours=9)
                )
            ), [(
                sn_misc.get_next_midnight() + py_timedelta(hours=2),
                sn_misc.get_next_midnight() + py_timedelta(hours=9)
            )]
        )

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_5_id))

        #######################################################################
        # ### XXXX SIGNAL RECONNECTED
        django_signals.post_save.connect(
            availability_signals.once_rule_saved,
            sender=rule_models.AvailabilityRuleOnce
        )
示例#10
0
    def _test_3_generate_slots_several_rules_1(self):
        """INTR test: services.scheduling - add slots with several rules (3)
        This method tests the addition of new availability slots when there
        are several availability rules in the database.
        """
        if self.__verbose_testing:
            print('##### test_add_slots: several rules (1)')

        # R1) ADD+ONCE (+1 slot)
        rule_1_id = jrpc_rules_if.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
            )
        )
        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        self.assertEqual(
            len(a_slots), 1, 'Only 1 slot expected, got = ' + str(len(a_slots))
        )
        av_slots = availability.AvailabilitySlot.objects.all()
        self.assertEqual(
            len(av_slots), 1, '1 slot expected, got = ' + str(len(av_slots))
        )

        if self.__verbose_testing:
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@1'
            )
            misc.print_list(av_slots, name='AVAILABLE@1')

        # R2) ADD+DAILY (+2 slots)
        rule_2_id = jrpc_rules_if.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_daily_rule(
                date_i=self.__utc_s_date,
                date_f=self.__utc_e_date,
                starting_time=self.__utc_s_time,
                ending_time=self.__utc_e_time
            )
        )

        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        av_slots = availability.AvailabilitySlot.objects.all()

        if self.__verbose_testing:
            print('>>> today_utc = ' + str(misc.get_today_utc()))
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@2'
            )
            misc.print_list(av_slots, name='AVAILABLE@2')

        expected_slots = 3
        self.assertEqual(len(a_slots), expected_slots)
        self.assertEqual(len(av_slots), expected_slots)

        # R3) ADD-ONCE (-1 slot)
        rule_3_id = jrpc_rules_if.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_once_rule(
                operation=jrpc_serial.RULE_OP_REMOVE,
                starting_time=self.__rule_s_time, ending_time=self.__rule_e_time
            )
        )

        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        av_slots = availability.AvailabilitySlot.objects.all()

        if self.__verbose_testing:
            print('>>> today_utc = ' + str(misc.get_today_utc()))
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@3'
            )
            misc.print_list(av_slots, name='AVAILABLE@3')

        expected_slots = 2
        self.assertEqual(len(a_slots), expected_slots)
        self.assertEqual(len(av_slots), expected_slots)

        # R4) ADD-DAILY (-7 slots)
        rule_4_id = jrpc_rules_if.add_rule(
            self.__gs_1_id,
            db_tools.create_jrpc_daily_rule(
                operation=jrpc_serial.RULE_OP_REMOVE,
                date_i=self.__utc_s_date,
                date_f=self.__utc_e_date,
                starting_time=self.__utc_s_time,
                ending_time=self.__utc_e_time
            )
        )

        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        av_slots = availability.AvailabilitySlot.objects.all()

        if self.__verbose_testing:
            print('>>> today_utc = ' + str(misc.get_today_utc()))
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@4'
            )
            misc.print_list(av_slots, name='AVAILABLE@4')

        expected = 0
        self.assertEqual(len(a_slots), expected)
        self.assertEqual(len(av_slots), expected)

        # REMOVE R#4 (+6 slots)
        jrpc_rules_if.remove_rule(
            groundstation_id=self.__gs_1_id,
            rule_id=rule_4_id
        )

        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        av_slots = availability.AvailabilitySlot.objects.all()

        if self.__verbose_testing:
            print('>>> today_utc = ' + str(misc.get_today_utc()))
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@5'
            )
            misc.print_list(av_slots, name='AVAILABLE@5')

        expected = 2
        self.assertEqual(len(a_slots), expected)
        self.assertEqual(len(av_slots), expected)

        # REMOVE R#3 (+1 slot)
        jrpc_rules_if.remove_rule(
            groundstation_id=self.__gs_1_id,
            rule_id=rule_3_id
        )

        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        av_slots = availability.AvailabilitySlot.objects.all()

        if self.__verbose_testing:
            print('>>> today_utc = ' + str(misc.get_today_utc()))
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@6'
            )
            misc.print_list(av_slots, name='AVAILABLE@6')

        expected = 3
        self.assertEqual(len(a_slots), expected)
        self.assertEqual(len(av_slots), expected)

        # REMOVE R#2 (-7 slots)
        jrpc_rules_if.remove_rule(
            groundstation_id=self.__gs_1_id,
            rule_id=rule_2_id
        )
        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        self.assertEqual(len(a_slots), 1)
        av_slots = availability.AvailabilitySlot.objects.all()
        self.assertEqual(len(av_slots), 1)

        if self.__verbose_testing:
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@7'
            )
            misc.print_list(av_slots, name='AVAILABLE@7')

        # REMOVE R#1 (-1 slot)
        jrpc_rules_if.remove_rule(
            groundstation_id=self.__gs_1_id,
            rule_id=rule_1_id
        )
        a_slots = rule_models.AvailabilityRule.objects.get_availability_slots(
            self.__gs
        )
        self.assertEqual(len(a_slots), 0)
        av_slots = availability.AvailabilitySlot.objects.all()
        self.assertEqual(len(av_slots), 0)

        if self.__verbose_testing:
            misc.print_list(
                rule_models.AvailabilityRule.objects.all(), name='RULES@8'
            )
            misc.print_list(av_slots, name='AVAILABLE@8')

        self.__verbose_testing = False
示例#11
0
    def test_generate_slots_once_rule(self):
        """UNIT test: services.configuration.models.rules - ONCE slots
        This test validates that a ONCE rule generates the right amount of
        slots depending on the interval relation with the start/end moments of
        the rule itself.
        """
        if self.__verbose_testing:
            print('>>> test_generate_slots_once_rule:')

        #######################################################################
        # ### XXXX SIGNAL DISCONNECTED
        django_signals.post_save.disconnect(
            availability_signals.once_rule_saved,
            sender=rule_models.AvailabilityRuleOnce)

        #######################################################################
        # ### 1) rule after interval
        rule_1_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight(),
                ending_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=4)))
        rule_1_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_1_id).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_1_db_values[0],
                (sn_misc.get_next_midnight() - py_timedelta(hours=12),
                 sn_misc.get_next_midnight() - py_timedelta(hours=3))), [])

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_1_id))

        #######################################################################
        # ### 2) rule before interval

        rule_2_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() -
                py_timedelta(hours=6),
                ending_time=sn_misc.get_next_midnight() -
                py_timedelta(hours=4)))
        rule_2_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_2_id).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_2_db_values[0],
                (sn_misc.get_next_midnight(),
                 sn_misc.get_next_midnight() + py_timedelta(hours=9))), [])

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_2_id))

        #######################################################################
        # ### 3) rule FULLY inside interval

        rule_3_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=2),
                ending_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=4)))
        rule_3_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_3_id).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_3_db_values[0],
                (sn_misc.get_next_midnight(),
                 sn_misc.get_next_midnight() + py_timedelta(hours=9))),
            [(sn_misc.get_next_midnight() + py_timedelta(hours=2),
              sn_misc.get_next_midnight() + py_timedelta(hours=4))])

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_3_id))

        #######################################################################
        # ### 4) rule start before the interval

        rule_4_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() -
                py_timedelta(hours=1),
                ending_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=4)))
        rule_4_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_4_id).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_4_db_values[0],
                (sn_misc.get_next_midnight(),
                 sn_misc.get_next_midnight() + py_timedelta(hours=9))),
            [(sn_misc.get_next_midnight(),
              sn_misc.get_next_midnight() + py_timedelta(hours=4))])

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_4_id))

        #######################################################################
        # ### 5) rule ends after the interval

        rule_5_id = rule_jrpc.add_rule(
            self.__gs_1_id,
            sn_helpers.create_jrpc_once_rule(
                starting_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=2),
                ending_time=sn_misc.get_next_midnight() +
                py_timedelta(hours=12)))
        rule_5_db_values = rule_models.AvailabilityRule.objects.filter(
            pk=rule_5_id).values()

        self.assertListEqual(
            rule_models.AvailabilityRuleManager.generate_available_slots_once(
                rule_5_db_values[0],
                (sn_misc.get_next_midnight(),
                 sn_misc.get_next_midnight() + py_timedelta(hours=9))),
            [(sn_misc.get_next_midnight() + py_timedelta(hours=2),
              sn_misc.get_next_midnight() + py_timedelta(hours=9))])

        self.assertTrue(rule_jrpc.remove_rule(self.__gs_1_id, rule_5_id))

        #######################################################################
        # ### XXXX SIGNAL RECONNECTED
        django_signals.post_save.connect(
            availability_signals.once_rule_saved,
            sender=rule_models.AvailabilityRuleOnce)
示例#12
0
    def test_1_compatibility_sc_channel_added_deleted(self):
        """INTR test: compatibility changed generates operational slots

        1) +GS_CH
        2) +RULE
        3) +SC_CH
        4) -SC_CH
        5) -RULE
        6) -GS_CH

        OperationalSlots should be available only in bewteen steps 3 and 4.
        """
        if self.__verbose_testing:
            print('##### test_add_slots: no rules')

        self.__sc_1 = db_tools.create_sc(
            user_profile=self.__user_profile,
            identifier=self.__sc_1_id,
            tle_id=self.__sc_1_tle_id,
        )

        self.assertTrue(
            jrpc_gs_ch_if.gs_channel_create(
                groundstation_id=self.__gs_1_id,
                channel_id=self.__gs_1_ch_1_id,
                configuration=self.__gs_1_ch_1_cfg),
            'Channel should have been created!')

        r_1_id = jrpc_rules_if.add_rule(self.__gs_1_id, self.__rule_1_cfg)
        self.assertIsNot(r_1_id, 0, 'Rule should have been added!')

        self.assertTrue(
            jrpc_sc_ch_if.sc_channel_create(
                spacecraft_id=self.__sc_1_id,
                channel_id=self.__sc_1_ch_1_id,
                configuration=self.__sc_1_ch_1_cfg),
            'Channel should have been created!')

        a_slots = availability_models.AvailabilitySlot.objects.get_applicable(
            groundstation=self.__gs_1)

        if self.__verbose_testing:
            misc.print_list(a_slots, 'AvailabilitySlots')
            misc.print_list(operational_models.OperationalSlot.objects.all(),
                            'OperationalSlots')

        self.assertGreaterEqual(
            len(operational_models.OperationalSlot.objects.all()), 2)

        self.assertTrue(
            jrpc_sc_ch_if.sc_channel_delete(spacecraft_id=self.__sc_1_id,
                                            channel_id=self.__sc_1_ch_1_id))

        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE).values_list('state'))

        if self.__verbose_testing:
            print('>>> window = ' +
                  str(simulation.OrbitalSimulator.get_simulation_window()))
            misc.print_list(rule_models.AvailabilityRule.objects.all())
            misc.print_list(availability_models.AvailabilitySlot.objects.all())
            misc.print_list(operational_models.OperationalSlot.objects.all())
            misc.print_list(actual)
            misc.print_list(expected)

        self.assertEqual(actual, expected)

        self.assertTrue(jrpc_rules_if.remove_rule(self.__gs_1_id, r_1_id),
                        'Rule should have been removed!')
        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE).values_list('state'))
        self.assertEqual(actual, expected)

        self.assertTrue(
            jrpc_gs_ch_if.gs_channel_delete(groundstation_id=self.__gs_1_id,
                                            channel_id=self.__gs_1_ch_1_id),
            'Could not delete GroundStationChannel = ' +
            str(self.__gs_1_ch_1_id))
        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE).values_list('state'))
        self.assertEqual(actual, expected)
示例#13
0
    def test_propagate_simple(self):
        """INTR test: services.scheduling - slot propagation
        This test validates the propagation of the slots with a simple set of
        rules.
        """
        if self.__verbose_testing:
            print('>>> test_propagate_simple:')

        r_1_s_time = misc.get_next_midnight() - datetime.timedelta(hours=12)
        r_1_e_time = r_1_s_time + datetime.timedelta(hours=10)

        r_cfg = db_tools.create_jrpc_daily_rule(
            starting_time=r_1_s_time,
            ending_time=r_1_e_time
        )

        self.assertEquals(list(availability.AvailabilitySlot.objects.all()), [])

        r_1_id = jrpc_rules_if.add_rule(self.__gs_1_id, r_cfg)

        x_pre = [
            (
                r_1_s_time,
                r_1_e_time,
            ),
            (
                r_1_s_time + datetime.timedelta(days=1),
                r_1_e_time + datetime.timedelta(days=1),
            ),
            (
                r_1_s_time + datetime.timedelta(days=2),
                r_1_e_time + datetime.timedelta(days=2),
            )
        ]
        a_pre = list(
            availability.AvailabilitySlot.objects.values_list('start', 'end')
        )
        self.assertEqual(a_pre, x_pre)

        scheduling_tasks.populate_slots()

        expected_post = [
            (
                r_1_s_time,
                r_1_e_time,
            ),
            (
                r_1_s_time + datetime.timedelta(days=1),
                r_1_e_time + datetime.timedelta(days=1),
            ),
            (
                r_1_s_time + datetime.timedelta(days=2),
                r_1_e_time + datetime.timedelta(days=2),
            ),
            (
                r_1_s_time + datetime.timedelta(days=3),
                r_1_e_time + datetime.timedelta(days=3),
            )
        ]
        actual_post = list(
            availability.AvailabilitySlot.objects.values_list('start', 'end')
        )

        self.assertEqual(actual_post, expected_post)
        self.assertTrue(jrpc_rules_if.remove_rule(self.__gs_1_id, r_1_id))

        self.assertListEqual(
            list(availability.AvailabilitySlot.objects.all()), []
        )
        self.assertListEqual(
            list(operational.OperationalSlot.objects.all()), []
        )
示例#14
0
    def test_1_compatibility_sc_channel_added_deleted(self):
        """INTR test: compatibility changed generates operational slots

        1) +GS_CH
        2) +RULE
        3) +SC_CH
        4) -SC_CH
        5) -RULE
        6) -GS_CH

        OperationalSlots should be available only in bewteen steps 3 and 4.
        """
        if self.__verbose_testing:
            print('##### test_add_slots: no rules')

        self.__sc_1 = db_tools.create_sc(
            user_profile=self.__user_profile,
            identifier=self.__sc_1_id,
            tle_id=self.__sc_1_tle_id,
        )

        self.assertTrue(
            jrpc_gs_ch_if.gs_channel_create(
                groundstation_id=self.__gs_1_id,
                channel_id=self.__gs_1_ch_1_id,
                configuration=self.__gs_1_ch_1_cfg
            ),
            'Channel should have been created!'
        )

        r_1_id = jrpc_rules_if.add_rule(self.__gs_1_id, self.__rule_1_cfg)
        self.assertIsNot(r_1_id, 0, 'Rule should have been added!')

        self.assertTrue(
            jrpc_sc_ch_if.sc_channel_create(
                spacecraft_id=self.__sc_1_id,
                channel_id=self.__sc_1_ch_1_id,
                configuration=self.__sc_1_ch_1_cfg
            ), 'Channel should have been created!'
        )

        a_slots = availability_models.AvailabilitySlot.objects.get_applicable(
            groundstation=self.__gs_1
        )

        if self.__verbose_testing:
            misc.print_list(a_slots, 'AvailabilitySlots')
            misc.print_list(
                operational_models.OperationalSlot.objects.all(),
                'OperationalSlots'
            )

        self.assertGreaterEqual(
            len(operational_models.OperationalSlot.objects.all()), 2
        )

        self.assertTrue(
            jrpc_sc_ch_if.sc_channel_delete(
                spacecraft_id=self.__sc_1_id, channel_id=self.__sc_1_ch_1_id
            )
        )

        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE
            ).values_list('state')
        )

        if self.__verbose_testing:
            print('>>> window = ' + str(
                simulation.OrbitalSimulator.get_simulation_window()
            ))
            misc.print_list(rule_models.AvailabilityRule.objects.all())
            misc.print_list(availability_models.AvailabilitySlot.objects.all())
            misc.print_list(operational_models.OperationalSlot.objects.all())
            misc.print_list(actual)
            misc.print_list(expected)

        self.assertEqual(actual, expected)

        self.assertTrue(
            jrpc_rules_if.remove_rule(self.__gs_1_id, r_1_id),
            'Rule should have been removed!'
        )
        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE
            ).values_list('state')
        )
        self.assertEqual(actual, expected)

        self.assertTrue(
            jrpc_gs_ch_if.gs_channel_delete(
                groundstation_id=self.__gs_1_id,
                channel_id=self.__gs_1_ch_1_id
            ),
            'Could not delete GroundStationChannel = ' + str(
                self.__gs_1_ch_1_id
            )
        )
        expected = []
        actual = list(
            operational_models.OperationalSlot.objects.filter(
                state=operational_models.STATE_FREE
            ).values_list('state')
        )
        self.assertEqual(actual, expected)