1   /*
2    *  Copyright 2006 Simon Raess
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package net.sf.beep4j.internal.profile;
17  
18  import java.util.Arrays;
19  
20  import junit.framework.TestCase;
21  import net.sf.beep4j.Message;
22  import net.sf.beep4j.MessageBuilder;
23  import net.sf.beep4j.ProfileInfo;
24  import net.sf.beep4j.internal.message.DefaultMessageBuilder;
25  
26  public class ChannelManagementMessageTest extends TestCase {
27  	
28  	private static final String PROFILE = "http://examples.org/profile/echo";
29  
30  	private static final String PROFILE_2 = "http://examples.org/profile/reverse";
31  
32  	private static final String PROFILE_3 = "http://examples.org/profile/crypto";
33  
34  	private ChannelManagementMessageBuilder builder;
35  	
36  	private ChannelManagementMessageParser parser;
37  
38  	private MessageBuilder messageBuilder;
39  	
40  	@Override
41  	protected void setUp() throws Exception {
42  		builder = new SaxMessageBuilder();
43  		parser = new SaxMessageParser();
44  		messageBuilder = new DefaultMessageBuilder();
45  		messageBuilder.setCharsetName("UTF-8");
46  		messageBuilder.setContentType("application", "beep+xml");
47  	}
48  	
49  	public void testGreetingEmpty() throws Exception {
50  		Message message = builder.createGreeting(messageBuilder, new String[0]);
51  		Greeting greeting = parser.parseGreeting(message);
52  		assertEquals(0, greeting.getProfiles().length);
53  	}
54  	
55  	public void testGreetingTwoProfiles() throws Exception {
56  		Message message = builder.createGreeting(messageBuilder, new String[] {
57  			PROFILE, PROFILE_2	
58  		});
59  		Greeting greeting = parser.parseGreeting(message);
60  		assertEquals(2, greeting.getProfiles().length);
61  		assertEquals(PROFILE, greeting.getProfiles()[0]);
62  		assertEquals(PROFILE_2, greeting.getProfiles()[1]);
63  	}
64  	
65  	public void testError() throws Exception {
66  		Message message = builder.createError(messageBuilder, 550, "still working");
67  		BEEPError error = parser.parseError(message);
68  		assertEquals(550, error.getCode());
69  		assertEquals("still working", error.getMessage());
70  	}
71  	
72  	public void testOk() throws Exception {
73  		Message message = builder.createOk(messageBuilder);
74  		parser.parseOk(message);
75  	}
76  
77  	public void testStartWithOneProfile() throws Exception {
78  		Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
79  			new ProfileInfo(PROFILE)
80  		});
81  		assertEquals("application/beep+xml", message.getContentType());
82  		
83  		StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
84  		assertEquals(2, result.getChannelNumber());
85  		assertEquals(1, result.getProfiles().length);
86  		assertEquals(PROFILE, result.getProfiles()[0].getUri());
87  	}
88  
89  	public void testStartWithThreeProfiles() throws Exception {
90  		Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
91  			new ProfileInfo(PROFILE), new ProfileInfo(PROFILE_2), new ProfileInfo(PROFILE_3)
92  		});
93  		assertEquals("application/beep+xml", message.getContentType());
94  		
95  		StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
96  		assertEquals(2, result.getChannelNumber());
97  		assertEquals(3, result.getProfiles().length);
98  		assertEquals(PROFILE, result.getProfiles()[0].getUri());
99  		assertEquals(PROFILE_2, result.getProfiles()[1].getUri());
100 		assertEquals(PROFILE_3, result.getProfiles()[2].getUri());
101 	}
102 	
103 	public void testStartWithContent() throws Exception {
104 		Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
105 			new ProfileInfo(PROFILE, "abcdefg")	
106 		});
107 		
108 		StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
109 		assertEquals(2, result.getChannelNumber());
110 		assertEquals(1, result.getProfiles().length);
111 		assertEquals(PROFILE, result.getProfiles()[0].getUri());
112 		assertEquals("abcdefg", result.getProfiles()[0].getContent());
113 	}
114 	
115 	public void testStartWithBase64EncodedContent() throws Exception {
116 		byte[] expected = new byte[] { 0x30, 0x31, 0x32, 0x33, 0x34 };
117 		Message message = builder.createStart(messageBuilder, 2, new ProfileInfo[] {
118 				new ProfileInfo(PROFILE, expected)	
119 		});
120 			
121 		StartChannelMessage result = (StartChannelMessage) parser.parseRequest(message);
122 		assertEquals(2, result.getChannelNumber());
123 		assertEquals(1, result.getProfiles().length);
124 		assertEquals(PROFILE, result.getProfiles()[0].getUri());
125 		assertArrayEquals(expected, result.getProfiles()[0].getBinaryContent());
126 	}
127 	
128 	public void testProfileWithoutContent() throws Exception {
129 		Message message = builder.createProfile(messageBuilder, new ProfileInfo(PROFILE));
130 		ProfileInfo profile = parser.parseProfile(message);
131 		assertEquals(PROFILE, profile.getUri());
132 		assertFalse(profile.hasContent());
133 	}
134 	
135 	public void testProfileWithContent() throws Exception {
136 		Message message = builder.createProfile(messageBuilder, new ProfileInfo(PROFILE, "abcdefg"));
137 		ProfileInfo profile = parser.parseProfile(message);
138 		assertEquals(PROFILE, profile.getUri());
139 		assertTrue(profile.hasContent());
140 		assertFalse(profile.isBase64Encoded());
141 		assertEquals("abcdefg", profile.getContent());
142 	}
143 	
144 	public void testClose() throws Exception {
145 		Message message = builder.createClose(messageBuilder, 2, 200);
146 		CloseChannelMessage request = (CloseChannelMessage) parser.parseRequest(message);
147 		assertEquals(2, request.getChannelNumber());
148 		assertEquals(200, request.getCode());
149 	}
150 	
151 	private void assertArrayEquals(byte[] a, byte[] b) {
152 		assertEquals("lengths do not match", a.length, b.length);
153 		assertTrue("content does not match", Arrays.equals(a, b));
154 	}
155 
156 }