@@ -1474,6 +1474,150 @@ def test_sectionproxy_repr(self):
14741474 """ )
14751475 self .assertEqual (repr (parser ['section' ]), '<Section: section>' )
14761476
1477+
1478+ class ExceptionPicklingTestCase (unittest .TestCase ):
1479+ """Tests for issue #13760: ConfigParser exceptions are not picklable."""
1480+
1481+ def test_error (self ):
1482+ import pickle
1483+ e1 = configparser .Error ('value' )
1484+ pickled = pickle .dumps (e1 )
1485+ e2 = pickle .loads (pickled )
1486+ self .assertEqual (e1 .message , e2 .message )
1487+ self .assertEqual (repr (e1 ), repr (e2 ))
1488+
1489+ def test_nosectionerror (self ):
1490+ import pickle
1491+ e1 = configparser .NoSectionError ('section' )
1492+ pickled = pickle .dumps (e1 )
1493+ e2 = pickle .loads (pickled )
1494+ self .assertEqual (e1 .message , e2 .message )
1495+ self .assertEqual (e1 .args , e2 .args )
1496+ self .assertEqual (e1 .section , e2 .section )
1497+ self .assertEqual (repr (e1 ), repr (e2 ))
1498+
1499+ def test_nooptionerror (self ):
1500+ import pickle
1501+ e1 = configparser .NoOptionError ('option' , 'section' )
1502+ pickled = pickle .dumps (e1 )
1503+ e2 = pickle .loads (pickled )
1504+ self .assertEqual (e1 .message , e2 .message )
1505+ self .assertEqual (e1 .args , e2 .args )
1506+ self .assertEqual (e1 .section , e2 .section )
1507+ self .assertEqual (e1 .option , e2 .option )
1508+ self .assertEqual (repr (e1 ), repr (e2 ))
1509+
1510+ def test_duplicatesectionerror (self ):
1511+ import pickle
1512+ e1 = configparser .DuplicateSectionError ('section' , 'source' , 123 )
1513+ pickled = pickle .dumps (e1 )
1514+ e2 = pickle .loads (pickled )
1515+ self .assertEqual (e1 .message , e2 .message )
1516+ self .assertEqual (e1 .args , e2 .args )
1517+ self .assertEqual (e1 .section , e2 .section )
1518+ self .assertEqual (e1 .source , e2 .source )
1519+ self .assertEqual (e1 .lineno , e2 .lineno )
1520+ self .assertEqual (repr (e1 ), repr (e2 ))
1521+
1522+ def test_duplicateoptionerror (self ):
1523+ import pickle
1524+ e1 = configparser .DuplicateOptionError ('section' , 'option' , 'source' ,
1525+ 123 )
1526+ pickled = pickle .dumps (e1 )
1527+ e2 = pickle .loads (pickled )
1528+ self .assertEqual (e1 .message , e2 .message )
1529+ self .assertEqual (e1 .args , e2 .args )
1530+ self .assertEqual (e1 .section , e2 .section )
1531+ self .assertEqual (e1 .option , e2 .option )
1532+ self .assertEqual (e1 .source , e2 .source )
1533+ self .assertEqual (e1 .lineno , e2 .lineno )
1534+ self .assertEqual (repr (e1 ), repr (e2 ))
1535+
1536+ def test_interpolationerror (self ):
1537+ import pickle
1538+ e1 = configparser .InterpolationError ('option' , 'section' , 'msg' )
1539+ pickled = pickle .dumps (e1 )
1540+ e2 = pickle .loads (pickled )
1541+ self .assertEqual (e1 .message , e2 .message )
1542+ self .assertEqual (e1 .args , e2 .args )
1543+ self .assertEqual (e1 .section , e2 .section )
1544+ self .assertEqual (e1 .option , e2 .option )
1545+ self .assertEqual (repr (e1 ), repr (e2 ))
1546+
1547+ def test_interpolationmissingoptionerror (self ):
1548+ import pickle
1549+ e1 = configparser .InterpolationMissingOptionError ('option' , 'section' ,
1550+ 'rawval' , 'reference' )
1551+ pickled = pickle .dumps (e1 )
1552+ e2 = pickle .loads (pickled )
1553+ self .assertEqual (e1 .message , e2 .message )
1554+ self .assertEqual (e1 .args , e2 .args )
1555+ self .assertEqual (e1 .section , e2 .section )
1556+ self .assertEqual (e1 .option , e2 .option )
1557+ self .assertEqual (e1 .reference , e2 .reference )
1558+ self .assertEqual (repr (e1 ), repr (e2 ))
1559+
1560+ def test_interpolationsyntaxerror (self ):
1561+ import pickle
1562+ e1 = configparser .InterpolationSyntaxError ('option' , 'section' , 'msg' )
1563+ pickled = pickle .dumps (e1 )
1564+ e2 = pickle .loads (pickled )
1565+ self .assertEqual (e1 .message , e2 .message )
1566+ self .assertEqual (e1 .args , e2 .args )
1567+ self .assertEqual (e1 .section , e2 .section )
1568+ self .assertEqual (e1 .option , e2 .option )
1569+ self .assertEqual (repr (e1 ), repr (e2 ))
1570+
1571+ def test_interpolationdeptherror (self ):
1572+ import pickle
1573+ e1 = configparser .InterpolationDepthError ('option' , 'section' ,
1574+ 'rawval' )
1575+ pickled = pickle .dumps (e1 )
1576+ e2 = pickle .loads (pickled )
1577+ self .assertEqual (e1 .message , e2 .message )
1578+ self .assertEqual (e1 .args , e2 .args )
1579+ self .assertEqual (e1 .section , e2 .section )
1580+ self .assertEqual (e1 .option , e2 .option )
1581+ self .assertEqual (repr (e1 ), repr (e2 ))
1582+
1583+ def test_parsingerror (self ):
1584+ import pickle
1585+ e1 = configparser .ParsingError ('source' )
1586+ e1 .append (1 , 'line1' )
1587+ e1 .append (2 , 'line2' )
1588+ e1 .append (3 , 'line3' )
1589+ pickled = pickle .dumps (e1 )
1590+ e2 = pickle .loads (pickled )
1591+ self .assertEqual (e1 .message , e2 .message )
1592+ self .assertEqual (e1 .args , e2 .args )
1593+ self .assertEqual (e1 .source , e2 .source )
1594+ self .assertEqual (e1 .errors , e2 .errors )
1595+ self .assertEqual (repr (e1 ), repr (e2 ))
1596+ e1 = configparser .ParsingError (filename = 'filename' )
1597+ e1 .append (1 , 'line1' )
1598+ e1 .append (2 , 'line2' )
1599+ e1 .append (3 , 'line3' )
1600+ pickled = pickle .dumps (e1 )
1601+ e2 = pickle .loads (pickled )
1602+ self .assertEqual (e1 .message , e2 .message )
1603+ self .assertEqual (e1 .args , e2 .args )
1604+ self .assertEqual (e1 .source , e2 .source )
1605+ self .assertEqual (e1 .errors , e2 .errors )
1606+ self .assertEqual (repr (e1 ), repr (e2 ))
1607+
1608+ def test_missingsectionheadererror (self ):
1609+ import pickle
1610+ e1 = configparser .MissingSectionHeaderError ('filename' , 123 , 'line' )
1611+ pickled = pickle .dumps (e1 )
1612+ e2 = pickle .loads (pickled )
1613+ self .assertEqual (e1 .message , e2 .message )
1614+ self .assertEqual (e1 .args , e2 .args )
1615+ self .assertEqual (e1 .line , e2 .line )
1616+ self .assertEqual (e1 .source , e2 .source )
1617+ self .assertEqual (e1 .lineno , e2 .lineno )
1618+ self .assertEqual (repr (e1 ), repr (e2 ))
1619+
1620+
14771621def test_main ():
14781622 support .run_unittest (
14791623 ConfigParserTestCase ,
@@ -1495,4 +1639,5 @@ def test_main():
14951639 ConfigParserTestCaseNonStandardDefaultSection ,
14961640 ReadFileTestCase ,
14971641 CoverageOneHundredTestCase ,
1642+ ExceptionPicklingTestCase ,
14981643 )
0 commit comments