@@ -507,14 +507,14 @@ def test_sys_flags_set(self):
507507 with self .subTest (envar_value = value ):
508508 assert_python_ok ('-c' , code , ** env_vars )
509509
510- def run_xdev (self , code , check_exitcode = True ):
510+ def run_xdev (self , * args , check_exitcode = True ):
511511 env = dict (os .environ )
512512 env .pop ('PYTHONWARNINGS' , None )
513513 # Force malloc() to disable the debug hooks which are enabled
514514 # by default for Python compiled in debug mode
515515 env ['PYTHONMALLOC' ] = 'malloc'
516516
517- args = (sys .executable , '-X' , 'dev' , '-c' , code )
517+ args = (sys .executable , '-X' , 'dev' , * args )
518518 proc = subprocess .run (args ,
519519 stdout = subprocess .PIPE ,
520520 stderr = subprocess .STDOUT ,
@@ -525,8 +525,34 @@ def run_xdev(self, code, check_exitcode=True):
525525 return proc .stdout .rstrip ()
526526
527527 def test_xdev (self ):
528- out = self .run_xdev ("import sys; print(sys.warnoptions)" )
529- self .assertEqual (out , "['default']" )
528+ code = ("import sys, warnings; "
529+ "print(' '.join('%s::%s' % (f[0], f[2].__name__) "
530+ "for f in warnings.filters))" )
531+
532+ out = self .run_xdev ("-c" , code )
533+ self .assertEqual (out ,
534+ "ignore::BytesWarning "
535+ "always::ResourceWarning "
536+ "default::Warning" )
537+
538+ out = self .run_xdev ("-b" , "-c" , code )
539+ self .assertEqual (out ,
540+ "default::BytesWarning "
541+ "always::ResourceWarning "
542+ "default::Warning" )
543+
544+ out = self .run_xdev ("-bb" , "-c" , code )
545+ self .assertEqual (out ,
546+ "error::BytesWarning "
547+ "always::ResourceWarning "
548+ "default::Warning" )
549+
550+ out = self .run_xdev ("-Werror" , "-c" , code )
551+ self .assertEqual (out ,
552+ "error::Warning "
553+ "ignore::BytesWarning "
554+ "always::ResourceWarning "
555+ "default::Warning" )
530556
531557 try :
532558 import _testcapi
@@ -535,7 +561,7 @@ def test_xdev(self):
535561 else :
536562 code = "import _testcapi; _testcapi.pymem_api_misuse()"
537563 with support .SuppressCrashReport ():
538- out = self .run_xdev (code , check_exitcode = False )
564+ out = self .run_xdev ("-c" , code , check_exitcode = False )
539565 self .assertIn ("Debug memory block at address p=" , out )
540566
541567 try :
@@ -544,9 +570,23 @@ def test_xdev(self):
544570 pass
545571 else :
546572 code = "import faulthandler; print(faulthandler.is_enabled())"
547- out = self .run_xdev (code )
573+ out = self .run_xdev ("-c" , code )
548574 self .assertEqual (out , "True" )
549575
576+ # Make sure that ResourceWarning emitted twice at the same line number
577+ # is logged twice
578+ filename = support .TESTFN
579+ self .addCleanup (support .unlink , filename )
580+ with open (filename , "w" , encoding = "utf8" ) as fp :
581+ print ("def func(): open(__file__)" , file = fp )
582+ print ("func()" , file = fp )
583+ print ("func()" , file = fp )
584+ fp .flush ()
585+
586+ out = self .run_xdev (filename )
587+ self .assertEqual (out .count (':1: ResourceWarning: ' ), 2 , out )
588+
589+
550590class IgnoreEnvironmentTest (unittest .TestCase ):
551591
552592 def run_ignoring_vars (self , predicate , ** env_vars ):
0 commit comments