def setUp(self):
     self.sim_config = SimulationConfig()
Exemple #2
0
 def setUp(self):
     self.sim_config = SimulationConfig()
class SimulationConfigTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.file1 = create_file(1)
        cls.file2 = create_file(2)
        cls.file3 = create_file(3)
        cls.config_dir = "config_temp"
        os.mkdir(cls.config_dir)
        cls.file4 = create_file(4, cls.config_dir)
        cls.file5 = create_file(
            5, message=create_content("lsst.sims.ocs.configuration.survey", "Survey", ["config.duration=10.0"])
        )
        cls.file6 = create_file(
            6,
            message=create_content(
                "lsst.sims.ocs.configuration.instrument.optics_loop_corr",
                "OpticsLoopCorr",
                ["config.tel_optics_cl_delay=[0.0, 18.0]"],
            ),
        )

        cls.config_save_dir = "config_save"
        os.mkdir(cls.config_save_dir)

    @classmethod
    def tearDownClass(cls):
        os.remove(cls.file1)
        os.remove(cls.file2)
        os.remove(cls.file3)
        shutil.rmtree(cls.config_dir)
        os.remove(cls.file5)
        os.remove(cls.file6)
        shutil.rmtree(cls.config_save_dir)

    def setUp(self):
        self.sim_config = SimulationConfig()

    def test_basic_information_from_creation(self):
        self.assertIsNotNone(self.sim_config.survey)
        self.assertIsNotNone(self.sim_config.science)
        self.assertIsNotNone(self.sim_config.observing_site)
        self.assertIsNotNone(self.sim_config.observatory)
        self.assertIsNotNone(self.sim_config.downtime)
        self.assertIsNotNone(self.sim_config.sched_driver)

    def test_load_without_files(self):
        self.sim_config.load(None)

    def test_load_from_single_file(self):
        self.sim_config.load([self.file1])

    def test_load_from_multiple_files(self):
        self.sim_config.load([self.file1, self.file2, self.file3])

    def test_load_from_directory(self):
        self.sim_config.load([self.config_dir])

    def test_load_does_override(self):
        self.sim_config.load([self.file5])
        self.assertEqual(self.sim_config.survey.duration, 10.0)
        self.sim_config.load([self.file6])
        self.assertEqual(self.sim_config.observatory.optics_loop_corr.tel_optics_cl_delay[1], 18.0)

    @mock.patch("lsst.pex.config.Config.save")
    def test_saving_blank_configurations(self, mock_pexconfig_save):
        # The real configurations can get very expensive to save, so we're just testing that the
        # correct number of executions and blank files are created.
        self.sim_config.load_proposals()
        self.assertEqual(len(self.sim_config.science.general_props.active), NUM_GEN_PROPS)
        # The downtime, environment and filters config not needing to be sent via conf_comm.
        EXTRA_CONFIG = 3
        expected_calls = CONFIG_COMM_PUT_CALLS + NUM_GEN_PROPS + EXTRA_CONFIG
        save_files = ["save_conf{}.py".format(i + 1) for i in range(expected_calls)]
        mock_pexconfig_save.side_effect = [save_file(f, self.config_save_dir) for f in save_files]
        self.sim_config.save(self.config_save_dir)
        self.assertEqual(mock_pexconfig_save.call_count, expected_calls)
        self.assertEqual(len(os.listdir(self.config_save_dir)), expected_calls)

    def test_load_proposals(self):
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.names), NUM_GEN_PROPS)

        self.sim_config.load_proposals()
        self.assertEqual(self.sim_config.num_proposals, NUM_GEN_PROPS)
        self.assertEqual(len(self.sim_config.science.general_props.names), NUM_GEN_PROPS)
        self.assertEqual(len(self.sim_config.science.general_props.active), NUM_GEN_PROPS)

    def test_load_specifc_proposals(self):
        self.sim_config.survey.general_proposals = ["GalacticPlane", "SouthCelestialPole"]
        self.sim_config.load_proposals()
        self.assertEqual(len(self.sim_config.science.general_props.names), 2)
        self.assertEqual(len(self.sim_config.science.general_props.active), 2)

    def test_load_no_proposals(self):
        self.sim_config.survey.general_proposals = []
        self.sim_config.load_proposals()
        self.assertEqual(self.sim_config.num_proposals, 0)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.names), 0)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.active), 0)

    def test_make_tuples(self):
        d = {"a": 1, "b": {"c": "test", "d": [1, 2, 3]}}
        results = self.sim_config.make_tuples(d)
        self.assertEqual(len(results), 3)
        truth = [("a", "1"), ("b/c", "test"), ("b/d", "[1, 2, 3]")]
        self.assertListEqual(results, truth)

    def test_specific_configuration_tuple_list(self):
        result = self.sim_config.config_list("survey")
        self.assertEqual(len(result), 5)
        self.assertIsInstance(result, list)
        self.assertIsInstance(result[0], tuple)

    def test_full_configuration_tuple_list(self):
        result = self.sim_config.config_list()
        self.assertGreater(len(result), 7)
