test_cfgparser.py 7.8 KB
Newer Older
1 2 3
import ConfigParser
import StringIO

4
from test_support import TestFailed, verify
5 6


7 8 9 10 11 12 13
def basic(src):
    print "Testing basic accessors..."
    cf = ConfigParser.ConfigParser()
    sio = StringIO.StringIO(src)
    cf.readfp(sio)
    L = cf.sections()
    L.sort()
14 15 16
    verify(L == [r'Commented Bar',
                 r'Foo Bar',
                 r'Internationalized Stuff',
17
                 r'Long Line',
18 19 20
                 r'Section\with$weird%characters[' '\t',
                 r'Spacey Bar',
                 ],
21
           "unexpected list of section names")
22 23 24 25

    # The use of spaces in the section names serves as a regression test for
    # SourceForge bug #115357.
    # http://sourceforge.net/bugs/?func=detailbug&group_id=5470&bug_id=115357
26 27 28
    verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar')
    verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar')
    verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar')
29

30 31
    verify('__name__' not in cf.options("Foo Bar"),
           '__name__ "option" should not be exposed by the API!')
32

33 34
    # Make sure the right things happen for remove_option();
    # added to include check for SourceForge bug #123324:
35 36 37 38 39 40 41
    verify(cf.remove_option('Foo Bar', 'foo'),
           "remove_option() failed to report existance of option")
    verify(not cf.has_option('Foo Bar', 'foo'),
           "remove_option() failed to remove option")
    verify(not cf.remove_option('Foo Bar', 'foo'),
           "remove_option() failed to report non-existance of option"
           " that was removed")
42 43 44 45 46 47 48 49 50
    try:
        cf.remove_option('No Such Section', 'foo')
    except ConfigParser.NoSectionError:
        pass
    else:
        raise TestFailed(
            "remove_option() failed to report non-existance of option"
            " that never existed")

51 52
    verify(cf.get('Long Line', 'foo', raw=1) ==
           'this line is much, much longer than my editor\nlikes it.')
53

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

def write(src):
    print "Testing writing of files..."
    cf = ConfigParser.ConfigParser()
    sio = StringIO.StringIO(src)
    cf.readfp(sio)
    output = StringIO.StringIO()
    cf.write(output)
    verify(output, """[DEFAULT]
foo = another very
        long line

[Long Line]
foo = this line is much, much longer than my editor
        likes it.
""")
Tim Peters's avatar
Tim Peters committed
70

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
def case_sensitivity():
    print "Testing case sensitivity..."
    cf = ConfigParser.ConfigParser()
    cf.add_section("A")
    cf.add_section("a")
    L = cf.sections()
    L.sort()
    verify(L == ["A", "a"])
    cf.set("a", "B", "value")
    verify(cf.options("a") == ["b"])
    verify(cf.get("a", "b", raw=1) == "value",
           "could not locate option, expecting case-insensitive option names")
    verify(cf.has_option("a", "b"))
    cf.set("A", "A-B", "A-B value")
    for opt in ("a-b", "A-b", "a-B", "A-B"):
        verify(cf.has_option("A", opt),
               "has_option() returned false for option which should exist")
    verify(cf.options("A") == ["a-b"])
    verify(cf.options("a") == ["b"])
    cf.remove_option("a", "B")
    verify(cf.options("a") == [])

93 94 95 96 97 98 99
    # SF bug #432369:
    cf = ConfigParser.ConfigParser()
    sio = StringIO.StringIO("[MySection]\nOption: first line\n\tsecond line\n")
    cf.readfp(sio)
    verify(cf.options("MySection") == ["option"])
    verify(cf.get("MySection", "Option") == "first line\nsecond line")

100

101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
def boolean(src):
    print "Testing interpretation of boolean Values..."
    cf = ConfigParser.ConfigParser()
    sio = StringIO.StringIO(src)
    cf.readfp(sio)
    for x in range(1, 5):
        verify(cf.getboolean('BOOLTEST', 't%d' % (x)) == 1)
    for x in range(1, 5):
        verify(cf.getboolean('BOOLTEST', 'f%d' % (x)) == 0)
    for x in range(1, 5):
        try:
            cf.getboolean('BOOLTEST', 'e%d' % (x))
        except ValueError:
            pass
        else:
            raise TestFailed(
                "getboolean() failed to report a non boolean value")


120 121 122 123 124
def interpolation(src):
    print "Testing value interpolation..."
    cf = ConfigParser.ConfigParser({"getname": "%(__name__)s"})
    sio = StringIO.StringIO(src)
    cf.readfp(sio)
125 126 127 128 129 130
    verify(cf.get("Foo", "getname") == "Foo")
    verify(cf.get("Foo", "bar") == "something with interpolation (1 step)")
    verify(cf.get("Foo", "bar9")
           == "something with lots of interpolation (9 steps)")
    verify(cf.get("Foo", "bar10")
           == "something with lots of interpolation (10 steps)")
