7
7
import os
8
8
import re
9
9
import tempfile
10
+ import time
10
11
import traceback
11
12
import unittest
12
13
from io import StringIO
@@ -914,11 +915,13 @@ def test_log_error_standard_log_sink(self, mock_stdout):
914
915
915
916
def test_log_error_framed_log_sink (self ):
916
917
with NamedTemporaryFile () as temp_file :
918
+ before = int (time .time_ns () / 1000 )
917
919
with bootstrap .FramedTelemetryLogSink (
918
920
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
919
921
) as log_sink :
920
922
err_to_log = bootstrap .make_error ("Error message" , "ErrorType" , None )
921
923
bootstrap .log_error (err_to_log , log_sink )
924
+ after = int (time .time_ns () / 1000 )
922
925
923
926
expected_logged_error = (
924
927
"[ERROR] ErrorType: Error message\n Traceback (most recent call last):"
@@ -928,12 +931,16 @@ def test_log_error_framed_log_sink(self):
928
931
content = f .read ()
929
932
930
933
frame_type = int .from_bytes (content [:4 ], "big" )
931
- self .assertEqual (frame_type , 0xA55A0001 )
934
+ self .assertEqual (frame_type , 0xA55A0003 )
932
935
933
936
length = int .from_bytes (content [4 :8 ], "big" )
934
937
self .assertEqual (length , len (expected_logged_error .encode ("utf8" )))
935
938
936
- actual_message = content [8 :].decode ()
939
+ timestamp = int .from_bytes (content [8 :16 ], "big" )
940
+ self .assertTrue (before <= timestamp )
941
+ self .assertTrue (timestamp <= after )
942
+
943
+ actual_message = content [16 :].decode ()
937
944
self .assertEqual (actual_message , expected_logged_error )
938
945
939
946
@patch ("sys.stdout" , new_callable = StringIO )
@@ -951,13 +958,15 @@ def test_log_error_indentation_standard_log_sink(self, mock_stdout):
951
958
952
959
def test_log_error_indentation_framed_log_sink (self ):
953
960
with NamedTemporaryFile () as temp_file :
961
+ before = int (time .time_ns () / 1000 )
954
962
with bootstrap .FramedTelemetryLogSink (
955
963
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
956
964
) as log_sink :
957
965
err_to_log = bootstrap .make_error (
958
966
"Error message" , "ErrorType" , [" line1 " , " line2 " , " " ]
959
967
)
960
968
bootstrap .log_error (err_to_log , log_sink )
969
+ after = int (time .time_ns () / 1000 )
961
970
962
971
expected_logged_error = (
963
972
"[ERROR] ErrorType: Error message\n Traceback (most recent call last):"
@@ -968,12 +977,16 @@ def test_log_error_indentation_framed_log_sink(self):
968
977
content = f .read ()
969
978
970
979
frame_type = int .from_bytes (content [:4 ], "big" )
971
- self .assertEqual (frame_type , 0xA55A0001 )
980
+ self .assertEqual (frame_type , 0xA55A0003 )
972
981
973
982
length = int .from_bytes (content [4 :8 ], "big" )
974
983
self .assertEqual (length , len (expected_logged_error .encode ("utf8" )))
975
984
976
- actual_message = content [8 :].decode ()
985
+ timestamp = int .from_bytes (content [8 :16 ], "big" )
986
+ self .assertTrue (before <= timestamp )
987
+ self .assertTrue (timestamp <= after )
988
+
989
+ actual_message = content [16 :].decode ()
977
990
self .assertEqual (actual_message , expected_logged_error )
978
991
979
992
@patch ("sys.stdout" , new_callable = StringIO )
@@ -988,13 +1001,15 @@ def test_log_error_empty_stacktrace_line_standard_log_sink(self, mock_stdout):
988
1001
989
1002
def test_log_error_empty_stacktrace_line_framed_log_sink (self ):
990
1003
with NamedTemporaryFile () as temp_file :
1004
+ before = int (time .time_ns () / 1000 )
991
1005
with bootstrap .FramedTelemetryLogSink (
992
1006
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
993
1007
) as log_sink :
994
1008
err_to_log = bootstrap .make_error (
995
1009
"Error message" , "ErrorType" , ["line1" , "" , "line2" ]
996
1010
)
997
1011
bootstrap .log_error (err_to_log , log_sink )
1012
+ after = int (time .time_ns () / 1000 )
998
1013
999
1014
expected_logged_error = (
1000
1015
"[ERROR] ErrorType: Error message\n Traceback "
@@ -1005,17 +1020,22 @@ def test_log_error_empty_stacktrace_line_framed_log_sink(self):
1005
1020
content = f .read ()
1006
1021
1007
1022
frame_type = int .from_bytes (content [:4 ], "big" )
1008
- self .assertEqual (frame_type , 0xA55A0001 )
1023
+ self .assertEqual (frame_type , 0xA55A0003 )
1009
1024
1010
1025
length = int .from_bytes (content [4 :8 ], "big" )
1011
1026
self .assertEqual (length , len (expected_logged_error ))
1012
1027
1013
- actual_message = content [8 :].decode ()
1028
+ timestamp = int .from_bytes (content [8 :16 ], "big" )
1029
+ self .assertTrue (before <= timestamp )
1030
+ self .assertTrue (timestamp <= after )
1031
+
1032
+ actual_message = content [16 :].decode ()
1014
1033
self .assertEqual (actual_message , expected_logged_error )
1015
1034
1016
1035
# Just to ensure we are not logging the requestId from error response, just sending in the response
1017
1036
def test_log_error_invokeId_line_framed_log_sink (self ):
1018
1037
with NamedTemporaryFile () as temp_file :
1038
+ before = int (time .time_ns () / 1000 )
1019
1039
with bootstrap .FramedTelemetryLogSink (
1020
1040
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
1021
1041
) as log_sink :
@@ -1026,6 +1046,7 @@ def test_log_error_invokeId_line_framed_log_sink(self):
1026
1046
"testrequestId" ,
1027
1047
)
1028
1048
bootstrap .log_error (err_to_log , log_sink )
1049
+ after = int (time .time_ns () / 1000 )
1029
1050
1030
1051
expected_logged_error = (
1031
1052
"[ERROR] ErrorType: Error message\n Traceback "
@@ -1036,12 +1057,16 @@ def test_log_error_invokeId_line_framed_log_sink(self):
1036
1057
content = f .read ()
1037
1058
1038
1059
frame_type = int .from_bytes (content [:4 ], "big" )
1039
- self .assertEqual (frame_type , 0xA55A0001 )
1060
+ self .assertEqual (frame_type , 0xA55A0003 )
1040
1061
1041
1062
length = int .from_bytes (content [4 :8 ], "big" )
1042
1063
self .assertEqual (length , len (expected_logged_error ))
1043
1064
1044
- actual_message = content [8 :].decode ()
1065
+ timestamp = int .from_bytes (content [8 :16 ], "big" )
1066
+ self .assertTrue (before <= timestamp )
1067
+ self .assertTrue (timestamp <= after )
1068
+
1069
+ actual_message = content [16 :].decode ()
1045
1070
self .assertEqual (actual_message , expected_logged_error )
1046
1071
1047
1072
@@ -1090,45 +1115,58 @@ def test_create_framed_telemetry_log_sinks(self):
1090
1115
def test_single_frame (self ):
1091
1116
with NamedTemporaryFile () as temp_file :
1092
1117
message = "hello world\n something on a new line!\n "
1118
+ before = int (time .time_ns () / 1000 )
1093
1119
with bootstrap .FramedTelemetryLogSink (
1094
1120
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
1095
1121
) as ls :
1096
1122
ls .log (message )
1123
+ after = int (time .time_ns () / 1000 )
1097
1124
with open (temp_file .name , "rb" ) as f :
1098
1125
content = f .read ()
1099
1126
1100
1127
frame_type = int .from_bytes (content [:4 ], "big" )
1101
- self .assertEqual (frame_type , 0xA55A0001 )
1128
+ self .assertEqual (frame_type , 0xA55A0003 )
1102
1129
1103
1130
length = int .from_bytes (content [4 :8 ], "big" )
1104
1131
self .assertEqual (length , len (message ))
1105
1132
1106
- actual_message = content [8 :].decode ()
1133
+ timestamp = int .from_bytes (content [8 :16 ], "big" )
1134
+ self .assertTrue (before <= timestamp )
1135
+ self .assertTrue (timestamp <= after )
1136
+
1137
+ actual_message = content [16 :].decode ()
1107
1138
self .assertEqual (actual_message , message )
1108
1139
1109
1140
def test_multiple_frame (self ):
1110
1141
with NamedTemporaryFile () as temp_file :
1111
1142
first_message = "hello world\n something on a new line!"
1112
1143
second_message = "hello again\n here's another message\n "
1113
1144
1145
+ before = int (time .time_ns () / 1000 )
1114
1146
with bootstrap .FramedTelemetryLogSink (
1115
1147
os .open (temp_file .name , os .O_CREAT | os .O_RDWR )
1116
1148
) as ls :
1117
1149
ls .log (first_message )
1118
1150
ls .log (second_message )
1151
+ after = int (time .time_ns () / 1000 )
1119
1152
1120
1153
with open (temp_file .name , "rb" ) as f :
1121
1154
content = f .read ()
1122
1155
pos = 0
1123
1156
for message in [first_message , second_message ]:
1124
1157
frame_type = int .from_bytes (content [pos : pos + 4 ], "big" )
1125
- self .assertEqual (frame_type , 0xA55A0001 )
1158
+ self .assertEqual (frame_type , 0xA55A0003 )
1126
1159
pos += 4
1127
1160
1128
1161
length = int .from_bytes (content [pos : pos + 4 ], "big" )
1129
1162
self .assertEqual (length , len (message ))
1130
1163
pos += 4
1131
1164
1165
+ timestamp = int .from_bytes (content [pos : pos + 8 ], "big" )
1166
+ self .assertTrue (before <= timestamp )
1167
+ self .assertTrue (timestamp <= after )
1168
+ pos += 8
1169
+
1132
1170
actual_message = content [pos : pos + len (message )].decode ()
1133
1171
self .assertEqual (actual_message , message )
1134
1172
pos += len (message )
0 commit comments