1+ import os
2+ import sys
3+ import unittest
4+ import subprocess
5+
6+ from test .support import script_helper
7+ from test .support .os_helper import TESTFN , unlink
8+
9+ class TracebackTimestampsTests (unittest .TestCase ):
10+ def setUp (self ):
11+ self .script = """
12+ import sys
13+ import traceback
14+
15+ def cause_exception():
16+ 1/0
17+
18+ try:
19+ cause_exception()
20+ except Exception as e:
21+ traceback.print_exc()
22+ """
23+ self .script_path = TESTFN + '.py'
24+ with open (self .script_path , 'w' ) as script_file :
25+ script_file .write (self .script )
26+ self .addCleanup (unlink , self .script_path )
27+
28+ # Script to check sys.flags.traceback_timestamps value
29+ self .flags_script = """
30+ import sys
31+ print(repr(sys.flags.traceback_timestamps))
32+ """
33+ self .flags_script_path = TESTFN + '_flag.py'
34+ with open (self .flags_script_path , 'w' ) as script_file :
35+ script_file .write (self .flags_script )
36+ self .addCleanup (unlink , self .flags_script_path )
37+
38+ def test_no_traceback_timestamps (self ):
39+ """Test that traceback timestamps are not shown by default"""
40+ result = script_helper .assert_python_ok (self .script_path )
41+ stderr = result .err .decode ()
42+ self .assertNotIn ("<@" , stderr ) # No timestamp should be present
43+
44+ def test_traceback_timestamps_env_var (self ):
45+ """Test that PYTHON_TRACEBACK_TIMESTAMPS env var enables timestamps"""
46+ result = script_helper .assert_python_ok (self .script_path , PYTHON_TRACEBACK_TIMESTAMPS = "us" )
47+ stderr = result .err .decode ()
48+ self .assertIn ("<@" , stderr ) # Timestamp should be present
49+
50+ def test_traceback_timestamps_flag_us (self ):
51+ """Test -X traceback_timestamps=us flag"""
52+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=us" , self .script_path )
53+ stderr = result .err .decode ()
54+ self .assertIn ("<@" , stderr ) # Timestamp should be present
55+
56+ def test_traceback_timestamps_flag_ns (self ):
57+ """Test -X traceback_timestamps=ns flag"""
58+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=ns" , self .script_path )
59+ stderr = result .err .decode ()
60+ self .assertIn ("<@" , stderr ) # Timestamp should be present
61+ self .assertIn ("ns>" , stderr ) # Should have ns format
62+
63+ def test_traceback_timestamps_flag_iso (self ):
64+ """Test -X traceback_timestamps=iso flag"""
65+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=iso" , self .script_path )
66+ stderr = result .err .decode ()
67+ self .assertIn ("<@" , stderr ) # Timestamp should be present
68+ self .assertRegex (stderr , r"<@\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}" ) # ISO format
69+
70+ def test_traceback_timestamps_flag_value (self ):
71+ """Test that sys.flags.traceback_timestamps shows the right value"""
72+ # Default should be empty string
73+ result = script_helper .assert_python_ok (self .flags_script_path )
74+ stdout = result .out .decode ().strip ()
75+ self .assertEqual (stdout , "''" )
76+
77+ # With us flag
78+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=us" , self .flags_script_path )
79+ stdout = result .out .decode ().strip ()
80+ self .assertEqual (stdout , "'us'" )
81+
82+ # With ns flag
83+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=ns" , self .flags_script_path )
84+ stdout = result .out .decode ().strip ()
85+ self .assertEqual (stdout , "'ns'" )
86+
87+ # With iso flag
88+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=iso" , self .flags_script_path )
89+ stdout = result .out .decode ().strip ()
90+ self .assertEqual (stdout , "'iso'" )
91+
92+ def test_traceback_timestamps_env_var_precedence (self ):
93+ """Test that -X flag takes precedence over env var"""
94+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=us" ,
95+ "-c" , "import sys; print(repr(sys.flags.traceback_timestamps))" ,
96+ PYTHON_TRACEBACK_TIMESTAMPS = "ns" )
97+ stdout = result .out .decode ().strip ()
98+ self .assertEqual (stdout , "'us'" )
99+
100+ def test_traceback_timestamps_flag_no_value (self ):
101+ """Test -X traceback_timestamps with no value defaults to 'us'"""
102+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps" , self .flags_script_path )
103+ stdout = result .out .decode ().strip ()
104+ self .assertEqual (stdout , "'us'" )
105+
106+ def test_traceback_timestamps_flag_zero (self ):
107+ """Test -X traceback_timestamps=0 disables the feature"""
108+ # Check that setting to 0 results in empty string in sys.flags
109+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=0" , self .flags_script_path )
110+ stdout = result .out .decode ().strip ()
111+ self .assertEqual (stdout , "''" )
112+
113+ # Check that no timestamps appear in traceback
114+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=0" , self .script_path )
115+ stderr = result .err .decode ()
116+ self .assertNotIn ("<@" , stderr ) # No timestamp should be present
117+
118+ def test_traceback_timestamps_flag_one (self ):
119+ """Test -X traceback_timestamps=1 is equivalent to 'us'"""
120+ result = script_helper .assert_python_ok ("-X" , "traceback_timestamps=1" , self .flags_script_path )
121+ stdout = result .out .decode ().strip ()
122+ self .assertEqual (stdout , "'us'" )
123+
124+ def test_traceback_timestamps_env_var_zero (self ):
125+ """Test PYTHON_TRACEBACK_TIMESTAMPS=0 disables the feature"""
126+ result = script_helper .assert_python_ok (self .flags_script_path , PYTHON_TRACEBACK_TIMESTAMPS = "0" )
127+ stdout = result .out .decode ().strip ()
128+ self .assertEqual (stdout , "''" )
129+
130+ def test_traceback_timestamps_env_var_one (self ):
131+ """Test PYTHON_TRACEBACK_TIMESTAMPS=1 is equivalent to 'us'"""
132+ result = script_helper .assert_python_ok (self .flags_script_path , PYTHON_TRACEBACK_TIMESTAMPS = "1" )
133+ stdout = result .out .decode ().strip ()
134+ self .assertEqual (stdout , "'us'" )
135+
136+ def test_traceback_timestamps_invalid_env_var (self ):
137+ """Test that invalid env var values are silently ignored"""
138+ result = script_helper .assert_python_ok (self .flags_script_path , PYTHON_TRACEBACK_TIMESTAMPS = "invalid" )
139+ stdout = result .out .decode ().strip ()
140+ self .assertEqual (stdout , "''" ) # Should default to empty string
141+
142+ def test_traceback_timestamps_invalid_flag (self ):
143+ """Test that invalid flag values cause an error"""
144+ result = script_helper .assert_python_failure ("-X" , "traceback_timestamps=invalid" , self .flags_script_path )
145+ stderr = result .err .decode ()
146+ self .assertIn ("Invalid value for -X traceback_timestamps option" , stderr )
147+
148+
149+ if __name__ == "__main__" :
150+ unittest .main ()
0 commit comments