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;
17  
18  import java.nio.ByteBuffer;
19  import java.nio.charset.Charset;
20  
21  import junit.framework.TestCase;
22  
23  import org.easymock.MockControl;
24  
25  public class HeaderStateTest extends TestCase {
26  	
27  	public void testProcessMappingFrame() throws Exception {
28  		MockControl control = MockControl.createControl(ParseStateContext.class);
29  		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
30  		ParseStateContext context = (ParseStateContext) control.getMock();
31  		
32  		context.handleHeader(new String[] { "SEQ", "0", "0", "4096" });
33  		control.replay();
34  		
35  		Charset charset = Charset.forName("US-ASCII");
36  		ByteBuffer buffer = charset.encode("SEQ 0 0 4096\r\n");
37  				
38  		ParseState state = new HeaderState();
39  		assertFalse(state.process(buffer, context));
40  		
41  		assertEquals(14, buffer.position());
42  		
43  		control.verify();
44  	}
45  	
46  	public void testProcessDataFrame() throws Exception {
47  		MockControl control = MockControl.createControl(ParseStateContext.class);
48  		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
49  		ParseStateContext context = (ParseStateContext) control.getMock();
50  		
51  		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
52  		control.replay();
53  
54  		Charset charset = Charset.forName("US-ASCII");
55  		ByteBuffer buffer = charset.encode("MSG 0 0 . 0 100\r\nbluberi");
56  		
57  		ParseState state = new HeaderState();
58  		assertTrue(state.process(buffer, context));
59  		
60  		assertEquals(17, buffer.position());
61  		
62  		control.verify();
63  	}
64  	
65  	public void testProcessMultiPass() throws Exception {
66  		MockControl control = MockControl.createControl(ParseStateContext.class);
67  		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
68  		ParseStateContext context = (ParseStateContext) control.getMock();
69  		
70  		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
71  		control.replay();
72  
73  		Charset charset = Charset.forName("US-ASCII");
74  		ByteBuffer buffer = charset.encode("MSG 0 0 .");
75  		
76  		ParseState state = new HeaderState();
77  		assertFalse(state.process(buffer, context));
78  		assertEquals(9, buffer.position());
79  		
80  		buffer = charset.encode(" 0 100\r\nbluberi");
81  		assertTrue(state.process(buffer, context));
82  		assertEquals(8, buffer.position());
83  		
84  		control.verify();
85  	}
86  	
87  	public void testProcessComplex() throws Exception {
88  		MockControl control = MockControl.createControl(ParseStateContext.class);
89  		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
90  		ParseStateContext context = (ParseStateContext) control.getMock();
91  		
92  		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
93  		context.handleHeader(new String[] { "MSG", "2", "1", ".", "0", "100" });
94  		control.replay();
95  
96  		Charset charset = Charset.forName("US-ASCII");
97  		ParseState state = new HeaderState();
98  		
99  		ByteBuffer buffer = charset.encode("MSG 0 0 . 0 100\r\n");
100 		assertFalse(state.process(buffer, context));
101 		assertEquals(17, buffer.position());
102 		
103 		buffer = charset.encode("MSG 2 1 . 0 100\r\n");
104 		assertFalse(state.process(buffer, context));
105 		assertEquals(17, buffer.position());
106 		
107 		control.verify();
108 	}
109 	
110 	public void testProcessNonZeroPosition() throws Exception {
111 		MockControl control = MockControl.createControl(ParseStateContext.class);
112 		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
113 		ParseStateContext context = (ParseStateContext) control.getMock();
114 		
115 		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
116 		control.replay();
117 
118 		Charset charset = Charset.forName("US-ASCII");
119 		ParseState state = new HeaderState();
120 		
121 		ByteBuffer buffer = charset.encode("abcdefgMSG 0 0 . 0 100\r\n");
122 		buffer.position(7);
123 		assertFalse(state.process(buffer, context));
124 		assertEquals(24, buffer.position());
125 		
126 		control.verify();
127 	}
128 	
129 	public void testProcessSplitHeader() throws Exception {
130 		MockControl control = MockControl.createControl(ParseStateContext.class);
131 		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
132 		ParseStateContext context = (ParseStateContext) control.getMock();
133 
134 		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
135 		control.replay();
136 
137 		Charset charset = Charset.forName("US-ASCII");
138 		ByteBuffer buffer1 = charset.encode("MSG 0 0 . 0 100\r");
139 
140 		ParseState state = new HeaderState();
141 		assertFalse(state.process(buffer1, context));
142 		assertEquals(16, buffer1.position());
143 
144 		ByteBuffer buffer2 = charset.encode("\nbluberi");
145 
146 		assertTrue(state.process(buffer2, context));
147 		assertEquals(1, buffer2.position());
148 
149 		control.verify();
150 	}
151 
152 	public void testProcessFullySplitHeader() throws Exception {
153 		MockControl control = MockControl.createControl(ParseStateContext.class);
154 		control.setDefaultMatcher(MockControl.ARRAY_MATCHER);
155 		ParseStateContext context = (ParseStateContext) control.getMock();
156 
157 		context.handleHeader(new String[] { "MSG", "0", "0", ".", "0", "100" });
158 		control.replay();
159 
160 		Charset charset = Charset.forName("US-ASCII");
161 
162 		char[] toSplit = "MSG 0 0 . 0 100\r\n".toCharArray();
163 
164 		ParseState state = new HeaderState();
165 
166 		for (char ch : toSplit) {
167 			ByteBuffer buffer = charset.encode(String.valueOf(ch));
168 
169 			assertFalse(state.process(buffer, context));
170 			assertEquals(1, buffer.position());
171 		}
172 
173 		control.verify();
174 	}
175 	
176 }