Source code for satpy.tests.reader_tests.test_seviri_l2_bufr

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2017-2019 Satpy developers
#
# This file is part of satpy.
#
# satpy is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# satpy is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# satpy.  If not, see <http://www.gnu.org/licenses/>.
"""Unittesting the SEVIRI L2 BUFR reader."""

import sys
import unittest
from datetime import datetime
from unittest import mock

import numpy as np

FILETYPE_INFO = {'file_type':  'seviri_l2_bufr_csr'}

FILENAME_INFO = {'start_time': '20191112000000',
                 'spacecraft': 'MSG4'}
FILENAME_INFO2 = {'start_time': '20191112000000',
                  'spacecraft': 'MSG4',
                  'server': 'TESTSERVER'}
MPEF_PRODUCT_HEADER = {
    'NominalTime': datetime(2019, 11, 6, 18, 0),
    'SpacecraftName': '08',
    'RectificationLongitude': 'E0415'
}

DATASET_INFO = {
    'key': '#1#brightnessTemperature',
    'fill_value': 0
}

DATASET_ATTRS = {
    'platform_name': 'MET08',
    'ssp_lon': 41.5,
    'seg_size': 16
}


[docs]class TestSeviriL2Bufr(unittest.TestCase): """Test NativeMSGBufrHandler."""
[docs] @unittest.skipIf(sys.platform.startswith('win'), "'eccodes' not supported on Windows") def seviri_l2_bufr_test(self, filename): """Test the SEVIRI BUFR handler.""" import eccodes as ec from satpy.readers.seviri_l2_bufr import SeviriL2BufrFileHandler buf1 = ec.codes_bufr_new_from_samples('BUFR4_local_satellite') ec.codes_set(buf1, 'unpack', 1) samp1 = np.random.uniform(low=250, high=350, size=(128,)) # write the bufr test data twice as we want to read in and the concatenate the data in the reader # 55 id corresponds to METEOSAT 8 ec.codes_set(buf1, 'satelliteIdentifier', 55) ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) ec.codes_set_array(buf1, '#1#brightnessTemperature', samp1) m = mock.mock_open() # only our offline product contain MPEF product headers so we get the metadata from there if ('BUFRProd' in filename): with mock.patch('satpy.readers.seviri_l2_bufr.np.fromfile') as fromfile: fromfile.return_value = MPEF_PRODUCT_HEADER with mock.patch('satpy.readers.seviri_l2_bufr.recarray2dict') as recarray2dict: recarray2dict.side_effect = (lambda x: x) fh = SeviriL2BufrFileHandler(filename, FILENAME_INFO2, FILETYPE_INFO) fh.mpef_header = MPEF_PRODUCT_HEADER else: # No Mpef Header so we get the metadata from the BUFR messages with mock.patch('satpy.readers.seviri_l2_bufr.open', m, create=True): with mock.patch('eccodes.codes_bufr_new_from_file', side_effect=[buf1, None, buf1, None, buf1, None]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 fh = SeviriL2BufrFileHandler(filename, FILENAME_INFO, FILETYPE_INFO) with mock.patch('satpy.readers.seviri_l2_bufr.open', m, create=True): with mock.patch('eccodes.codes_bufr_new_from_file', side_effect=[buf1, buf1, None]) as ec1: ec1.return_value = ec1.side_effect with mock.patch('eccodes.codes_set') as ec2: ec2.return_value = 1 with mock.patch('eccodes.codes_release') as ec5: ec5.return_value = 1 z = fh.get_dataset(None, DATASET_INFO) # concatenate the original test arrays as # get dataset will have read and concatented the data x1 = np.concatenate((samp1, samp1), axis=0) np.testing.assert_array_equal(z.values, x1) self.assertEqual(z.attrs['platform_name'], DATASET_ATTRS['platform_name']) self.assertEqual(z.attrs['ssp_lon'], DATASET_ATTRS['ssp_lon']) self.assertEqual(z.attrs['seg_size'], DATASET_ATTRS['seg_size'])
[docs] def test_seviri_l2_bufr(self): """Call the test function.""" self.seviri_l2_bufr_test('GIIBUFRProduct_20191106130000Z_00_OMPEFS04_MET11_FES_E0000') self.seviri_l2_bufr_test('MSG4-SEVI-MSGGIIN-0101-0101-20191106130000.000000000Z-20191106131702-1362128.bfr') self.seviri_l2_bufr_test('MSG4-SEVI-MSGGIIN-0101-0101-20191106101500.000000000Z-20191106103218-1362148')