/*
* Copyright 2006 Simon Raess
*
* Licensed 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 net.sf.beep4j.internal.management;
import java.io.PrintWriter;
import java.util.Arrays;
import junit.framework.TestCase;
import net.sf.beep4j.Message;
import net.sf.beep4j.MessageBuilder;
import net.sf.beep4j.ProfileInfo;
import net.sf.beep4j.ProtocolException;
import net.sf.beep4j.internal.management.BEEPError;
import net.sf.beep4j.internal.management.ManagementMessageBuilder;
import net.sf.beep4j.internal.management.ManagementMessageParser;
import net.sf.beep4j.internal.management.CloseChannelMessage;
import net.sf.beep4j.internal.management.Greeting;
import net.sf.beep4j.internal.management.SaxMessageBuilder;
import net.sf.beep4j.internal.management.SaxMessageParser;
import net.sf.beep4j.internal.management.StartChannelMessage;
import net.sf.beep4j.internal.message.DefaultMessageBuilder;
public class ChannelManagementMessageTest extends TestCase {
private static final String PROFILE = "http://examples.org/profile/echo";
private static final String PROFILE_2 = "http://examples.org/profile/reverse";
private static final String PROFILE_3 = "http://examples.org/profile/crypto";
private ManagementMessageBuilder builder;
private ManagementMessageParser parser;
private MessageBuilder messageBuilder;
@Override
protected void setUp() throws Exception {
builder = new SaxMessageBuilder();
parser = new SaxMessageParser();
messageBuilder = new DefaultMessageBuilder();
messageBuilder.setCharsetName("UTF-8");
messageBuilder.setContentType("application", "beep+xml");
}
public void testGreetingEmpty() throws Exception {
Message message = builder.createGreeting(messageBuilder, new String[0]);
Greeting greeting = parser.parseGreeting(message);
assertEquals(0, greeting.getProfiles().length);
}
public void testGreetingTwoProfiles() throws Exception {
Message message = builder.createGreeting(messageBuilder, new String[] {
PROFILE, PROFILE_2
});
Greeting greeting = parser.parseGreeting(message);
assertEquals(2, greeting.getProfiles().length);
assertEquals(PROFILE, greeting.getProfiles()[0]);
assertEquals(PROFILE_2, greeting.getProfiles()[1]);
}
public void testError() throws Exception {
Message message = builder.createError(messageBuilder, 550, "still working");
BEEPError error = parser.parseError(message);
assertEquals(550, error.getCode());
assertEquals("still working", error.getMessage());
}
public void testOk() throws Exception {
Message message = builder.createOk(messageBuilder);
parser.parseOk(message);
}
public void testStartWithOneProfile() throws Exception {
Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
new ProfileInfo(PROFILE)
});
assertEquals("application/beep+xml", message.getContentType());
StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
assertEquals(2, result.getChannelNumber());
assertEquals(1, result.getProfiles().length);
assertEquals(PROFILE, result.getProfiles()[0].getUri());
}
public void testStartWithThreeProfiles() throws Exception {
Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
new ProfileInfo(PROFILE), new ProfileInfo(PROFILE_2), new ProfileInfo(PROFILE_3)
});
assertEquals("application/beep+xml", message.getContentType());
StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
assertEquals(2, result.getChannelNumber());
assertEquals(3, result.getProfiles().length);
assertEquals(PROFILE, result.getProfiles()[0].getUri());
assertEquals(PROFILE_2, result.getProfiles()[1].getUri());
assertEquals(PROFILE_3, result.getProfiles()[2].getUri());
}
public void testStartWithContent() throws Exception {
Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
new ProfileInfo(PROFILE, "abcdefg")
});
StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
assertEquals(2, result.getChannelNumber());
assertEquals(1, result.getProfiles().length);
assertEquals(PROFILE, result.getProfiles()[0].getUri());
assertEquals("abcdefg", result.getProfiles()[0].getContent());
}
public void testStartWithBase64EncodedContent() throws Exception {
byte[] expected = new byte[] { 0x30, 0x31, 0x32, 0x33, 0x34 };
Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
new ProfileInfo(PROFILE, expected)
});
StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
assertEquals(2, result.getChannelNumber());
assertEquals(1, result.getProfiles().length);
assertEquals(PROFILE, result.getProfiles()[0].getUri());
assertArrayEquals(expected, result.getProfiles()[0].getBinaryContent());
}
public void testProfileWithoutContent() throws Exception {
Message message = builder.createProfile(messageBuilder, new ProfileInfo(PROFILE));
ProfileInfo profile = parser.parseProfile(message);
assertEquals(PROFILE, profile.getUri());
assertFalse(profile.hasContent());
}
public void testProfileWithContent() throws Exception {
Message message = builder.createProfile(messageBuilder, new ProfileInfo(PROFILE, "abcdefg"));
ProfileInfo profile = parser.parseProfile(message);
assertEquals(PROFILE, profile.getUri());
assertTrue(profile.hasContent());
assertFalse(profile.isBase64Encoded());
assertEquals("abcdefg", profile.getContent());
}
public void testClose() throws Exception {
Message message = builder.createClose(messageBuilder, 2, 200);
CloseChannelMessage request = (CloseChannelMessage) parser.parseRequest(message);
assertEquals(2, request.getChannelNumber());
assertEquals(200, request.getCode());
}
public void testParseInvalidRootElement() throws Exception {
MessageBuilder builder = new DefaultMessageBuilder();
builder.setCharsetName("UTF-8");
builder.setContentType("text", "xml");
PrintWriter writer = new PrintWriter(builder.getWriter());
writer.println("");
writer.close();
try {
parser.parseRequest(builder.getMessage());
fail("unknown root element must be rejected with a ProtocolException");
} catch (ProtocolException e) {
// expected
}
}
public void testParserInvalidStartMessage() throws Exception {
MessageBuilder builder = new DefaultMessageBuilder();
builder.setCharsetName("UTF-8");
builder.setContentType("text", "xml");
PrintWriter writer = new PrintWriter(builder.getWriter());
writer.println("");
writer.close();
try {
parser.parseRequest(builder.getMessage());
fail("invalid start message must throw ProtocolException");
} catch (ProtocolException e) {
// expected
}
}
private void assertArrayEquals(byte[] a, byte[] b) {
assertEquals("lengths do not match", a.length, b.length);
assertTrue("content does not match", Arrays.equals(a, b));
}
}