#! /usr/bin/env python from os import path import sys # ensure geomag is on the path before importing try: import geomagio # noqa (tells linter to ignore this line.) except: script_dir = path.dirname(path.abspath(__file__)) sys.path.append(path.normpath(path.join(script_dir, '..'))) from geomagio.Controller import main, parse_args if __name__ == '__main__': args = parse_args(sys.argv[1:]) main(args)
def test_controller_update_sqdist(): """Controller_test.test_controller_update_sqdist(). This is an end-to-end test of the Controller, more-or-less how it would be invoked via the geomag.py command line script. We specifically test the Controller's run() logic using the SqDistAlgoritm and carefully constructed inputs since this is one of the most complicated anticipated use-cases. Some liberties have been taken to avoid repeatedly parsing all arguments or reloading the interpreter. This test also takes advantage of the fact that args.realtime is processed at the end of main() before _main() is called. This test explicitly sets starttime, endtime, and realtime argument values to override what may otherwise be expected during normal command line operations. """ # define folder for testing tmp_dir = gettempdir() # create list of string command line arguments fake_argv = [ "--input", "iaga2002", "--input-url", "file://etc/controller/{obs}{date:%Y%m%d}_XYZF_{t}{i}.{i}", "--observatory", "BOU", "--algorithm", "sqdist", "--sqdist-m", "1440", "--sqdist-alpha", "2.3148e-5", "--sqdist-gamma", "3.3333e-2", "--sqdist-smooth", "180", "--inchannels", "X", "Y", "Z", "F", "--interval", "minute", "--rename-output-channel", "H_Dist", "MDT", "--rename-output-channel", "H_SQ", "MSQ", "--rename-output-channel", "H_SV", "MSV", "--rename-output-channel", "H_Sigma", "MSS", "--outchannels", "MDT", "MSQ", "MSV", "MSS", "--sqdist-mag", "--sqdist-statefile", tmp_dir + "/sqdistBOU_h_state.json", "--type", "variation", "--output", "iaga2002", "--output-url", "file://" + tmp_dir + "/{obs}{date:%Y%m%d}_DQVS_{t}{i}.{i}", "--realtime", "600", ] # parse arguments and create initial args object args = parse_args(fake_argv) # read in test and latest output and compare actual_factory = IAGA2002Factory( urlTemplate=("file://" + tmp_dir + "/{obs}{date:%Y%m%d}_DQVS_{t}{i}.{i}"), urlInterval=86400, observatory="BOU", channels=["MDT", "MSQ", "MSV", "MSS"], ) expected_factory = IAGA2002Factory( urlTemplate="url template, individual tests change the template below", urlInterval=86400, observatory="BOU", channels=["MDT", "MSQ", "MSV", "MSS"], ) # setup test data # copy SqDistAlgorithm statefile and empty DQVS output file to tmp folder copy("etc/controller/sqdistBOU_h_state.json", tmp_dir) copy( "etc/controller/bou20181024_DQVS_test0_vmin.min", tmp_dir + "/bou20181024_DQVS_vmin.min", ) # TEST 1 - include a gap at end that is less than realtime (10 minutes), # expect sqdist not to project SQ/SV/SS starttime1 = args.starttime = UTCDateTime("2018-10-24T00:00:00Z") endtime1 = args.endtime = UTCDateTime("2018-10-24T00:19:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime1) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test1_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime1) assert_allclose(actual, expected) # TEST 2 - start after next_starttime (00:10), # expect SQDist to project sq/sv/ss values over gap, # then process until last gap starting at 00:38 args.startime = UTCDateTime("2018-10-24T00:20:00Z") endtime2 = args.endtime = UTCDateTime("2018-10-24T00:39:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime2) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test2_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime2) assert_allclose(actual, expected) # TEST 3 - start after next_starttime (00:38), # expect SQDist to project over gap, # then process until last gap starting at 00:58 args.starttime = UTCDateTime("2018-10-24T00:40:00Z") endtime3 = args.endtime = UTCDateTime("2018-10-24T00:59:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime3) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test3_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime3) assert_allclose(actual, expected) # TEST 4 - start after next_starttime (00:58), # exptect SQDist to project over gap, # then process until last gap starting at 01:16 args.starttime = UTCDateTime("2018-10-24T01:00:00Z") endtime4 = args.endtime = UTCDateTime("2018-10-24T01:19:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime4) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test4_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime4) assert_allclose(actual, expected) # TEST 5 - start after next_starttime (01:16), # expect SQDist to project until beginning of realtime gap, # starting at 01:30 (01:39 - 600 seconds) args.starttime = UTCDateTime("2018-10-24T01:20:00Z") endtime5 = args.endtime = UTCDateTime("2018-10-24T01:39:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime5) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test5_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime5) assert_allclose(actual, expected) # TEST 6 - set starttime before next_starttime (which is 01:30) # expect sqdist to pick up where it left off args.starttime = UTCDateTime("2018-10-24T01:20:00Z") endtime6 = args.endtime = UTCDateTime("2018-10-24T01:59:00Z") _main(args) # compare results actual = actual_factory.get_timeseries(starttime=starttime1, endtime=endtime6) expected_factory.urlTemplate = ( "file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test6_{t}{i}.{i}" ) expected = expected_factory.get_timeseries(starttime=starttime1, endtime=endtime6) assert_allclose(actual, expected)
def test_controller_update_sqdist(): """Controller_test.test_controller_update_sqdist(). This is an end-to-end test of the Controller, more-or-less how it would be invoked via the geomag.py command line script. We specifically test the Controller's run() logic using the SqDistAlgoritm and carefully constructed inputs since this is one of the most complicated anticipated use-cases. Some liberties have been taken to avoid repeatedly parsing all arguments or reloading the interpreter. This test also takes advantage of the fact that args.realtime is processed at the end of main() before _main() is called. This test explicitly sets starttime, endtime, and realtime argument values to override what may otherwise be expected during normal command line operations. """ # define folder for testing tmp_dir = gettempdir() # create list of string command line arguments fake_argv = [ '--input', 'iaga2002', '--input-url', 'file://etc/controller/{obs}{date:%Y%m%d}_XYZF_{t}{i}.{i}', '--observatory', 'BOU', '--algorithm', 'sqdist', '--sqdist-m', '1440', '--sqdist-alpha', '2.3148e-5', '--sqdist-gamma', '3.3333e-2', '--sqdist-smooth', '180', '--inchannels', 'X', 'Y', 'Z', 'F', '--interval', 'minute', '--rename-output-channel', 'H_Dist', 'MDT', '--rename-output-channel', 'H_SQ', 'MSQ', '--rename-output-channel', 'H_SV', 'MSV', '--rename-output-channel', 'H_Sigma', 'MSS', '--outchannels', 'MDT', 'MSQ', 'MSV', 'MSS', '--sqdist-mag', '--sqdist-statefile', tmp_dir + '/sqdistBOU_h_state.json', '--type', 'variation', '--output', 'iaga2002', '--output-url', 'file://' + tmp_dir + '/{obs}{date:%Y%m%d}_DQVS_{t}{i}.{i}', '--realtime', '600' ] # parse arguments and create initial args object args = parse_args(fake_argv) # read in test and latest output and compare actual_factory = IAGA2002Factory( urlTemplate=('file://' + tmp_dir + '/{obs}{date:%Y%m%d}_DQVS_{t}{i}.{i}'), urlInterval=86400, observatory='BOU', channels=['MDT', 'MSQ', 'MSV', 'MSS'] ) expected_factory = IAGA2002Factory( urlTemplate='url template, individual tests change the template below', urlInterval=86400, observatory='BOU', channels=['MDT', 'MSQ', 'MSV', 'MSS'] ) # setup test data # copy SqDistAlgorithm statefile and empty DQVS output file to tmp folder copy('etc/controller/sqdistBOU_h_state.json', tmp_dir) copy('etc/controller/bou20181024_DQVS_test0_vmin.min', tmp_dir + '/bou20181024_DQVS_vmin.min') # TEST 1 - include a gap at end that is less than realtime (10 minutes), # expect sqdist not to project SQ/SV/SS starttime1 = args.starttime = UTCDateTime('2018-10-24T00:00:00Z') endtime1 = args.endtime = UTCDateTime('2018-10-24T00:19:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime1) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test1_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime1) assert_allclose(actual, expected) # TEST 2 - start after next_starttime (00:10), # expect SQDist to project sq/sv/ss values over gap, # then process until last gap starting at 00:38 args.startime = UTCDateTime('2018-10-24T00:20:00Z') endtime2 = args.endtime = UTCDateTime('2018-10-24T00:39:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime2) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test2_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime2) assert_allclose(actual, expected) # TEST 3 - start after next_starttime (00:38), # expect SQDist to project over gap, # then process until last gap starting at 00:58 args.starttime = UTCDateTime('2018-10-24T00:40:00Z') endtime3 = args.endtime = UTCDateTime('2018-10-24T00:59:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime3) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test3_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime3) assert_allclose(actual, expected) # TEST 4 - start after next_starttime (00:58), # exptect SQDist to project over gap, # then process until last gap starting at 01:16 args.starttime = UTCDateTime('2018-10-24T01:00:00Z') endtime4 = args.endtime = UTCDateTime('2018-10-24T01:19:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime4) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test4_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime4) assert_allclose(actual, expected) # TEST 5 - start after next_starttime (01:16), # expect SQDist to project until beginning of realtime gap, # starting at 01:30 (01:39 - 600 seconds) args.starttime = UTCDateTime('2018-10-24T01:20:00Z') endtime5 = args.endtime = UTCDateTime('2018-10-24T01:39:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime5) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test5_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime5) assert_allclose(actual, expected) # TEST 6 - set starttime before next_starttime (which is 01:30) # expect sqdist to pick up where it left off args.starttime = UTCDateTime('2018-10-24T01:20:00Z') endtime6 = args.endtime = UTCDateTime('2018-10-24T01:59:00Z') _main(args) # compare results actual = actual_factory.get_timeseries( starttime=starttime1, endtime=endtime6) expected_factory.urlTemplate = \ 'file://etc/controller/{obs}{date:%Y%m%d}_DQVS_test6_{t}{i}.{i}' expected = expected_factory.get_timeseries( starttime=starttime1, endtime=endtime6) assert_allclose(actual, expected)