/* * Copyright 2013 eXo Platform SAS * * 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 juzu.impl.common; import juzu.request.RequestParameter; import juzu.test.AbstractTestCase; import org.junit.Test; import java.util.Iterator; /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class LexersTestCase extends AbstractTestCase { @Test public void testParseQueryString() { class Assert { final Iterator<RequestParameter> i; Assert(String s) { this.i = Lexers.queryParser(s, 0, s.length()); } Assert assertParameter(String expectedName, String... expectedValue) { RequestParameter expected = RequestParameter.create(expectedName, expectedValue); if (i.hasNext()) { RequestParameter next = i.next(); assertEquals(expected, next); } else { throw failure("Was expecting another parameter equals to " + expected); } return this; } void assertDone() { if (i.hasNext()) { throw failure("Was not expecting those parameters " + Tools.list(i)); } } } // Empty new Assert("").assertDone(); // One param new Assert("f").assertParameter("f", "").assertDone(); new Assert("f=").assertParameter("f", "").assertDone(); new Assert("f=b").assertParameter("f", "b").assertDone(); new Assert("f=bar").assertParameter("f", "bar").assertDone(); new Assert("foo").assertParameter("foo", "").assertDone(); new Assert("foo=").assertParameter("foo", "").assertDone(); new Assert("foo=b").assertParameter("foo", "b").assertDone(); new Assert("foo=bar").assertParameter("foo", "bar").assertDone(); // Two values new Assert("f&f=bar2").assertParameter("f", "").assertParameter("f", "bar2").assertDone(); new Assert("f=&f=bar2").assertParameter("f", "").assertParameter("f", "bar2").assertDone(); new Assert("f=b&f=bar2").assertParameter("f", "b").assertParameter("f", "bar2").assertDone(); new Assert("f=bar&f=bar2").assertParameter("f", "bar").assertParameter("f", "bar2").assertDone(); new Assert("foo&foo=bar2").assertParameter("foo", "").assertParameter("foo", "bar2").assertDone(); new Assert("foo=&foo=bar2").assertParameter("foo", "").assertParameter("foo", "bar2").assertDone(); new Assert("foo=b&foo=bar2").assertParameter("foo", "b").assertParameter("foo", "bar2").assertDone(); new Assert("foo=bar&foo=bar2").assertParameter("foo", "bar").assertParameter("foo", "bar2").assertDone(); new Assert("f=bar2&f").assertParameter("f", "bar2").assertParameter("f", "").assertDone(); new Assert("f=bar2&f=").assertParameter("f", "bar2").assertParameter("f", "").assertDone(); new Assert("f=bar2&f=b").assertParameter("f", "bar2").assertParameter("f", "b").assertDone(); new Assert("f=bar2&f=bar").assertParameter("f", "bar2").assertParameter("f", "bar").assertDone(); new Assert("foo=bar2&foo").assertParameter("foo", "bar2").assertParameter("foo", "").assertDone(); new Assert("foo=bar2&foo=").assertParameter("foo", "bar2").assertParameter("foo", "").assertDone(); new Assert("foo=bar2&foo=b").assertParameter("foo", "bar2").assertParameter("foo", "b").assertDone(); new Assert("foo=bar2&foo=bar").assertParameter("foo", "bar2").assertParameter("foo", "bar").assertDone(); // Encoded name new Assert("+=foo").assertParameter("+", "foo").assertDone(); new Assert(".=foo").assertParameter(".", "foo").assertDone(); new Assert("-=foo").assertParameter("-", "foo").assertDone(); new Assert("*=foo").assertParameter("*", "foo").assertDone(); new Assert("_=foo").assertParameter("_", "foo").assertDone(); new Assert("/=foo").assertParameter("/", "foo").assertDone(); new Assert("%2F=foo").assertParameter("/", "foo").assertDone(); // Encoded value new Assert("foo=+").assertParameter("foo", "+").assertDone(); new Assert("foo=.").assertParameter("foo", ".").assertDone(); new Assert("foo=-").assertParameter("foo", "-").assertDone(); new Assert("foo=*").assertParameter("foo", "*").assertDone(); new Assert("foo=_").assertParameter("foo", "_").assertDone(); new Assert("foo=/").assertParameter("foo", "/").assertDone(); new Assert("foo=%2F").assertParameter("foo", "/").assertDone(); // Malformed name new Assert("%2=foo").assertDone(); new Assert("foo&%2=foo").assertParameter("foo", "").assertDone(); new Assert("foo=bar&%2=foo").assertParameter("foo", "bar").assertDone(); new Assert("%2=foo&foo").assertParameter("foo", "").assertDone(); // Malformed value new Assert("foo=%2").assertDone(); new Assert("foo&foo=%2").assertParameter("foo", "").assertDone(); new Assert("foo=bar&foo=%2").assertParameter("foo", "bar").assertDone(); new Assert("foo=%2&foo").assertParameter("foo", "").assertDone(); // Two params new Assert("x=y&f").assertParameter("x", "y").assertParameter("f", "").assertDone(); new Assert("x=y&f=").assertParameter("x", "y").assertParameter("f", "").assertDone(); new Assert("x=y&f=b").assertParameter("x", "y").assertParameter("f", "b").assertDone(); new Assert("x=y&f=bar").assertParameter("x", "y").assertParameter("f", "bar").assertDone(); new Assert("x=y&foo").assertParameter("x", "y").assertParameter("foo", "").assertDone(); new Assert("x=y&foo=").assertParameter("x", "y").assertParameter("foo", "").assertDone(); new Assert("x=y&foo=b").assertParameter("x", "y").assertParameter("foo", "b").assertDone(); new Assert("x=y&foo=bar").assertParameter("x", "y").assertParameter("foo", "bar").assertDone(); // Value containing '=' new Assert("f=b=j").assertParameter("f", "b=j").assertDone(); new Assert("f=bar=j").assertParameter("f", "bar=j").assertDone(); new Assert("f=b=juu").assertParameter("f", "b=juu").assertDone(); new Assert("f=bar=juu").assertParameter("f", "bar=juu").assertDone(); new Assert("foo=b=j").assertParameter("foo", "b=j").assertDone(); new Assert("foo=bar=j").assertParameter("foo", "bar=j").assertDone(); new Assert("foo=b=juu").assertParameter("foo", "b=juu").assertDone(); new Assert("foo=bar=juu").assertParameter("foo", "bar=juu").assertDone(); // Invalid chunk new Assert("=").assertDone(); new Assert("=x").assertDone(); new Assert("=x=").assertDone(); new Assert("=x=y").assertDone(); // Invalid chunk with ampersand new Assert("=&").assertDone(); new Assert("=x&").assertDone(); new Assert("=x=&").assertDone(); new Assert("=x=y&").assertDone(); new Assert("=&f").assertParameter("f", "").assertDone(); new Assert("=x&f").assertParameter("f", "").assertDone(); new Assert("=x=&f").assertParameter("f", "").assertDone(); new Assert("=x=y&f").assertParameter("f", "").assertDone(); new Assert("=&f=b").assertParameter("f", "b").assertDone(); new Assert("=x&f=b").assertParameter("f", "b").assertDone(); new Assert("=x=&f=b").assertParameter("f", "b").assertDone(); new Assert("=x=y&f=b").assertParameter("f", "b").assertDone(); new Assert("=&foo").assertParameter("foo", "").assertDone(); new Assert("=x&foo").assertParameter("foo", "").assertDone(); new Assert("=x=&foo").assertParameter("foo", "").assertDone(); new Assert("=x=y&foo").assertParameter("foo", "").assertDone(); new Assert("=&foo=").assertParameter("foo", "").assertDone(); new Assert("=x&foo=").assertParameter("foo", "").assertDone(); new Assert("=x=&foo=").assertParameter("foo", "").assertDone(); new Assert("=x=y&foo=").assertParameter("foo", "").assertDone(); new Assert("=&foo=b").assertParameter("foo", "b").assertDone(); new Assert("=x&foo=b").assertParameter("foo", "b").assertDone(); new Assert("=x=&foo=b").assertParameter("foo", "b").assertDone(); new Assert("=x=y&foo=b").assertParameter("foo", "b").assertDone(); new Assert("=&foo=bar").assertParameter("foo", "bar").assertDone(); new Assert("=x&foo=bar").assertParameter("foo", "bar").assertDone(); new Assert("=x=&foo=bar").assertParameter("foo", "bar").assertDone(); new Assert("=x=y&foo=bar").assertParameter("foo", "bar").assertDone(); // assertEquals("%2B", Lexers.queryParser("a=%2B").next().getRaw(0)); assertEquals("+", Lexers.queryParser("a=%2B").next().get(0)); } }