131 132
    expect_get_error(cf, ConfigParser.InterpolationDepthError, "Foo", "bar11")

133

134
def parse_errors():
135
    print "Testing parse errors..."
136 137 138 139 140 141 142 143 144 145 146 147 148
    expect_parse_error(ConfigParser.ParsingError,
                       """[Foo]\n  extra-spaces: splat\n""")
    expect_parse_error(ConfigParser.ParsingError,
                       """[Foo]\n  extra-spaces= splat\n""")
    expect_parse_error(ConfigParser.ParsingError,
                       """[Foo]\noption-without-value\n""")
    expect_parse_error(ConfigParser.ParsingError,
                       """[Foo]\n:value-without-option-name\n""")
    expect_parse_error(ConfigParser.ParsingError,
                       """[Foo]\n=value-without-option-name\n""")
    expect_parse_error(ConfigParser.MissingSectionHeaderError,
                       """No Section!\n""")

149

150 151 152
def query_errors():
    print "Testing query interface..."
    cf = ConfigParser.ConfigParser()
153 154 155 156
    verify(cf.sections() == [],
           "new ConfigParser should have no defined sections")
    verify(not cf.has_section("Foo"),
           "new ConfigParser should have no acknowledged sections")
157 158 159
    try:
        cf.options("Foo")
    except ConfigParser.NoSectionError, e:
160
        pass
161
    else:
162 163
        raise TestFailed(
            "Failed to catch expected NoSectionError from options()")
164 165 166
    try:
        cf.set("foo", "bar", "value")
    except ConfigParser.NoSectionError, e:
167
        pass
168
    else:
169
        raise TestFailed("Failed to catch expected NoSectionError from set()")
170 171 172 173
    expect_get_error(cf, ConfigParser.NoSectionError, "foo", "bar")
    cf.add_section("foo")
    expect_get_error(cf, ConfigParser.NoOptionError, "foo", "bar")

174

175 176 177 178 179 180 181
def weird_errors():
    print "Testing miscellaneous error conditions..."
    cf = ConfigParser.ConfigParser()
    cf.add_section("Foo")
    try:
        cf.add_section("Foo")
    except ConfigParser.DuplicateSectionError, e:
182
        pass
183
    else:
184 185
        raise TestFailed("Failed to catch expected DuplicateSectionError")

186 187 188 189 190

def expect_get_error(cf, exctype, section, option, raw=0):
    try:
        cf.get(section, option, raw=raw)
    except exctype, e:
191
        pass
192
    else:
193 194
        raise TestFailed("Failed to catch expected " + exctype.__name__)

195 196 197 198 199 200 201

def expect_parse_error(exctype, src):
    cf = ConfigParser.ConfigParser()
    sio = StringIO.StringIO(src)
    try:
        cf.readfp(sio)
    except exctype, e:
202
        pass
203
    else:
204 205
        raise TestFailed("Failed to catch expected " + exctype.__name__)

206 207 208 209 210

basic(r"""
[Foo Bar]
foo=bar
[Spacey Bar]
211
foo = bar
212 213
[Commented Bar]
foo: bar ; comment
214 215 216
[Long Line]
foo: this line is much, much longer than my editor
   likes it.
217
[Section\with$weird%characters[""" '\t' r"""]
218 219 220 221 222
[Internationalized Stuff]
foo[bg]: Bulgarian
foo=Default
foo[en]=English
foo[de]=Deutsch
223
""")
224 225 226 227 228 229
write("""[Long Line]
foo: this line is much, much longer than my editor
   likes it.
[DEFAULT]
foo: another very
 long line""")
230
case_sensitivity()
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
boolean(r"""
[BOOLTEST]
T1=1
T2=TRUE
T3=True
T4=oN
T5=yes
F1=0
F2=FALSE
F3=False
F4=oFF
F5=nO
E1=2
E2=foo
E3=-1
E4=0.1
E5=FALSE AND MORE
""")
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
interpolation(r"""
[Foo]
bar=something %(with1)s interpolation (1 step)
bar9=something %(with9)s lots of interpolation (9 steps)
bar10=something %(with10)s lots of interpolation (10 steps)
bar11=something %(with11)s lots of interpolation (11 steps)
with11=%(with10)s
with10=%(with9)s
with9=%(with8)s
with8=%(with7)s
with7=%(with6)s
with6=%(with5)s
with5=%(with4)s
with4=%(with3)s
with3=%(with2)s
with2=%(with1)s
with1=with

[Mutual Recursion]
foo=%(bar)s
bar=%(foo)s
""")
parse_errors()
query_errors()
weird_errors()