aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/web/test/test_http_headers.py
blob: 7ca1bc82669cea6ac09ed5e148bfd70316987666 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

"""
Tests for L{twisted.web.http_headers}.
"""

import sys

from twisted.python.compat import set
from twisted.trial.unittest import TestCase
from twisted.web.http_headers import _DictHeaders, Headers


class HeadersTests(TestCase):
    """
    Tests for L{Headers}.
    """
    def test_initializer(self):
        """
        The header values passed to L{Headers.__init__} can be retrieved via
        L{Headers.getRawHeaders}.
        """
        h = Headers({'Foo': ['bar']})
        self.assertEqual(h.getRawHeaders('foo'), ['bar'])


    def test_setRawHeaders(self):
        """
        L{Headers.setRawHeaders} sets the header values for the given
        header name to the sequence of string values.
        """
        rawValue = ["value1", "value2"]
        h = Headers()
        h.setRawHeaders("test", rawValue)
        self.assertTrue(h.hasHeader("test"))
        self.assertTrue(h.hasHeader("Test"))
        self.assertEqual(h.getRawHeaders("test"), rawValue)


    def test_rawHeadersTypeChecking(self):
        """
        L{Headers.setRawHeaders} requires values to be of type list.
        """
        h = Headers()
        self.assertRaises(TypeError, h.setRawHeaders, {'Foo': 'bar'})


    def test_addRawHeader(self):
        """
        L{Headers.addRawHeader} adds a new value for a given header.
        """
        h = Headers()
        h.addRawHeader("test", "lemur")
        self.assertEqual(h.getRawHeaders("test"), ["lemur"])
        h.addRawHeader("test", "panda")
        self.assertEqual(h.getRawHeaders("test"), ["lemur", "panda"])


    def test_getRawHeadersNoDefault(self):
        """
        L{Headers.getRawHeaders} returns C{None} if the header is not found and
        no default is specified.
        """
        self.assertIdentical(Headers().getRawHeaders("test"), None)


    def test_getRawHeadersDefaultValue(self):
        """
        L{Headers.getRawHeaders} returns the specified default value when no
        header is found.
        """
        h = Headers()
        default = object()
        self.assertIdentical(h.getRawHeaders("test", default), default)


    def test_getRawHeaders(self):
        """
        L{Headers.getRawHeaders} returns the values which have been set for a
        given header.
        """
        h = Headers()
        h.setRawHeaders("test", ["lemur"])
        self.assertEqual(h.getRawHeaders("test"), ["lemur"])
        self.assertEqual(h.getRawHeaders("Test"), ["lemur"])


    def test_hasHeaderTrue(self):
        """
        Check that L{Headers.hasHeader} returns C{True} when the given header
        is found.
        """
        h = Headers()
        h.setRawHeaders("test", ["lemur"])
        self.assertTrue(h.hasHeader("test"))
        self.assertTrue(h.hasHeader("Test"))


    def test_hasHeaderFalse(self):
        """
        L{Headers.hasHeader} returns C{False} when the given header is not
        found.
        """
        self.assertFalse(Headers().hasHeader("test"))


    def test_removeHeader(self):
        """
        Check that L{Headers.removeHeader} removes the given header.
        """
        h = Headers()

        h.setRawHeaders("foo", ["lemur"])
        self.assertTrue(h.hasHeader("foo"))
        h.removeHeader("foo")
        self.assertFalse(h.hasHeader("foo"))

        h.setRawHeaders("bar", ["panda"])
        self.assertTrue(h.hasHeader("bar"))
        h.removeHeader("Bar")
        self.assertFalse(h.hasHeader("bar"))


    def test_removeHeaderDoesntExist(self):
        """
        L{Headers.removeHeader} is a no-operation when the specified header is
        not found.
        """
        h = Headers()
        h.removeHeader("test")
        self.assertEqual(list(h.getAllRawHeaders()), [])


    def test_canonicalNameCaps(self):
        """
        L{Headers._canonicalNameCaps} returns the canonical capitalization for
        the given header.
        """
        h = Headers()
        self.assertEqual(h._canonicalNameCaps("test"), "Test")
        self.assertEqual(h._canonicalNameCaps("test-stuff"), "Test-Stuff")
        self.assertEqual(h._canonicalNameCaps("content-md5"), "Content-MD5")
        self.assertEqual(h._canonicalNameCaps("dnt"), "DNT")
        self.assertEqual(h._canonicalNameCaps("etag"), "ETag")
        self.assertEqual(h._canonicalNameCaps("p3p"), "P3P")
        self.assertEqual(h._canonicalNameCaps("te"), "TE")
        self.assertEqual(h._canonicalNameCaps("www-authenticate"),
                          "WWW-Authenticate")
        self.assertEqual(h._canonicalNameCaps("x-xss-protection"),
                          "X-XSS-Protection")


    def test_getAllRawHeaders(self):
        """
        L{Headers.getAllRawHeaders} returns an iterable of (k, v) pairs, where
        C{k} is the canonicalized representation of the header name, and C{v}
        is a sequence of values.
        """
        h = Headers()
        h.setRawHeaders("test", ["lemurs"])
        h.setRawHeaders("www-authenticate", ["basic aksljdlk="])

        allHeaders = set([(k, tuple(v)) for k, v in h.getAllRawHeaders()])

        self.assertEqual(allHeaders,
                          set([("WWW-Authenticate", ("basic aksljdlk=",)),
                               ("Test", ("lemurs",))]))


    def test_headersComparison(self):
        """
        A L{Headers} instance compares equal to itself and to another
        L{Headers} instance with the same values.
        """
        first = Headers()
        first.setRawHeaders("foo", ["panda"])
        second = Headers()
        second.setRawHeaders("foo", ["panda"])
        third = Headers()
        third.setRawHeaders("foo", ["lemur", "panda"])
        self.assertEqual(first, first)
        self.assertEqual(first, second)
        self.assertNotEqual(first, third)


    def test_otherComparison(self):
        """
        An instance of L{Headers} does not compare equal to other unrelated
        objects.
        """
        h = Headers()
        self.assertNotEqual(h, ())
        self.assertNotEqual(h, object())
        self.assertNotEqual(h, "foo")


    def test_repr(self):
        """
        The L{repr} of a L{Headers} instance shows the names and values of all
        the headers it contains.
        """
        self.assertEqual(
            repr(Headers({"foo": ["bar", "baz"]})),
            "Headers({'foo': ['bar', 'baz']})")


    def test_subclassRepr(self):
        """
        The L{repr} of an instance of a subclass of L{Headers} uses the name
        of the subclass instead of the string C{"Headers"}.
        """
        class FunnyHeaders(Headers):
            pass
        self.assertEqual(
            repr(FunnyHeaders({"foo": ["bar", "baz"]})),
            "FunnyHeaders({'foo': ['bar', 'baz']})")


    def test_copy(self):
        """
        L{Headers.copy} creates a new independant copy of an existing
        L{Headers} instance, allowing future modifications without impacts
        between the copies.
        """
        h = Headers()
        h.setRawHeaders('test', ['foo'])
        i = h.copy()
        self.assertEqual(i.getRawHeaders('test'), ['foo'])
        h.addRawHeader('test', 'bar')
        self.assertEqual(i.getRawHeaders('test'), ['foo'])
        i.addRawHeader('test', 'baz')
        self.assertEqual(h.getRawHeaders('test'), ['foo', 'bar'])



