class ConfigurationCommunicatorTest(unittest.TestCase): def setUp(self): self.conf_comm = ConfigurationCommunicator() self.sal = SalManager() self.sal.initialize() self.config = SimulationConfig() self.config.load_proposals() def test_basic_information_after_creation(self): self.assertIsNone(self.conf_comm.sal) self.assertIsNone(self.conf_comm.config) def test_initialize(self): self.conf_comm.initialize(self.sal, self.config) self.assertIsNotNone(self.conf_comm.sal) self.assertIsNotNone(self.conf_comm.config) @mock.patch("lsst.sims.ocs.sal.sal_manager.SalManager.put") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_run(self, mock_sal_telemetry_pub, mock_salmanager_put): self.conf_comm.initialize(self.sal, self.config) self.conf_comm.run() self.assertEqual(mock_sal_telemetry_pub.call_count, CONFIG_COMM_PUT_CALLS) self.assertEqual(mock_salmanager_put.call_count, CONFIG_COMM_PUT_CALLS + CONFIG_GEN_PROPS)
class ConfigurationCommunicatorTest(unittest.TestCase): def setUp(self): self.conf_comm = ConfigurationCommunicator() self.sal = SalManager() self.sal.initialize() self.config = SimulationConfig() self.config.load_proposals() def test_basic_information_after_creation(self): self.assertIsNone(self.conf_comm.sal) self.assertIsNone(self.conf_comm.config) def test_initialize(self): self.conf_comm.initialize(self.sal, self.config) self.assertIsNotNone(self.conf_comm.sal) self.assertIsNotNone(self.conf_comm.config) @mock.patch("lsst.sims.ocs.sal.sal_manager.SalManager.put") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_run(self, mock_sal_telemetry_pub, mock_salmanager_put): self.conf_comm.initialize(self.sal, self.config) self.conf_comm.run() self.assertEqual(mock_sal_telemetry_pub.call_count, CONFIG_COMM_PUB_CALLS) self.assertEqual(mock_salmanager_put.call_count, CONFIG_COMM_PUT_CALLS + NUM_GEN_PROPS + NUM_SEQ_PROPS)
def setUp(self): self.sal = SalManager() self.sal_debug_level = 0 # If below is changed, make sure to update patch call on test_publishing_topic self.publish_topic = "timeHandler"
class SalManagerTest(unittest.TestCase): def setUp(self): self.sal = SalManager() self.sal_debug_level = 0 # If below is changed, make sure to update patch call on test_publishing_topic self.publish_topic = "timeHandler" def test_basic_information_after_creation(self): self.assertIsNotNone(self.sal) self.assertEquals(self.sal.debug_level, self.sal_debug_level) self.assertIsNone(self.sal.manager) def test_after_initialization(self): self.sal.initialize() self.assertIsNotNone(self.sal.manager) self.assertEquals(self.sal.manager.getDebugLevel(-1), self.sal_debug_level) @mock.patch("SALPY_scheduler.SAL_scheduler.salShutdown") def test_finalize(self, mock_sal_shutdown): self.sal.initialize() self.sal.finalize() self.assertTrue(mock_sal_shutdown.called) @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_setting_publish_topic(self, mock_sal_telemetry_pub): self.sal.initialize() topic_name = self.publish_topic topic = self.sal.set_publish_topic(topic_name) self.assertIsNotNone(topic) self.assertEqual(topic.timestamp, 0) self.assertTrue(mock_sal_telemetry_pub.called) @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") def test_setting_subscribe_topic(self, mock_sal_telemetry_sub): self.sal.initialize() topic_name = "target" topic = self.sal.set_subscribe_topic(topic_name) self.assertIsNotNone(topic) self.assertIsInstance(topic, scheduler_targetC) self.assertEqual(topic.targetId, 0) self.assertTrue(mock_sal_telemetry_sub.called) @mock.patch("SALPY_scheduler.SAL_scheduler.putSample_timeHandler") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_publishing_topic(self, mock_sal_telemetry_sub, mock_sal_put_sample): self.sal.initialize() topic = self.sal.set_publish_topic(self.publish_topic) self.sal.put(topic) self.assertTrue(mock_sal_put_sample.called) def test_get_topic(self): self.sal.initialize() topic = self.sal.get_topic(self.publish_topic) self.assertIsNotNone(topic)
def setUp(self): self.conf_comm = ConfigurationCommunicator() self.sal = SalManager() self.sal.initialize() self.config = SimulationConfig() self.config.load_proposals()
def initialize_sequencer(self): self.sal = SalManager() self.sal.initialize() self.seq.initialize(self.sal, Observatory())
class SequencerTest(unittest.TestCase): def setUp(self): patcher1 = mock.patch("lsst.sims.ocs.kernel.sequencer.AstronomicalSkyModel", spec=True) self.addCleanup(patcher1.stop) self.mock_astro_sky = patcher1.start() self.seq = Sequencer(ObservingSite(), Survey().idle_delay) def initialize_sequencer(self): self.sal = SalManager() self.sal.initialize() self.seq.initialize(self.sal, Observatory()) def create_objects(self): target = self.sal.set_subscribe_topic("target") # Set some meaningful information target.targetId = 10 target.fieldId = 300 target.filter = "i" target.ra = 0.4244 target.dec = -0.5314 target.num_exposures = 2 # Make it so initial timestamp is 0 time_handler = TimeHandler("1970-01-01") return target, time_handler def set_values_for_sky_model(self): mas = self.mock_astro_sky.return_value mas.date_profile = mock.Mock() mas.date_profile.mjd = 59280.1 mas.get_sky_brightness.return_value = {'u': [16.0], 'g': [17.0], 'r': [18.0], 'i': [19.0], 'z': [20.0], 'y': [21.0]} mas.get_target_information.return_value = {'airmass': [1.1], 'alts': [0.5], 'azs': [0.5]} mas.get_moon_sun_info.return_value = {'moonRA': 30.0, 'moonDec': 10.0, 'moonAlt': -2.0, 'moonAz': 135.0, 'moonPhase': 0.3, 'moonDist': 80.0, 'sunRA': 310.0, 'sunDec': 5.0, 'sunAlt': -24.0, 'sunAz': 285.0, 'solarElong': 150.0} def test_basic_information_after_creation(self): self.assertEqual(self.seq.observations_made, 0) self.assertEqual(self.seq.targets_received, 0) self.assertIsNone(self.seq.observation) self.assertIsNotNone(self.seq.observatory_model) self.assertIsNone(self.seq.observatory_state) self.assertIsNotNone(self.seq.observatory_location) self.assertEqual(self.seq.targets_missed, 0) self.assertIsNotNone(self.seq.sky_model) @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.configure") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_initialization(self, mock_sal_telemetry_pub, mock_main_observatory_configure): self.initialize_sequencer() self.assertIsNotNone(self.seq.observation) self.assertEqual(self.seq.observation.observationId, 0) self.assertEquals(mock_sal_telemetry_pub.call_count, 2) self.assertTrue(mock_main_observatory_configure.called) self.assertIsNotNone(self.seq.observatory_state) @mock.patch("logging.Logger.info") def test_finalization(self, mock_logger_info): self.seq.finalize() self.assertEqual(mock_logger_info.call_count, 3) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_observe_target(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() self.set_values_for_sky_model() observation, slew, exposures = self.seq.observe_target(target, time_handler) self.assertEqual(observation.observation_start_time, time_handler.initial_timestamp + 140.0) self.assertEqual(observation.targetId, target.targetId) self.assertEqual(observation.sky_brightness, 19.0) self.assertEqual(observation.moon_phase, 0.3) self.assertEqual(self.seq.targets_received, 1) self.assertEqual(self.seq.observations_made, 1) self.assertEqual(self.seq.targets_missed, 0) self.assertEqual(len(slew), 5) self.assertEqual(len(exposures), 2) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_end_night(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() self.set_values_for_sky_model() # Don't care about outputs self.seq.observe_target(target, time_handler) self.seq.end_night() obs_current_state = self.seq.observatory_model.currentState self.assertEqual(obs_current_state.telalt, 86.5) self.assertEqual(obs_current_state.telaz, 0.0) self.assertEqual(obs_current_state.domalt, 90.0) self.assertEqual(obs_current_state.domaz, 0.0) self.assertEqual(obs_current_state.filter, target.filter) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_get_observatory_state_after_initialization(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() _, time_handler = self.create_objects() observatory_state = self.seq.get_observatory_state(time_handler.current_timestamp) # Observatory state should be in the park position self.assertEqual(observatory_state.timestamp, 0.0) self.assertEqual(observatory_state.pointing_ra, 29.480264096112467) self.assertEqual(observatory_state.pointing_dec, -26.7444) self.assertEqual(observatory_state.pointing_altitude, 86.5) self.assertEqual(observatory_state.pointing_azimuth, 0.0) self.assertEqual(observatory_state.pointing_pa, -180.0) self.assertEqual(observatory_state.pointing_rot, 0.0) self.assertFalse(observatory_state.tracking) self.assertEqual(observatory_state.telescope_altitude, 86.5) self.assertEqual(observatory_state.telescope_azimuth, 0.0) self.assertEqual(observatory_state.dome_altitude, 90.0) self.assertEqual(observatory_state.dome_azimuth, 0.0) self.assertEqual(observatory_state.filter_position, 'r') self.assertEqual(observatory_state.filter_mounted, 'g,r,i,z,y') self.assertEqual(observatory_state.filter_unmounted, 'u') @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.start_night") def test_start_night(self, mock_obs_son, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() self.seq.start_night(2281, 3560) self.assertTrue(mock_obs_son.called) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_observe_with_no_target(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() target.targetId = -1 observation, slew, exposures = self.seq.observe_target(target, time_handler) self.assertEqual(time_handler.current_timestamp, 60.0) self.assertEqual(observation.targetId, target.targetId) self.assertEqual(self.seq.targets_received, 0) self.assertEqual(self.seq.observations_made, 0) self.assertEqual(self.seq.targets_missed, 1) self.assertIsNone(slew) self.assertIsNone(exposures) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.swap_filter") def test_start_day(self, mock_obs_sf, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() fs = scheduler_filterSwapC() fs.need_swap = True fs.filter_to_unmount = 'u' self.seq.start_day(fs) self.assertTrue(mock_obs_sf.called)
class SequencerTest(unittest.TestCase): def setUp(self): patcher1 = mock.patch("lsst.sims.ocs.kernel.sequencer.AstronomicalSkyModel", spec=True) self.addCleanup(patcher1.stop) self.mock_astro_sky = patcher1.start() self.seq = Sequencer(ObservingSite(), Survey().idle_delay) def initialize_sequencer(self): self.sal = SalManager() self.sal.initialize() self.seq.initialize(self.sal, Observatory()) def create_objects(self): target = self.sal.set_subscribe_topic("target") # Set some meaningful information target.targetId = 10 target.fieldId = 300 target.filter = "i" target.ra = 0.4244 target.dec = -0.5314 target.num_exposures = 2 # Make it so initial timestamp is 0 time_handler = TimeHandler("1970-01-01") return target, time_handler def set_values_for_sky_model(self): mas = self.mock_astro_sky.return_value mas.date_profile = mock.Mock() mas.date_profile.mjd = 59280.1 mas.get_sky_brightness.return_value = SKY_BRIGHTNESS mas.get_target_information.return_value = TARGET_INFO mas.get_moon_sun_info.return_value = MOON_SUN_INFO def test_basic_information_after_creation(self): self.assertEqual(self.seq.observations_made, 0) self.assertEqual(self.seq.targets_received, 0) self.assertIsNone(self.seq.observation) self.assertIsNotNone(self.seq.observatory_model) self.assertIsNone(self.seq.observatory_state) self.assertIsNotNone(self.seq.observatory_location) self.assertEqual(self.seq.targets_missed, 0) self.assertIsNotNone(self.seq.sky_model) @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.configure") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_initialization(self, mock_sal_telemetry_pub, mock_main_observatory_configure): self.initialize_sequencer() self.assertIsNotNone(self.seq.observation) self.assertEqual(self.seq.observation.observationId, 0) self.assertEquals(mock_sal_telemetry_pub.call_count, 2) self.assertTrue(mock_main_observatory_configure.called) self.assertIsNotNone(self.seq.observatory_state) @mock.patch("logging.Logger.info") def test_finalization(self, mock_logger_info): self.seq.finalize() self.assertEqual(mock_logger_info.call_count, 3) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_observe_target(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() self.set_values_for_sky_model() observation, slew, exposures = self.seq.observe_target(target, time_handler) self.assertEqual(observation.observation_start_time, time_handler.initial_timestamp + 140.0) self.assertEqual(observation.targetId, target.targetId) self.assertEqual(observation.sky_brightness, 19.0) self.assertEqual(observation.moon_phase, 0.3) self.assertEqual(self.seq.targets_received, 1) self.assertEqual(self.seq.observations_made, 1) self.assertEqual(self.seq.targets_missed, 0) self.assertEqual(len(slew), 5) self.assertEqual(len(exposures), 2) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_end_night(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() self.set_values_for_sky_model() # Don't care about outputs self.seq.observe_target(target, time_handler) self.seq.end_night() obs_current_state = self.seq.observatory_model.current_state self.assertEqual(obs_current_state.telalt, 86.5) self.assertEqual(obs_current_state.telaz, 0.0) self.assertEqual(obs_current_state.domalt, 90.0) self.assertEqual(obs_current_state.domaz, 0.0) self.assertEqual(obs_current_state.filter, target.filter) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_get_observatory_state_after_initialization(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() _, time_handler = self.create_objects() observatory_state = self.seq.get_observatory_state(time_handler.current_timestamp) # Observatory state should be in the park position self.assertEqual(observatory_state.timestamp, 0.0) self.assertEqual(observatory_state.pointing_ra, 29.480264096112467) self.assertEqual(observatory_state.pointing_dec, -26.7444) self.assertEqual(observatory_state.pointing_altitude, 86.5) self.assertEqual(observatory_state.pointing_azimuth, 0.0) self.assertEqual(observatory_state.pointing_pa, 180.0) self.assertEqual(observatory_state.pointing_rot, 0.0) self.assertFalse(observatory_state.tracking) self.assertEqual(observatory_state.telescope_altitude, 86.5) self.assertEqual(observatory_state.telescope_azimuth, 0.0) self.assertEqual(observatory_state.dome_altitude, 90.0) self.assertEqual(observatory_state.dome_azimuth, 0.0) self.assertEqual(observatory_state.filter_position, 'z') self.assertEqual(observatory_state.filter_mounted, 'g,r,i,z,y') self.assertEqual(observatory_state.filter_unmounted, 'u') @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.start_night") def test_start_night(self, mock_obs_son, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() self.seq.start_night(2281, 3560) self.assertTrue(mock_obs_son.called) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") def test_observe_with_no_target(self, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() target, time_handler = self.create_objects() target.targetId = -1 target.filter = '' target.num_exposures = 1 observation, slew, exposures = self.seq.observe_target(target, time_handler) self.assertEqual(time_handler.current_timestamp, 60.0) self.assertEqual(observation.targetId, target.targetId) self.assertEqual(observation.filter, 'z') self.assertListEqual(list(observation.exposure_times), [15, 0, 0, 0, 0, 0, 0, 0, 0, 0]) self.assertEqual(observation.num_exposures, 1) self.assertEqual(observation.seeing_fwhm_eff, 0.1) self.assertEqual(observation.sky_brightness, 30.0) self.assertEqual(observation.airmass, 1.0) self.assertEqual(self.seq.targets_received, 0) self.assertEqual(self.seq.observations_made, 0) self.assertEqual(self.seq.targets_missed, 1) self.assertIsNone(slew) self.assertIsNone(exposures) @mock.patch("logging.Logger.log") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetrySub") @mock.patch("SALPY_scheduler.SAL_scheduler.salTelemetryPub") @mock.patch("lsst.sims.ocs.observatory.main_observatory.MainObservatory.swap_filter") def test_start_day(self, mock_obs_sf, mock_sal_telemetry_pub, mock_sal_telemetry_sub, mock_logger_log): self.initialize_sequencer() fs = scheduler_filterSwapC() fs.need_swap = True fs.filter_to_unmount = 'u' self.seq.start_day(fs) self.assertTrue(mock_obs_sf.called)