View Javadoc

1   // Copyright (C) 2006 - 2009 Philip Aston
2   // All rights reserved.
3   //
4   // This file is part of The Grinder software distribution. Refer to
5   // the file LICENSE which is part of The Grinder distribution for
6   // licensing details. The Grinder distribution is available on the
7   // Internet at http://grinder.sourceforge.net/
8   //
9   // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
12  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
13  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
14  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15  // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
16  // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
17  // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
19  // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
20  // OF THE POSSIBILITY OF SUCH DAMAGE.
21  
22  package net.grinder.util.http;
23  
24  import net.grinder.testutility.DelegatingStubFactory;
25  import net.grinder.util.http.URIParser.ParseListener;
26  
27  import junit.framework.TestCase;
28  
29  
30  /**
31   * Unit tests for {@link URIParserImplementation}.
32   *
33   * @author Philip Aston
34   */
35  public class TestURIParserImplementation extends TestCase {
36  
37    private ParseListener m_testParseListener =
38      new TestParseListener();
39  
40    private final DelegatingStubFactory<ParseListener>
41      m_parseListenerStubFactory =
42        DelegatingStubFactory.create(m_testParseListener);
43    private final ParseListener m_parseListener =
44      m_parseListenerStubFactory.getStub();
45  
46    public void testBasicURIs() throws Exception {
47      final URIParser parser = new URIParserImplementation();
48  
49      parser.parse("simple", m_parseListener);
50      m_parseListenerStubFactory.assertSuccess("path", "simple");
51      m_parseListenerStubFactory.assertNoMoreCalls();
52  
53      parser.parse("http://foo/simple/", m_parseListener);
54      m_parseListenerStubFactory.assertSuccess("scheme", "http");
55      m_parseListenerStubFactory.assertSuccess("authority", "foo");
56      m_parseListenerStubFactory.assertSuccess("path", "/simple/");
57      m_parseListenerStubFactory.assertNoMoreCalls();
58  
59      parser.parse("http://foo:1234/?hello#world", m_parseListener);
60      m_parseListenerStubFactory.assertSuccess("scheme", "http");
61      m_parseListenerStubFactory.assertSuccess("authority", "foo:1234");
62      m_parseListenerStubFactory.assertSuccess("path", "/");
63      m_parseListenerStubFactory.assertSuccess("queryString", "hello");
64      m_parseListenerStubFactory.assertSuccess("fragment", "world");
65      m_parseListenerStubFactory.assertNoMoreCalls();
66  
67      parser.parse("http://foo:1234/bah%20dah?%42%77", m_parseListener);
68      m_parseListenerStubFactory.assertSuccess("scheme", "http");
69      m_parseListenerStubFactory.assertSuccess("authority", "foo:1234");
70      m_parseListenerStubFactory.assertSuccess("path", "/bah dah");
71      m_parseListenerStubFactory.assertSuccess("queryString", "Bw");
72      m_parseListenerStubFactory.assertNoMoreCalls();
73  
74      // Broken escapes.
75      parser.parse("http://foo:1234/bah%20dah?%42%77", m_parseListener);
76  
77    }
78  
79    public void testParseTermination() {
80      final URIParser parser = new URIParserImplementation();
81  
82      parser.parse("stop://stop/stop?stop#stop", m_parseListener);
83      m_parseListenerStubFactory.assertSuccess("scheme", "stop");
84      m_parseListenerStubFactory.assertNoMoreCalls();
85  
86      parser.parse("scheme://stop/stop?stop#stop", m_parseListener);
87      m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
88      m_parseListenerStubFactory.assertSuccess("authority", "stop");
89      m_parseListenerStubFactory.assertNoMoreCalls();
90  
91      parser.parse("scheme://authority/stop?stop#stop", m_parseListener);
92      m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
93      m_parseListenerStubFactory.assertSuccess("authority", "authority");
94      m_parseListenerStubFactory.assertSuccess("path", "/stop");
95      m_parseListenerStubFactory.assertNoMoreCalls();
96  
97      parser.parse("scheme://authority/path?stop#stop", m_parseListener);
98      m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
99      m_parseListenerStubFactory.assertSuccess("authority", "authority");
100     m_parseListenerStubFactory.assertSuccess("path", "/path");
101     m_parseListenerStubFactory.assertSuccess("queryString", "stop");
102     m_parseListenerStubFactory.assertNoMoreCalls();
103 
104     parser.parse("scheme://authority/path?queryString#stop", m_parseListener);
105     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
106     m_parseListenerStubFactory.assertSuccess("authority", "authority");
107     m_parseListenerStubFactory.assertSuccess("path", "/path");
108     m_parseListenerStubFactory.assertSuccess("queryString", "queryString");
109     m_parseListenerStubFactory.assertSuccess("fragment", "stop");
110     m_parseListenerStubFactory.assertNoMoreCalls();
111 
112     parser.parse("scheme://authority/path?queryString#fragment", m_parseListener);
113     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
114     m_parseListenerStubFactory.assertSuccess("authority", "authority");
115     m_parseListenerStubFactory.assertSuccess("path", "/path");
116     m_parseListenerStubFactory.assertSuccess("queryString", "queryString");
117     m_parseListenerStubFactory.assertSuccess("fragment", "fragment");
118     m_parseListenerStubFactory.assertNoMoreCalls();
119 
120     parser.parse("scheme://authority/path;stop=value?queryString#fragment", m_parseListener);
121     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
122     m_parseListenerStubFactory.assertSuccess("authority", "authority");
123     m_parseListenerStubFactory.assertSuccess("path", "/path;");
124     m_parseListenerStubFactory.assertSuccess("pathParameterNameValue", "stop", "value");
125     m_parseListenerStubFactory.assertNoMoreCalls();
126 
127     parser.parse("scheme://authority/path;foo=bah&==name=value?queryString#fragment", m_parseListener);
128     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
129     m_parseListenerStubFactory.assertSuccess("authority", "authority");
130     m_parseListenerStubFactory.assertSuccess("path", "/path;");
131     m_parseListenerStubFactory.assertSuccess("pathParameterNameValue", "foo", "bah");
132     m_parseListenerStubFactory.assertSuccess("path", "&==");
133     m_parseListenerStubFactory.assertNoMoreCalls();
134 
135     parser.parse("scheme://authority/path?name=value&stop=foo", m_parseListener);
136     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
137     m_parseListenerStubFactory.assertSuccess("authority", "authority");
138     m_parseListenerStubFactory.assertSuccess("path", "/path");
139     m_parseListenerStubFactory.assertSuccess("queryStringNameValue", "name", "value");
140     m_parseListenerStubFactory.assertSuccess("queryString", "&");
141     m_parseListenerStubFactory.assertSuccess("queryStringNameValue", "stop", "foo");
142     m_parseListenerStubFactory.assertNoMoreCalls();
143 
144     parser.parse("scheme://authority/path?foo=bah&==name=value", m_parseListener);
145     m_parseListenerStubFactory.assertSuccess("scheme", "scheme");
146     m_parseListenerStubFactory.assertSuccess("authority", "authority");
147     m_parseListenerStubFactory.assertSuccess("path", "/path");
148     m_parseListenerStubFactory.assertSuccess("queryStringNameValue", "foo", "bah");
149     m_parseListenerStubFactory.assertSuccess("queryString", "&==");
150     m_parseListenerStubFactory.assertNoMoreCalls();
151   }
152 
153   public void testPathParameterNameValues() throws Exception {
154     final URIParser parser = new URIParserImplementation();
155 
156     parser.parse("http:/foo;hello=world/simple/", m_parseListener);
157     m_parseListenerStubFactory.assertSuccess("scheme", "http");
158     m_parseListenerStubFactory.assertSuccess("path", "/foo;");
159     m_parseListenerStubFactory.assertSuccess(
160       "pathParameterNameValue", "hello", "world");
161     m_parseListenerStubFactory.assertSuccess("path", "/simple/");
162     m_parseListenerStubFactory.assertNoMoreCalls();
163 
164     parser.parse("http:/foo;hello=world&JSESSIONID=1234", m_parseListener);
165     m_parseListenerStubFactory.assertSuccess("scheme", "http");
166     m_parseListenerStubFactory.assertSuccess("path", "/foo;");
167     m_parseListenerStubFactory.assertSuccess(
168       "pathParameterNameValue", "hello", "world");
169     m_parseListenerStubFactory.assertSuccess("path", "&");
170     m_parseListenerStubFactory.assertSuccess(
171       "pathParameterNameValue", "JSESSIONID", "1234");
172     m_parseListenerStubFactory.assertNoMoreCalls();
173 
174     parser.parse("http:;JSESSIONID=", m_parseListener);
175     m_parseListenerStubFactory.assertSuccess("scheme", "http");
176     m_parseListenerStubFactory.assertSuccess("path", ";");
177     m_parseListenerStubFactory.assertSuccess(
178       "pathParameterNameValue", "JSESSIONID", "");
179     m_parseListenerStubFactory.assertNoMoreCalls();
180   }
181 
182   public void testQueryStringNameValues() throws Exception {
183     final URIParser parser = new URIParserImplementation();
184 
185     parser.parse("http:/foo?hello=world/simple/", m_parseListener);
186     m_parseListenerStubFactory.assertSuccess("scheme", "http");
187     m_parseListenerStubFactory.assertSuccess("path", "/foo");
188     m_parseListenerStubFactory.assertSuccess(
189       "queryStringNameValue", "hello", "world/simple/");
190     m_parseListenerStubFactory.assertNoMoreCalls();
191   }
192 
193   public static final class TestParseListener implements ParseListener {
194 
195     public boolean scheme(String scheme) {
196       return !scheme.equals("stop");
197     }
198 
199     public boolean authority(String authority) {
200       return !authority.equals("stop");
201     }
202 
203     public boolean path(String path) {
204       return !path.equals("/stop") && !path.equals("&==");
205     }
206 
207     public boolean pathParameterNameValue(String name, String value) {
208       return !name.equals("stop");
209     }
210 
211     public boolean queryString(String queryString) {
212       return !queryString.equals("stop") && !queryString.equals("&==");
213     }
214 
215     public boolean queryStringNameValue(String name, String value) {
216       return !name.equals("stop");
217     }
218 
219     public boolean fragment(String fragment) {
220       return !fragment.equals("stop");
221     }
222   }
223 }