class HeaderDictTests(TestCase):
    """
    Tests for the backwards compatible C{dict} interface for L{Headers}
    provided by L{_DictHeaders}.
    """
    def headers(self, **kw):
        """
        Create a L{Headers} instance populated with the header name/values
        specified by C{kw} and a L{_DictHeaders} wrapped around it and return
        them both.
        """
        h = Headers()
        for k, v in kw.iteritems():
            h.setRawHeaders(k, v)
        return h, _DictHeaders(h)


    def test_getItem(self):
        """
        L{_DictHeaders.__getitem__} returns a single header for the given name.
        """
        headers, wrapper = self.headers(test=["lemur"])
        self.assertEqual(wrapper["test"], "lemur")


    def test_getItemMultiple(self):
        """
        L{_DictHeaders.__getitem__} returns only the last header value for a
        given name.
        """
        headers, wrapper = self.headers(test=["lemur", "panda"])
        self.assertEqual(wrapper["test"], "panda")


    def test_getItemMissing(self):
        """
        L{_DictHeaders.__getitem__} raises L{KeyError} if called with a header
        which is not present.
        """
        headers, wrapper = self.headers()
        exc = self.assertRaises(KeyError, wrapper.__getitem__, "test")
        self.assertEqual(exc.args, ("test",))


    def test_iteration(self):
        """
        L{_DictHeaders.__iter__} returns an iterator the elements of which
        are the lowercase name of each header present.
        """
        headers, wrapper = self.headers(foo=["lemur", "panda"], bar=["baz"])
        self.assertEqual(set(list(wrapper)), set(["foo", "bar"]))


    def test_length(self):
        """
        L{_DictHeaders.__len__} returns the number of headers present.
        """
        headers, wrapper = self.headers()
        self.assertEqual(len(wrapper), 0)
        headers.setRawHeaders("foo", ["bar"])
        self.assertEqual(len(wrapper), 1)
        headers.setRawHeaders("test", ["lemur", "panda"])
        self.assertEqual(len(wrapper), 2)


    def test_setItem(self):
        """
        L{_DictHeaders.__setitem__} sets a single header value for the given
        name.
        """
        headers, wrapper = self.headers()
        wrapper["test"] = "lemur"
        self.assertEqual(headers.getRawHeaders("test"), ["lemur"])


    def test_setItemOverwrites(self):
        """
        L{_DictHeaders.__setitem__} will replace any previous header values for
        the given name.
        """
        headers, wrapper = self.headers(test=["lemur", "panda"])
        wrapper["test"] = "lemur"
        self.assertEqual(headers.getRawHeaders("test"), ["lemur"])


    def test_delItem(self):
        """
        L{_DictHeaders.__delitem__} will remove the header values for the given
        name.
        """
        headers, wrapper = self.headers(test=["lemur"])
        del wrapper["test"]
        self.assertFalse(headers.hasHeader("test"))


    def test_delItemMissing(self):
        """
        L{_DictHeaders.__delitem__} will raise L{KeyError} if the given name is
        not present.
        """
        headers, wrapper = self.headers()
        exc = self.assertRaises(KeyError, wrapper.__delitem__, "test")
        self.assertEqual(exc.args, ("test",))


    def test_keys(self, _method='keys', _requireList=True):
        """
        L{_DictHeaders.keys} will return a list of all present header names.
        """
        headers, wrapper = self.headers(test=["lemur"], foo=["bar"])
        keys = getattr(wrapper, _method)()
        if _requireList:
            self.assertIsInstance(keys, list)
        self.assertEqual(set(keys), set(["foo", "test"]))


    def test_iterkeys(self):
        """
        L{_DictHeaders.iterkeys} will return all present header names.
        """
        self.test_keys('iterkeys', False)


    def test_values(self, _method='values', _requireList=True):
        """
        L{_DictHeaders.values} will return a list of all present header values,
        returning only the last value for headers with more than one.
        """
        headers, wrapper = self.headers(foo=["lemur"], bar=["marmot", "panda"])
        values = getattr(wrapper, _method)()
        if _requireList:
            self.assertIsInstance(values, list)
        self.assertEqual(set(values), set(["lemur", "panda"]))


    def test_itervalues(self):
        """
        L{_DictHeaders.itervalues} will return all present header values,
        returning only the last value for headers with more than one.
        """
        self.test_values('itervalues', False)


    def test_items(self, _method='items', _requireList=True):
        """
        L{_DictHeaders.items} will return a list of all present header names
        and values as tuples, returning only the last value for headers with
        more than one.
        """
        headers, wrapper = self.headers(foo=["lemur"], bar=["marmot", "panda"])
        items = getattr(wrapper, _method)()
        if _requireList:
            self.assertIsInstance(items, list)
        self.assertEqual(set(items), set([("foo", "lemur"), ("bar", "panda")]))


    def test_iteritems(self):
        """
        L{_DictHeaders.iteritems} will return all present header names and
        values as tuples, returning only the last value for headers with more
        than one.
        """
        self.test_items('iteritems', False)


    def test_clear(self):
        """
        L{_DictHeaders.clear} will remove all headers.
        """
        headers, wrapper = self.headers(foo=["lemur"], bar=["panda"])
        wrapper.clear()
        self.assertEqual(list(headers.getAllRawHeaders()), [])


    def test_copy(self):
        """
        L{_DictHeaders.copy} will return a C{dict} with all the same headers
        and the last value for each.
        """
        headers, wrapper = self.headers(foo=["lemur", "panda"], bar=["marmot"])
        duplicate = wrapper.copy()
        self.assertEqual(duplicate, {"foo": "panda", "bar": "marmot"})


    def test_get(self):
        """
        L{_DictHeaders.get} returns the last value for the given header name.
        """
        headers, wrapper = self.headers(foo=["lemur", "panda"])
        self.assertEqual(wrapper.get("foo"), "panda")


    def test_getMissing(self):
        """
        L{_DictHeaders.get} returns C{None} for a header which is not present.
        """
        headers, wrapper = self.headers()
        self.assertIdentical(wrapper.get("foo"), None)


    def test_getDefault(self):
        """
        L{_DictHeaders.get} returns the last value for the given header name
        even when it is invoked with a default value.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        self.assertEqual(wrapper.get("foo", "bar"), "lemur")


    def test_getDefaultMissing(self):
        """
        L{_DictHeaders.get} returns the default value specified if asked for a
        header which is not present.
        """
        headers, wrapper = self.headers()
        self.assertEqual(wrapper.get("foo", "bar"), "bar")


    def test_has_key(self):
        """
        L{_DictHeaders.has_key} returns C{True} if the given header is present,
        C{False} otherwise.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        self.assertTrue(wrapper.has_key("foo"))
        self.assertFalse(wrapper.has_key("bar"))


    def test_contains(self):
        """
        L{_DictHeaders.__contains__} returns C{True} if the given header is
        present, C{False} otherwise.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        self.assertIn("foo", wrapper)
        self.assertNotIn("bar", wrapper)


    def test_pop(self):
        """
        L{_DictHeaders.pop} returns the last header value associated with the
        given header name and removes the header.
        """
        headers, wrapper = self.headers(foo=["lemur", "panda"])
        self.assertEqual(wrapper.pop("foo"), "panda")
        self.assertIdentical(headers.getRawHeaders("foo"), None)


    def test_popMissing(self):
        """
        L{_DictHeaders.pop} raises L{KeyError} if passed a header name which is
        not present.
        """
        headers, wrapper = self.headers()
        self.assertRaises(KeyError, wrapper.pop, "foo")


    def test_popDefault(self):
        """
        L{_DictHeaders.pop} returns the last header value associated with the
        given header name and removes the header, even if it is supplied with a
        default value.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        self.assertEqual(wrapper.pop("foo", "bar"), "lemur")
        self.assertIdentical(headers.getRawHeaders("foo"), None)


    def test_popDefaultMissing(self):
        """
        L{_DictHeaders.pop} returns the default value is asked for a header
        name which is not present.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        self.assertEqual(wrapper.pop("bar", "baz"), "baz")
        self.assertEqual(headers.getRawHeaders("foo"), ["lemur"])


    def test_popitem(self):
        """
        L{_DictHeaders.popitem} returns some header name/value pair.
        """
        headers, wrapper = self.headers(foo=["lemur", "panda"])
        self.assertEqual(wrapper.popitem(), ("foo", "panda"))
        self.assertIdentical(headers.getRawHeaders("foo"), None)


    def test_popitemEmpty(self):
        """
        L{_DictHeaders.popitem} raises L{KeyError} if there are no headers
        present.
        """
        headers, wrapper = self.headers()
        self.assertRaises(KeyError, wrapper.popitem)


    def test_update(self):
        """
        L{_DictHeaders.update} adds the header/value pairs in the C{dict} it is
        passed, overriding any existing values for those headers.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        wrapper.update({"foo": "panda", "bar": "marmot"})
        self.assertEqual(headers.getRawHeaders("foo"), ["panda"])
        self.assertEqual(headers.getRawHeaders("bar"), ["marmot"])


    def test_updateWithKeywords(self):
        """
        L{_DictHeaders.update} adds header names given as keyword arguments
        with the keyword values as the header value.
        """
        headers, wrapper = self.headers(foo=["lemur"])
        wrapper.update(foo="panda", bar="marmot")
        self.assertEqual(headers.getRawHeaders("foo"), ["panda"])
        self.assertEqual(headers.getRawHeaders("bar"), ["marmot"])

    if sys.version_info < (2, 4):
        test_updateWithKeywords.skip = (
            "Python 2.3 does not support keyword arguments to dict.update.")


    def test_setdefaultMissing(self):
        """
        If passed the name of a header which is not present,
        L{_DictHeaders.setdefault} sets the value of the given header to the
        specified default value and returns it.
        """
        headers, wrapper = self.headers(foo=["bar"])
        self.assertEqual(wrapper.setdefault("baz", "quux"), "quux")
        self.assertEqual(headers.getRawHeaders("foo"), ["bar"])
        self.assertEqual(headers.getRawHeaders("baz"), ["quux"])


    def test_setdefaultPresent(self):
        """
        If passed the name of a header which is present,
        L{_DictHeaders.setdefault} makes no changes to the headers and
        returns the last value already associated with that header.
        """
        headers, wrapper = self.headers(foo=["bar", "baz"])
        self.assertEqual(wrapper.setdefault("foo", "quux"), "baz")
        self.assertEqual(headers.getRawHeaders("foo"), ["bar", "baz"])


    def test_setdefaultDefault(self):
        """
        If a value is not passed to L{_DictHeaders.setdefault}, C{None} is
        used.
        """
        # This results in an invalid state for the headers, but maybe some
        # application is doing this an intermediate step towards some other
        # state.  Anyway, it was broken with the old implementation so it's
        # broken with the new implementation.  Compatibility, for the win.
        # -exarkun
        headers, wrapper = self.headers()
        self.assertIdentical(wrapper.setdefault("foo"), None)
        self.assertEqual(headers.getRawHeaders("foo"), [None])


    def test_dictComparison(self):
        """
        An instance of L{_DictHeaders} compares equal to a C{dict} which
        contains the same header/value pairs.  For header names with multiple
        values, the last value only is considered.
        """
        headers, wrapper = self.headers(foo=["lemur"], bar=["panda", "marmot"])
        self.assertNotEqual(wrapper, {"foo": "lemur", "bar": "panda"})
        self.assertEqual(wrapper, {"foo": "lemur", "bar": "marmot"})


    def test_otherComparison(self):
        """
        An instance of L{_DictHeaders} does not compare equal to other
        unrelated objects.
        """
        headers, wrapper = self.headers()
        self.assertNotEqual(wrapper, ())
        self.assertNotEqual(wrapper, object())
        self.assertNotEqual(wrapper, "foo")