forked from Lawouach/WebSocket-for-Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_frame.py
More file actions
155 lines (125 loc) · 5.3 KB
/
Copy pathtest_frame.py
File metadata and controls
155 lines (125 loc) · 5.3 KB
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
# -*- coding: utf-8 -*-
import os
import unittest
import types
import random
from ws4py.framing import Frame, \
OPCODE_CONTINUATION, OPCODE_TEXT, \
OPCODE_BINARY, OPCODE_CLOSE, OPCODE_PING, OPCODE_PONG
from ws4py.compat import *
def map_on_bytes(f, bytes):
for index, byte in enumerate(bytes):
f(bytes[index:index+1])
class WSFrameBuilderTest(unittest.TestCase):
def test_7_bit_length(self):
f = Frame(opcode=OPCODE_TEXT,
body=enc(''), fin=1)
self.assertEqual(len(f.build()), 2)
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 125), fin=1)
self.assertEqual(len(f.build()), 127)
mask = os.urandom(4)
f = Frame(opcode=OPCODE_TEXT,
body=enc(''), masking_key=mask, fin=1)
self.assertEqual(len(f.build()), 6)
f = Frame(opcode=OPCODE_TEXT,
body='*' * 125, masking_key=mask, fin=1)
self.assertEqual(len(f.build()), 131)
def test_16_bit_length(self):
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 126), fin=1)
self.assertEqual(len(f.build()), 130)
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 65535), fin=1)
self.assertEqual(len(f.build()), 65539)
mask = os.urandom(4)
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 126), masking_key=mask, fin=1)
self.assertEqual(len(f.build()), 134)
f = Frame(opcode=OPCODE_TEXT,
body='*' * 65535, masking_key=mask, fin=1)
self.assertEqual(len(f.build()), 65543)
def test_63_bit_length(self):
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 65536), fin=1)
self.assertEqual(len(f.build()), 65546)
mask = os.urandom(4)
f = Frame(opcode=OPCODE_TEXT,
body=enc('*' * 65536), masking_key=mask, fin=1)
self.assertEqual(len(f.build()), 65550)
def test_non_zero_nor_one_fin(self):
f = Frame(opcode=OPCODE_TEXT,
body=enc(''), fin=2)
self.assertRaises(ValueError, f.build)
def test_opcodes(self):
for opcode in [OPCODE_CONTINUATION, OPCODE_TEXT,
OPCODE_BINARY, OPCODE_CLOSE,
OPCODE_PING, OPCODE_PONG]:
f = Frame(opcode=opcode, body='', fin=1)
byte = ord(f.build()[0])
self.assertTrue(byte & opcode == opcode)
f = Frame(opcode=0x3, body=enc(''), fin=1)
self.assertRaises(ValueError, f.build)
def test_masking(self):
if py3k: mask = b"7\xfa!="
else: mask = "7\xfa!="
f = Frame(opcode=OPCODE_TEXT,
body=enc('Hello'),
masking_key=mask, fin=1)
if py3k: spec_says = b'\x81\x857\xfa!=\x7f\x9fMQX'
else: spec_says = '\x81\x857\xfa!=\x7f\x9fMQX'
self.assertEqual(f.build(), spec_says)
class WSFrameParserTest(unittest.TestCase):
def test_frame_parser_is_a_generator(self):
f = Frame()
self.assertEqual(type(f.parser), types.GeneratorType)
f.parser.close()
self.assertRaises(StopIteration, next, f.parser)
def test_frame_header_parsing(self):
bytes = Frame(opcode=OPCODE_TEXT, body=enc('hello'), fin=1).build()
f = Frame()
self.assertEqual(f.parser.send(bytes[0:1]), 1)
self.assertEqual(f.fin, 1)
self.assertEqual(f.rsv1, 0)
self.assertEqual(f.rsv2, 0)
self.assertEqual(f.rsv3, 0)
self.assertEqual(f.parser.send(bytes[1:2]), 5)
self.assertTrue(f.masking_key is None)
self.assertEqual(f.payload_length, 5)
f.parser.close()
def test_frame_payload_parsing(self):
bytes = Frame(opcode=OPCODE_TEXT, body='hello', fin=1).build()
f = Frame()
self.assertEqual(f.parser.send(bytes[0:1]), 1)
self.assertEqual(f.parser.send(bytes[1:2]), 5)
f.parser.send(bytes[2:])
self.assertEqual(f.body, enc('hello'))
f = Frame()
f.parser.send(bytes)
self.assertRaises(StopIteration, next, f.parser)
self.assertEqual(f.body, enc('hello'))
def test_incremental_parsing_small_7_bit_length(self):
bytes = Frame(opcode=OPCODE_TEXT, body=enc('hello'), fin=1).build()
f = Frame()
map_on_bytes(f.parser.send, bytes)
self.assertTrue(f.masking_key is None)
self.assertEqual(f.payload_length, 5)
def test_incremental_parsing_16_bit_length(self):
bytes = Frame(opcode=OPCODE_TEXT, body=enc('*' * 126), fin=1).build()
f = Frame()
map_on_bytes(f.parser.send, bytes)
self.assertTrue(f.masking_key is None)
self.assertEqual(f.payload_length, 126)
def test_incremental_parsing_63_bit_length(self):
bytes = Frame(opcode=OPCODE_TEXT, body=enc('*' * 65536), fin=1).build()
f = Frame()
map_on_bytes(f.parser.send, bytes)
self.assertTrue(f.masking_key is None)
self.assertEqual(f.payload_length, 65536)
if __name__ == '__main__':
suite = unittest.TestSuite()
loader = unittest.TestLoader()
for testcase in (WSFrameBuilderTest, WSFrameParserTest,):
tests = loader.loadTestsFromTestCase(testcase)
suite.addTests(tests)
unittest.TextTestRunner(verbosity=2).run(suite)