Tests: fixed racing condition in websocket test 5_15.
Test case: "send a text message split into two fragments, then a continuation frame with FIN = false where there is nothing to continue, then an unfragmented text message, all sent in one chop". The test case investigates immediate connection closing since there is no message to continue. The mirror server may send a response for the first frame before the test сontinuation frame is received by the router. In this case, the test will receive a text frame before the close frame.
This commit is contained in:
@@ -30,8 +30,9 @@ class TestASGIWebsockets(TestApplicationPython):
|
||||
|
||||
self.check_close(sock)
|
||||
|
||||
def check_close(self, sock, code=1000, no_close=False):
|
||||
frame = self.ws.frame_read(sock)
|
||||
def check_close(self, sock, code=1000, no_close=False, frame=None):
|
||||
if frame == None:
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
assert frame['fin'] == True, 'close fin'
|
||||
assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode'
|
||||
@@ -930,7 +931,14 @@ class TestASGIWebsockets(TestApplicationPython):
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
|
||||
self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
|
||||
self.check_close(sock, 1002)
|
||||
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
if frame['opcode'] == self.ws.OP_TEXT:
|
||||
self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
|
||||
frame = None
|
||||
|
||||
self.check_close(sock, 1002, frame=frame)
|
||||
|
||||
# 5_16
|
||||
|
||||
|
||||
@@ -27,8 +27,9 @@ class TestJavaWebsockets(TestApplicationJava):
|
||||
|
||||
self.check_close(sock)
|
||||
|
||||
def check_close(self, sock, code=1000, no_close=False):
|
||||
frame = self.ws.frame_read(sock)
|
||||
def check_close(self, sock, code=1000, no_close=False, frame=None):
|
||||
if frame == None:
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
assert frame['fin'] == True, 'close fin'
|
||||
assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode'
|
||||
@@ -862,7 +863,14 @@ class TestJavaWebsockets(TestApplicationJava):
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
|
||||
self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
|
||||
self.check_close(sock, 1002)
|
||||
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
if frame['opcode'] == self.ws.OP_TEXT:
|
||||
self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
|
||||
frame = None
|
||||
|
||||
self.check_close(sock, 1002, frame=frame)
|
||||
|
||||
# 5_16
|
||||
|
||||
|
||||
@@ -27,8 +27,9 @@ class TestNodeWebsockets(TestApplicationNode):
|
||||
|
||||
self.check_close(sock)
|
||||
|
||||
def check_close(self, sock, code=1000, no_close=False):
|
||||
frame = self.ws.frame_read(sock)
|
||||
def check_close(self, sock, code=1000, no_close=False, frame=None):
|
||||
if frame == None:
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
assert frame['fin'] == True, 'close fin'
|
||||
assert frame['opcode'] == self.ws.OP_CLOSE, 'close opcode'
|
||||
@@ -881,7 +882,14 @@ class TestNodeWebsockets(TestApplicationNode):
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
|
||||
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
|
||||
self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
|
||||
self.check_close(sock, 1002)
|
||||
|
||||
frame = self.ws.frame_read(sock)
|
||||
|
||||
if frame['opcode'] == self.ws.OP_TEXT:
|
||||
self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
|
||||
frame = None
|
||||
|
||||
self.check_close(sock, 1002, frame=frame)
|
||||
|
||||
# 5_16
|
||||
|
||||
|
||||
Reference in New Issue
Block a user