Exemple #4
0
class SimulationConfigTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.file1 = create_file(1)
        cls.file2 = create_file(2)
        cls.file3 = create_file(3)
        cls.config_dir = "config_temp"
        os.mkdir(cls.config_dir)
        cls.file4 = create_file(4, cls.config_dir)
        cls.file5 = create_file(5,
                                message=create_content(
                                    "lsst.sims.ocs.configuration.survey",
                                    "Survey", ["config.duration=10.0"]))
        cls.file6 = create_file(
            6,
            message=create_content(
                "lsst.sims.ocs.configuration.instrument.optics_loop_corr",
                "OpticsLoopCorr", ["config.tel_optics_cl_delay=[0.0, 18.0]"]))

        cls.config_save_dir = "config_save"
        os.mkdir(cls.config_save_dir)

    @classmethod
    def tearDownClass(cls):
        os.remove(cls.file1)
        os.remove(cls.file2)
        os.remove(cls.file3)
        shutil.rmtree(cls.config_dir)
        os.remove(cls.file5)
        os.remove(cls.file6)
        shutil.rmtree(cls.config_save_dir)

    def setUp(self):
        self.sim_config = SimulationConfig()

    def test_basic_information_from_creation(self):
        self.assertIsNotNone(self.sim_config.survey)
        self.assertIsNotNone(self.sim_config.science)
        self.assertIsNotNone(self.sim_config.observing_site)
        self.assertIsNotNone(self.sim_config.observatory)
        self.assertIsNotNone(self.sim_config.downtime)
        self.assertIsNotNone(self.sim_config.sched_driver)

    def test_load_without_files(self):
        self.sim_config.load(None)

    def test_load_from_single_file(self):
        self.sim_config.load([self.file1])

    def test_load_from_multiple_files(self):
        self.sim_config.load([self.file1, self.file2, self.file3])

    def test_load_from_directory(self):
        self.sim_config.load([self.config_dir])

    def test_load_does_override(self):
        self.sim_config.load([self.file5])
        self.assertEqual(self.sim_config.survey.duration, 10.0)
        self.sim_config.load([self.file6])
        self.assertEqual(
            self.sim_config.observatory.optics_loop_corr.
            tel_optics_cl_delay[1], 18.0)

    @mock.patch("lsst.pex.config.Config.save")
    def test_saving_blank_configurations(self, mock_pexconfig_save):
        # The real configurations can get very expensive to save, so we're just testing that the
        # correct number of executions and blank files are created.
        self.sim_config.load_proposals()
        self.assertEqual(len(self.sim_config.science.general_props.active),
                         NUM_GEN_PROPS)
        self.assertEqual(len(self.sim_config.science.sequence_props.active),
                         NUM_SEQ_PROPS)
        # The downtime, environment,filters and observatory variational model
        # config not needing to be sent via conf_comm.
        EXTRA_CONFIG = 4
        expected_calls = CONFIG_COMM_PUT_CALLS + NUM_GEN_PROPS + NUM_SEQ_PROPS + EXTRA_CONFIG
        save_files = [
            "save_conf{}.py".format(i + 1) for i in range(expected_calls)
        ]
        mock_pexconfig_save.side_effect = [
            save_file(f, self.config_save_dir) for f in save_files
        ]
        self.sim_config.save(self.config_save_dir)
        self.assertEqual(mock_pexconfig_save.call_count, expected_calls)
        self.assertEqual(len(os.listdir(self.config_save_dir)), expected_calls)

    def test_load_proposals(self):
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.names),
                             NUM_GEN_PROPS)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.sequence_props.names),
                             NUM_SEQ_PROPS)
        self.sim_config.load_proposals()
        self.assertEqual(self.sim_config.num_proposals,
                         NUM_GEN_PROPS + NUM_SEQ_PROPS)
        self.assertEqual(len(self.sim_config.science.general_props.names),
                         NUM_GEN_PROPS)
        self.assertEqual(len(self.sim_config.science.general_props.active),
                         NUM_GEN_PROPS)
        self.assertEqual(len(self.sim_config.science.sequence_props.names),
                         NUM_SEQ_PROPS)
        self.assertEqual(len(self.sim_config.science.sequence_props.active),
                         NUM_SEQ_PROPS)

    def test_load_general_proposals_only(self):
        self.sim_config.survey.general_proposals = [
            "GalacticPlane", "SouthCelestialPole"
        ]
        self.sim_config.survey.sequence_proposals = []
        self.sim_config.load_proposals()
        self.assertEqual(len(self.sim_config.science.general_props.names), 2)
        self.assertEqual(len(self.sim_config.science.general_props.active), 2)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.sequence_props.names),
                             0)
        with self.assertRaises(TypeError):
            self.assertEqual(
                len(self.sim_config.science.sequence_props.active), 0)

    def test_load_sequence_proposals_only(self):
        self.sim_config.survey.general_proposals = []
        self.sim_config.survey.sequence_proposals = ["DeepDrillingCosmology1"]
        self.sim_config.load_proposals()
        self.assertEqual(len(self.sim_config.science.sequence_props.names), 1)
        self.assertEqual(len(self.sim_config.science.sequence_props.active), 1)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.names),
                             0)
        with self.assertRaises(TypeError):
            self.assertEqual(len(self.sim_config.science.general_props.active),
                             0)

    def test_load_no_proposals(self):
        self.sim_config.survey.general_proposals = []
        self.sim_config.survey.sequence_proposals = []
        with self.assertRaises(NoProposalsConfiguredError):
            self.sim_config.load_proposals()

    def test_make_tuples(self):
        d = {"a": 1, "b": {"c": "test", "d": [1, 2, 3]}}
        results = self.sim_config.make_tuples(d)
        self.assertEqual(len(results), 3)
        truth = [("a", "1"), ("b/c", "test"), ("b/d", "[1, 2, 3]")]
        self.assertListEqual(results, truth)

    def test_specific_configuration_tuple_list(self):
        result = self.sim_config.config_list("survey")
        self.assertEqual(len(result), 6)
        self.assertIsInstance(result, list)
        self.assertIsInstance(result[0], tuple)

    def test_full_configuration_tuple_list(self):
        result = self.sim_config.config_list()
        self.assertGreater(len(result), 7)