def get_fake_file_handler(start_time, nlines, ncols, projection_longitude=0, orbit_polynomials=ORBIT_POLYNOMIALS): """Create a mocked SEVIRI HRIT file handler.""" prologue = get_fake_prologue(projection_longitude, orbit_polynomials) mda = get_fake_mda(nlines=nlines, ncols=ncols, start_time=start_time) filename_info = get_fake_filename_info(start_time) epilogue = get_fake_epilogue() m = mock.mock_open() with mock.patch('satpy.readers.seviri_l1b_hrit.np.fromfile') as fromfile, \ mock.patch('satpy.readers.hrit_base.open', m, create=True) as newopen, \ mock.patch('satpy.readers.seviri_l1b_hrit.CHANNEL_NAMES'), \ mock.patch.object(HRITMSGFileHandler, '_get_hd', new=new_get_hd), \ mock.patch.object(HRITMSGPrologueFileHandler, 'read_prologue', new=get_new_read_prologue(prologue)): fromfile.return_value = np.array([(1, 2)], dtype=[('total_header_length', int), ('hdr_id', int)]) newopen.return_value.__enter__.return_value.tell.return_value = 1 prologue = HRITMSGPrologueFileHandler( filename='dummy_prologue_filename', filename_info=filename_info, filetype_info={}) epilogue = mock.MagicMock(epilogue=epilogue) reader = HRITMSGFileHandler('filename', filename_info, {'filetype': 'info'}, prologue, epilogue) reader.mda.update(mda) return reader
def setUp(self, *mocks): """Set up the test case.""" self.reader = HRITMSGPrologueFileHandler() self.reader.satpos = None self.reader.prologue = { 'GeometricProcessing': { 'EarthModel': { 'EquatorialRadius': 6378.169, 'NorthPolarRadius': 6356.5838, 'SouthPolarRadius': 6356.5838 } }, 'ImageAcquisition': { 'PlannedAcquisitionTime': { 'TrueRepeatCycleStart': datetime(2006, 1, 1, 12, 15, 9, 304888) } }, 'SatelliteStatus': { 'Orbit': { 'OrbitPolynomial': { 'StartTime': np.array([ [datetime(2006, 1, 1, 6), datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18), datetime(1958, 1, 1, 0)]]), 'EndTime': np.array([ [datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18), datetime(2006, 1, 2, 0), datetime(1958, 1, 1, 0)]]), 'X': [np.zeros(8), [8.41607082e+04, 2.94319260e+00, 9.86748617e-01, -2.70135453e-01, -3.84364650e-02, 8.48718433e-03, 7.70548174e-04, -1.44262718e-04], np.zeros(8)], 'Y': [np.zeros(8), [-5.21170255e+03, 5.12998948e+00, -1.33370453e+00, -3.09634144e-01, 6.18232793e-02, 7.50505681e-03, -1.35131011e-03, -1.12054405e-04], np.zeros(8)], 'Z': [np.zeros(8), [-6.51293855e+02, 1.45830459e+02, 5.61379400e+01, -3.90970565e+00, -7.38137565e-01, 3.06131644e-02, 3.82892428e-03, -1.12739309e-04], np.zeros(8)], } } } } self.reader._reduced = None
def test_extra_kwargs(self, init, *mocks): """Test whether the prologue file handler accepts extra keyword arguments.""" def init_patched(self, *args, **kwargs): self.mda = {} init.side_effect = init_patched HRITMSGPrologueFileHandler(filename=None, filename_info={'service': ''}, filetype_info=None, ext_calib_coefs={}, mda_max_array_size=123, calib_mode='nominal')
def test_calibrate(self, init, *mocks): """Test whether the prologue file handler accepts extra calibration keywords""" def init_patched(self, *args, **kwargs): self.mda = {} init.side_effect = init_patched HRITMSGPrologueFileHandler(filename=None, filename_info={'service': ''}, filetype_info=None, ext_calib_coefs={}, calib_mode='nominal')
class TestHRITMSGPrologueFileHandler(unittest.TestCase): """Test the HRIT prologue file handler.""" @mock.patch( 'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler.__init__', return_value=None) def setUp(self, *mocks): self.reader = HRITMSGPrologueFileHandler() self.reader.satpos = None self.reader.prologue = { 'GeometricProcessing': { 'EarthModel': { 'EquatorialRadius': 6378.169, 'NorthPolarRadius': 6356.5838, 'SouthPolarRadius': 6356.5838 } }, 'ImageAcquisition': { 'PlannedAcquisitionTime': { 'TrueRepeatCycleStart': datetime(2006, 1, 1, 12, 15, 9, 304888) } }, 'SatelliteStatus': { 'Orbit': { 'OrbitPolynomial': { 'StartTime': np.array([[ datetime(2006, 1, 1, 6), datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18) ]]), 'EndTime': np.array([[ datetime(2006, 1, 1, 12), datetime(2006, 1, 1, 18), datetime(2006, 1, 2, 0) ]]), 'X': [ np.zeros(8), [ 8.41607082e+04, 2.94319260e+00, 9.86748617e-01, -2.70135453e-01, -3.84364650e-02, 8.48718433e-03, 7.70548174e-04, -1.44262718e-04 ], np.zeros(8) ], 'Y': [ np.zeros(8), [ -5.21170255e+03, 5.12998948e+00, -1.33370453e+00, -3.09634144e-01, 6.18232793e-02, 7.50505681e-03, -1.35131011e-03, -1.12054405e-04 ], np.zeros(8) ], 'Z': [ np.zeros(8), [ -6.51293855e+02, 1.45830459e+02, 5.61379400e+01, -3.90970565e+00, -7.38137565e-01, 3.06131644e-02, 3.82892428e-03, -1.12739309e-04 ], np.zeros(8) ], } } } } self.reader._reduced = None @mock.patch( 'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler.read_prologue' ) @mock.patch('satpy.readers.hrit_base.HRITFileHandler.__init__', autospec=True) def test_extra_kwargs(self, init, *mocks): """Test whether the prologue file handler accepts extra keyword arguments""" def init_patched(self, *args, **kwargs): self.mda = {} init.side_effect = init_patched HRITMSGPrologueFileHandler(filename=None, filename_info={'service': ''}, filetype_info=None, ext_calib_coefs={}, mda_max_array_size=123, calib_mode='nominal') def test_find_orbit_coefs(self): """Test identification of orbit coefficients""" self.assertEqual(self.reader._find_orbit_coefs(), 1) # No interval enclosing the given timestamp self.reader.prologue['ImageAcquisition']['PlannedAcquisitionTime'][ 'TrueRepeatCycleStart'] = datetime(2000, 1, 1) self.assertRaises(NoValidOrbitParams, self.reader._find_orbit_coefs) @mock.patch( 'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler._find_orbit_coefs' ) def test_get_satpos_cart(self, find_orbit_coefs): """Test satellite position in cartesian coordinates""" find_orbit_coefs.return_value = 1 x, y, z = self.reader._get_satpos_cart() self.assertTrue( np.allclose( [x, y, z], [42078421.37095518, -2611352.744615312, -419828.9699940758])) @mock.patch( 'satpy.readers.seviri_l1b_hrit.HRITMSGPrologueFileHandler._get_satpos_cart' ) def test_get_satpos(self, get_satpos_cart): """Test satellite position in spherical coordinates""" get_satpos_cart.return_value = [ 42078421.37095518, -2611352.744615312, -419828.9699940758 ] lon, lat, dist = self.reader.get_satpos() self.assertTrue( np.allclose(lon, lat, dist), [-3.5511754052132387, -0.5711189258409902, 35783328.146167226]) # Test cache self.reader.get_satpos() self.assertEqual(get_satpos_cart.call_count, 1) # No valid coefficients self.reader.satpos = None # reset cache get_satpos_cart.side_effect = NoValidOrbitParams self.reader.prologue['ImageAcquisition']['PlannedAcquisitionTime'][ 'TrueRepeatCycleStart'] = datetime(2000, 1, 1) self.assertTupleEqual(self.reader.get_satpos(), (None, None, None)) def test_get_earth_radii(self): """Test readout of earth radii""" earth_model = self.reader.prologue['GeometricProcessing']['EarthModel'] earth_model['EquatorialRadius'] = 2 earth_model['NorthPolarRadius'] = 1 earth_model['SouthPolarRadius'] = 2 a, b = self.reader.get_earth_radii() self.assertEqual(a, 2000) self.assertEqual(b, 1500) @mock.patch('satpy.readers.seviri_l1b_hrit.utils.reduce_mda') def test_reduce(self, reduce_mda): """Test metadata reduction""" reduce_mda.return_value = 'reduced' # Set buffer self.assertEqual(self.reader.reduce(123), 'reduced') reduce_mda.assert_called() # Read buffer reduce_mda.reset_mock() self.reader._reduced = 'red' self.assertEqual(self.reader.reduce(123), 'red') reduce_mda.assert_not_called()