/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.transport.stomp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.Socket;
import java.util.Arrays;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;
import org.junit.Test;
public class StompMaxDataSizeTest extends StompTestSupport {
private static final int TEST_MAX_DATA_SIZE = 64 * 1024;
private StompConnection connection;
@Override
public void tearDown() throws Exception {
if (connection != null) {
try {
connection.close();
} catch (Throwable ex) {}
}
super.tearDown();
}
@Override
protected boolean isUseSslConnector() {
return true;
}
@Override
protected boolean isUseNioConnector() {
return true;
}
@Override
protected boolean isUseNioPlusSslConnector() {
return true;
}
@Override
protected String getAdditionalConfig() {
return "?transport.maxDataLength=" + TEST_MAX_DATA_SIZE;
}
@Test(timeout = 60000)
public void testOversizedMessageOnPlainSocket() throws Exception {
doTestOversizedMessage(port, false);
}
@Test(timeout = 60000)
public void testOversizedMessageOnNioSocket() throws Exception {
doTestOversizedMessage(nioPort, false);
}
@Test//(timeout = 60000)
public void testOversizedMessageOnSslSocket() throws Exception {
doTestOversizedMessage(sslPort, true);
}
@Test(timeout = 60000)
public void testOversizedMessageOnNioSslSocket() throws Exception {
doTestOversizedMessage(nioSslPort, true);
}
protected void doTestOversizedMessage(int port, boolean useSsl) throws Exception {
stompConnect(port, useSsl);
String frame = "CONNECT\n" + "login:system\n" + "passcode:manager\n\n" + Stomp.NULL;
stompConnection.sendFrame(frame);
frame = stompConnection.receiveFrame();
assertTrue(frame.startsWith("CONNECTED"));
frame = "SUBSCRIBE\n" + "destination:/queue/" + getQueueName() + "\n" + "ack:auto\n\n" + Stomp.NULL;
stompConnection.sendFrame(frame);
int size = 100;
char[] bigBodyArray = new char[size];
Arrays.fill(bigBodyArray, 'a');
String bigBody = new String(bigBodyArray);
frame = "SEND\n" + "destination:/queue/" + getQueueName() + "\n\n" + bigBody + Stomp.NULL;
stompConnection.sendFrame(frame);
StompFrame received = stompConnection.receive();
assertNotNull(received);
assertEquals("MESSAGE", received.getAction());
assertEquals(bigBody, received.getBody());
size = TEST_MAX_DATA_SIZE + 100;
bigBodyArray = new char[size];
Arrays.fill(bigBodyArray, 'a');
bigBody = new String(bigBodyArray);
frame = "SEND\n" + "destination:/queue/" + getQueueName() + "\n\n" + bigBody + Stomp.NULL;
stompConnection.sendFrame(frame);
received = stompConnection.receive(5000);
assertNotNull(received);
assertEquals("ERROR", received.getAction());
}
protected StompConnection stompConnect(int port, boolean ssl) throws Exception {
if (stompConnection == null) {
stompConnection = new StompConnection();
}
Socket socket = null;
if (ssl) {
socket = createSslSocket(port);
} else {
socket = createSocket(port);
}
stompConnection.open(socket);
return stompConnection;
}
protected Socket createSocket(int port) throws IOException {
return new Socket("127.0.0.1", port);
}
protected Socket createSslSocket(int port) throws IOException {
SocketFactory factory = SSLSocketFactory.getDefault();
return factory.createSocket("127.0.0.1", port);
}
}