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:
Max Romanov
2021-03-24 11:43:41 +03:00
parent f267dd0a8d
commit 178f232b3a
3 changed files with 33 additions and 9 deletions

View File

@@ -30,7 +30,8 @@ class TestASGIWebsockets(TestApplicationPython):
self.check_close(sock) self.check_close(sock)
def check_close(self, sock, code=1000, no_close=False): def check_close(self, sock, code=1000, no_close=False, frame=None):
if frame == None:
frame = self.ws.frame_read(sock) frame = self.ws.frame_read(sock)
assert frame['fin'] == True, 'close fin' assert frame['fin'] == True, 'close fin'
@@ -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, 'fragment2', fin=True)
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 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.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 # 5_16

View File

@@ -27,7 +27,8 @@ class TestJavaWebsockets(TestApplicationJava):
self.check_close(sock) self.check_close(sock)
def check_close(self, sock, code=1000, no_close=False): def check_close(self, sock, code=1000, no_close=False, frame=None):
if frame == None:
frame = self.ws.frame_read(sock) frame = self.ws.frame_read(sock)
assert frame['fin'] == True, 'close fin' assert frame['fin'] == True, 'close fin'
@@ -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, 'fragment2', fin=True)
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 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.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 # 5_16

View File

@@ -27,7 +27,8 @@ class TestNodeWebsockets(TestApplicationNode):
self.check_close(sock) self.check_close(sock)
def check_close(self, sock, code=1000, no_close=False): def check_close(self, sock, code=1000, no_close=False, frame=None):
if frame == None:
frame = self.ws.frame_read(sock) frame = self.ws.frame_read(sock)
assert frame['fin'] == True, 'close fin' assert frame['fin'] == True, 'close fin'
@@ -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, 'fragment2', fin=True)
self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False) 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.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 # 5_16