55
66from cloudinit .analyze .dump import (
77 dump_events , parse_ci_logline , parse_timestamp )
8- from cloudinit .util import subp , write_file
9- from cloudinit .tests .helpers import CiTestCase
8+ from cloudinit .util import which , write_file
9+ from cloudinit .tests .helpers import CiTestCase , mock , skipIf
1010
1111
1212class TestParseTimestamp (CiTestCase ):
@@ -15,21 +15,9 @@ def test_parse_timestamp_handles_cloud_init_default_format(self):
1515 """Logs with cloud-init detailed formats will be properly parsed."""
1616 trusty_fmt = '%Y-%m-%d %H:%M:%S,%f'
1717 trusty_stamp = '2016-09-12 14:39:20,839'
18-
19- parsed = parse_timestamp (trusty_stamp )
20-
21- # convert ourselves
2218 dt = datetime .strptime (trusty_stamp , trusty_fmt )
23- expected = float (dt .strftime ('%s.%f' ))
24-
25- # use date(1)
26- out , _err = subp (['date' , '+%s.%3N' , '-d' , trusty_stamp ])
27- timestamp = out .strip ()
28- date_ts = float (timestamp )
29-
30- self .assertEqual (expected , parsed )
31- self .assertEqual (expected , date_ts )
32- self .assertEqual (date_ts , parsed )
19+ self .assertEqual (
20+ float (dt .strftime ('%s.%f' )), parse_timestamp (trusty_stamp ))
3321
3422 def test_parse_timestamp_handles_syslog_adding_year (self ):
3523 """Syslog timestamps lack a year. Add year and properly parse."""
@@ -39,17 +27,9 @@ def test_parse_timestamp_handles_syslog_adding_year(self):
3927 # convert stamp ourselves by adding the missing year value
4028 year = datetime .now ().year
4129 dt = datetime .strptime (syslog_stamp + " " + str (year ), syslog_fmt )
42- expected = float (dt .strftime ('%s.%f' ))
43- parsed = parse_timestamp (syslog_stamp )
44-
45- # use date(1)
46- out , _ = subp (['date' , '+%s.%3N' , '-d' , syslog_stamp ])
47- timestamp = out .strip ()
48- date_ts = float (timestamp )
49-
50- self .assertEqual (expected , parsed )
51- self .assertEqual (expected , date_ts )
52- self .assertEqual (date_ts , parsed )
30+ self .assertEqual (
31+ float (dt .strftime ('%s.%f' )),
32+ parse_timestamp (syslog_stamp ))
5333
5434 def test_parse_timestamp_handles_journalctl_format_adding_year (self ):
5535 """Journalctl precise timestamps lack a year. Add year and parse."""
@@ -59,37 +39,22 @@ def test_parse_timestamp_handles_journalctl_format_adding_year(self):
5939 # convert stamp ourselves by adding the missing year value
6040 year = datetime .now ().year
6141 dt = datetime .strptime (journal_stamp + " " + str (year ), journal_fmt )
62- expected = float (dt .strftime ('%s.%f' ))
63- parsed = parse_timestamp (journal_stamp )
64-
65- # use date(1)
66- out , _ = subp (['date' , '+%s.%6N' , '-d' , journal_stamp ])
67- timestamp = out .strip ()
68- date_ts = float (timestamp )
69-
70- self .assertEqual (expected , parsed )
71- self .assertEqual (expected , date_ts )
72- self .assertEqual (date_ts , parsed )
42+ self .assertEqual (
43+ float (dt .strftime ('%s.%f' )), parse_timestamp (journal_stamp ))
7344
45+ @skipIf (not which ("date" ), "'date' command not available." )
7446 def test_parse_unexpected_timestamp_format_with_date_command (self ):
75- """Dump sends unexpected timestamp formats to data for processing."""
47+ """Dump sends unexpected timestamp formats to date for processing."""
7648 new_fmt = '%H:%M %m/%d %Y'
7749 new_stamp = '17:15 08/08'
78-
7950 # convert stamp ourselves by adding the missing year value
8051 year = datetime .now ().year
8152 dt = datetime .strptime (new_stamp + " " + str (year ), new_fmt )
82- expected = float (dt .strftime ('%s.%f' ))
83- parsed = parse_timestamp (new_stamp )
8453
8554 # use date(1)
86- out , _ = subp (['date' , '+%s.%6N' , '-d' , new_stamp ])
87- timestamp = out .strip ()
88- date_ts = float (timestamp )
89-
90- self .assertEqual (expected , parsed )
91- self .assertEqual (expected , date_ts )
92- self .assertEqual (date_ts , parsed )
55+ with self .allow_subp (["date" ]):
56+ self .assertEqual (
57+ float (dt .strftime ('%s.%f' )), parse_timestamp (new_stamp ))
9358
9459
9560class TestParseCILogLine (CiTestCase ):
@@ -135,7 +100,9 @@ def test_parse_logline_returns_event_for_journalctl_logs(self):
135100 'timestamp' : timestamp }
136101 self .assertEqual (expected , parse_ci_logline (line ))
137102
138- def test_parse_logline_returns_event_for_finish_events (self ):
103+ @mock .patch ("cloudinit.analyze.dump.parse_timestamp_from_date" )
104+ def test_parse_logline_returns_event_for_finish_events (self ,
105+ m_parse_from_date ):
139106 """parse_ci_logline returns a finish event for a parsed log line."""
140107 line = ('2016-08-30 21:53:25.972325+00:00 y1 [CLOUDINIT]'
141108 ' handlers.py[DEBUG]: finish: modules-final: SUCCESS: running'
@@ -147,7 +114,10 @@ def test_parse_logline_returns_event_for_finish_events(self):
147114 'origin' : 'cloudinit' ,
148115 'result' : 'SUCCESS' ,
149116 'timestamp' : 1472594005.972 }
117+ m_parse_from_date .return_value = "1472594005.972"
150118 self .assertEqual (expected , parse_ci_logline (line ))
119+ m_parse_from_date .assert_has_calls (
120+ [mock .call ("2016-08-30 21:53:25.972325+00:00" )])
151121
152122
153123SAMPLE_LOGS = dedent ("""\
@@ -162,10 +132,16 @@ def test_parse_logline_returns_event_for_finish_events(self):
162132class TestDumpEvents (CiTestCase ):
163133 maxDiff = None
164134
165- def test_dump_events_with_rawdata (self ):
135+ @mock .patch ("cloudinit.analyze.dump.parse_timestamp_from_date" )
136+ def test_dump_events_with_rawdata (self , m_parse_from_date ):
166137 """Rawdata is split and parsed into a tuple of events and data"""
138+ m_parse_from_date .return_value = "1472594005.972"
167139 events , data = dump_events (rawdata = SAMPLE_LOGS )
168140 expected_data = SAMPLE_LOGS .splitlines ()
141+ self .assertEqual (
142+ [mock .call ("2016-08-30 21:53:25.972325+00:00" )],
143+ m_parse_from_date .call_args_list )
144+ self .assertEqual (expected_data , data )
169145 year = datetime .now ().year
170146 dt1 = datetime .strptime (
171147 'Nov 03 06:51:06.074410 %d' % year , '%b %d %H:%M:%S.%f %Y' )
@@ -183,12 +159,14 @@ def test_dump_events_with_rawdata(self):
183159 'result' : 'SUCCESS' ,
184160 'timestamp' : 1472594005.972 }]
185161 self .assertEqual (expected_events , events )
186- self .assertEqual (expected_data , data )
187162
188- def test_dump_events_with_cisource (self ):
163+ @mock .patch ("cloudinit.analyze.dump.parse_timestamp_from_date" )
164+ def test_dump_events_with_cisource (self , m_parse_from_date ):
189165 """Cisource file is read and parsed into a tuple of events and data."""
190166 tmpfile = self .tmp_path ('logfile' )
191167 write_file (tmpfile , SAMPLE_LOGS )
168+ m_parse_from_date .return_value = 1472594005.972
169+
192170 events , data = dump_events (cisource = open (tmpfile ))
193171 year = datetime .now ().year
194172 dt1 = datetime .strptime (
@@ -208,3 +186,5 @@ def test_dump_events_with_cisource(self):
208186 'timestamp' : 1472594005.972 }]
209187 self .assertEqual (expected_events , events )
210188 self .assertEqual (SAMPLE_LOGS .splitlines (), [d .strip () for d in data ])
189+ m_parse_from_date .assert_has_calls (
190+ [mock .call ("2016-08-30 21:53:25.972325+00:00" )])
0 commit comments