| // |
| // ======================================================================== |
| // Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.websocket.server.ab; |
| |
| import java.nio.ByteBuffer; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.List; |
| |
| import org.eclipse.jetty.util.log.Log; |
| import org.eclipse.jetty.util.log.Logger; |
| import org.eclipse.jetty.websocket.api.StatusCode; |
| import org.eclipse.jetty.websocket.common.CloseInfo; |
| import org.eclipse.jetty.websocket.common.WebSocketFrame; |
| import org.eclipse.jetty.websocket.common.frames.TextFrame; |
| import org.eclipse.jetty.websocket.common.test.Fuzzer; |
| import org.eclipse.jetty.websocket.common.util.Hex; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| import org.junit.runners.Parameterized.Parameters; |
| |
| /** |
| * Tests of Known Good UTF8 sequences. |
| * <p> |
| * Should be preserved / echoed back, with normal close code. |
| */ |
| @RunWith(Parameterized.class) |
| public class TestABCase6_GoodUTF extends AbstractABCase |
| { |
| private static final Logger LOG = Log.getLogger(TestABCase6_GoodUTF.class); |
| |
| @Parameters |
| public static Collection<String[]> data() |
| { |
| // The various Good UTF8 sequences as a String (hex form) |
| List<String[]> data = new ArrayList<>(); |
| |
| // @formatter:off |
| // - combination of simple 1 byte characters and unicode code points |
| data.add(new String[]{ "6.2.1", "48656C6C6F2DC2B540C39FC3B6C3A4C3BCC3A0C3A12D5554462D382121" }); |
| // - simple valid UTF8 sequence |
| data.add(new String[]{ "6.5.1", "CEBAE1BDB9CF83CEBCCEB5" }); |
| // - multi-byte code points |
| data.add(new String[]{ "6.6.11", "CEBAE1BDB9CF83CEBCCEB5" }); |
| data.add(new String[]{ "6.6.2", "CEBA" }); |
| data.add(new String[]{ "6.6.5", "CEBAE1BDB9" }); |
| data.add(new String[]{ "6.6.7", "CEBAE1BDB9CF83" }); |
| data.add(new String[]{ "6.6.9", "CEBAE1BDB9CF83CEBC" }); |
| // - first possible sequence of a certain length (1 code point) |
| data.add(new String[]{ "6.7.1", "00" }); |
| data.add(new String[]{ "6.7.2", "C280" }); |
| data.add(new String[]{ "6.7.3", "E0A080" }); |
| data.add(new String[]{ "6.7.4", "F0908080" }); |
| // - last possible sequence of a certain length (1 code point) |
| data.add(new String[]{ "6.9.1", "7F" }); |
| data.add(new String[]{ "6.9.2", "DFBF" }); |
| data.add(new String[]{ "6.9.3", "EFBFBF" }); |
| data.add(new String[]{ "6.9.4", "F48FBFBF" }); |
| // - other boundary conditions |
| data.add(new String[]{ "6.11.1", "ED9FBF" }); |
| data.add(new String[]{ "6.11.2", "EE8080" }); |
| data.add(new String[]{ "6.11.3", "EFBFBD" }); |
| data.add(new String[]{ "6.11.4", "F48FBFBF" }); |
| // - non character code points |
| data.add(new String[]{ "6.22.1", "EFBFBE" }); |
| data.add(new String[]{ "6.22.2", "EFBFBF" }); |
| data.add(new String[]{ "6.22.3", "F09FBFBE" }); |
| data.add(new String[]{ "6.22.4", "F09FBFBF" }); |
| data.add(new String[]{ "6.22.5", "F0AFBFBE" }); |
| data.add(new String[]{ "6.22.6", "F0AFBFBF" }); |
| data.add(new String[]{ "6.22.7", "F0BFBFBE" }); |
| data.add(new String[]{ "6.22.8", "F0BFBFBF" }); |
| data.add(new String[]{ "6.22.9", "F18FBFBE" }); |
| data.add(new String[]{ "6.22.10", "F18FBFBF" }); |
| data.add(new String[]{ "6.22.11", "F19FBFBE" }); |
| data.add(new String[]{ "6.22.12", "F19FBFBF" }); |
| data.add(new String[]{ "6.22.13", "F1AFBFBE" }); |
| data.add(new String[]{ "6.22.14", "F1AFBFBF" }); |
| data.add(new String[]{ "6.22.15", "F1BFBFBE" }); |
| data.add(new String[]{ "6.22.16", "F1BFBFBF" }); |
| data.add(new String[]{ "6.22.17", "F28FBFBE" }); |
| data.add(new String[]{ "6.22.18", "F28FBFBF" }); |
| data.add(new String[]{ "6.22.19", "F29FBFBE" }); |
| data.add(new String[]{ "6.22.20", "F29FBFBF" }); |
| data.add(new String[]{ "6.22.21", "F2AFBFBE" }); |
| data.add(new String[]{ "6.22.22", "F2AFBFBF" }); |
| data.add(new String[]{ "6.22.23", "F2BFBFBE" }); |
| data.add(new String[]{ "6.22.24", "F2BFBFBF" }); |
| data.add(new String[]{ "6.22.25", "F38FBFBE" }); |
| data.add(new String[]{ "6.22.26", "F38FBFBF" }); |
| data.add(new String[]{ "6.22.27", "F39FBFBE" }); |
| data.add(new String[]{ "6.22.28", "F39FBFBF" }); |
| data.add(new String[]{ "6.22.29", "F3AFBFBE" }); |
| data.add(new String[]{ "6.22.30", "F3AFBFBF" }); |
| data.add(new String[]{ "6.22.31", "F3BFBFBE" }); |
| data.add(new String[]{ "6.22.32", "F3BFBFBF" }); |
| data.add(new String[]{ "6.22.33", "F48FBFBE" }); |
| data.add(new String[]{ "6.22.34", "F48FBFBF" }); |
| // - unicode replacement character |
| data.add(new String[]{ "6.23.1", "EFBFBD" }); |
| // @formatter:on |
| |
| return data; |
| } |
| |
| private final ByteBuffer msg; |
| |
| public TestABCase6_GoodUTF(String testId, String hexMsg) |
| { |
| LOG.debug("Test ID: {}",testId); |
| this.msg = Hex.asByteBuffer(hexMsg); |
| } |
| |
| @Test |
| public void assertEchoTextMessage() throws Exception |
| { |
| List<WebSocketFrame> send = new ArrayList<>(); |
| send.add(new TextFrame().setPayload(msg)); |
| send.add(new CloseInfo(StatusCode.NORMAL).asFrame()); |
| |
| List<WebSocketFrame> expect = new ArrayList<>(); |
| expect.add(new TextFrame().setPayload(clone(msg))); |
| expect.add(new CloseInfo(StatusCode.NORMAL).asFrame()); |
| |
| try(Fuzzer fuzzer = new Fuzzer(this)) |
| { |
| fuzzer.connect(); |
| fuzzer.setSendMode(Fuzzer.SendMode.BULK); |
| fuzzer.send(send); |
| fuzzer.expect(expect); |
| } |
| } |
| } |