/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you 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 org.apache.synapse.commons.templates.uri.parser;
import junit.framework.TestCase;
import org.apache.synapse.commons.templates.uri.URITemplate;
import java.util.HashMap;
import java.util.Map;
public class ParserTest extends TestCase {
Map<String, String> variables = new HashMap<String, String>();
@Override
protected void setUp() throws Exception {
variables.put("dom", "example.com");
variables.put("dub", "me/too");
variables.put("hello", "Hello World!");
variables.put("half", "50%");
variables.put("var", "value");
variables.put("who", "fred");
variables.put("base", "http://example.com/home/");
variables.put("path", "/foo/bar");
variables.put("v", "6");
variables.put("x", "1024");
variables.put("y", "768");
variables.put("empty", "");
}
public void testSimpleStringExpansion() throws Exception {
assertEquals("value", new SimpleStringExpression("var").expand(variables));
assertEquals("Hello%20World%21", new SimpleStringExpression("hello").expand(variables));
assertEquals("50%25", new SimpleStringExpression("half").expand(variables));
assertEquals("", new SimpleStringExpression("empty").expand(variables));
assertNull(new SimpleStringExpression("undef").expand(variables));
assertEquals("1024,768", new SimpleStringExpression("x,y").expand(variables));
assertEquals("1024,Hello%20World%21,768", new SimpleStringExpression("x,hello,y").expand(variables));
assertEquals("1024,", new SimpleStringExpression("x,empty").expand(variables));
assertEquals("1024", new SimpleStringExpression("x,undef").expand(variables));
assertEquals("768", new SimpleStringExpression("undef,y").expand(variables));
assertEquals("768", new SimpleStringExpression("undef,y").expand(variables));
assertEquals("val", new SimpleStringExpression("var:3").expand(variables));
assertEquals("value", new SimpleStringExpression("var:30").expand(variables));
assertEquals("http%3A%2F%2Fexample.com%2Fhome%2F", new SimpleStringExpression("base").expand(variables));
}
public void testSimpleStringMatch() throws Exception {
URITemplate template = new URITemplate("/admin/~{user}");
Map<String, String> var = new HashMap<String, String>();
assertTrue(template.matches("/admin/~hiranya", var));
assertEquals("hiranya", var.get("user"));
assertFalse(template.matches("/admi/~hiranya", var));
assertFalse(template.matches("/admin/hiranya", var));
assertFalse(template.matches("/admin/~hiranya/foo", var));
assertFalse(template.matches("/admin/~hirany.a", var));
var.clear();
template = new URITemplate("/dictionary/{char:1}/{word}");
assertTrue(template.matches("/dictionary/c/cat", var));
assertEquals("c", var.get("char"));
assertEquals("cat", var.get("word"));
assertFalse(template.matches("/dictionry/c/cat", var));
assertFalse(template.matches("/dictionary/c", var));
assertFalse(template.matches("/dictionary/co/cat", var));
var.clear();
assertTrue(template.matches("/dictionary/h/hello%20world", var));
assertEquals("h", var.get("char"));
assertEquals("hello world", var.get("word"));
var.clear();
template = new URITemplate("/dictionary/{char}/{+word}");
assertTrue(template.matches("/dictionary/h/hello+world", var));
assertEquals("h", var.get("char"));
assertEquals("hello+world", var.get("word"));
var.clear();
assertTrue(template.matches("/dictionary/h/hello world", var));
assertEquals("h", var.get("char"));
assertEquals("hello world", var.get("word"));
var.clear();
assertTrue(template.matches("/dictionary/h/hello%2Bworld", var));
assertEquals("h", var.get("char"));
assertEquals("hello+world", var.get("word"));
var.clear();
template = new URITemplate("/dictionary/{char}/{word,count}");
assertTrue(template.matches("/dictionary/c/cat,5", var));
assertEquals("c", var.get("char"));
assertEquals("cat", var.get("word"));
assertEquals("5", var.get("count"));
var.clear();
assertTrue(template.matches("/dictionary/c/cat", var));
assertEquals("c", var.get("char"));
assertEquals("cat", var.get("word"));
assertEquals("", var.get("count"));
var.clear();
assertTrue(template.matches("/dictionary/c/,5", var));
assertEquals("c", var.get("char"));
assertEquals("", var.get("word"));
assertEquals("5", var.get("count"));
var.clear();
template = new URITemplate("/dictionary/{char,word}/{count}");
assertTrue(template.matches("/dictionary/c,cat/5", var));
assertEquals("c", var.get("char"));
assertEquals("cat", var.get("word"));
assertEquals("5", var.get("count"));
var.clear();
assertTrue(template.matches("/dictionary/c/5", var));
assertEquals("c", var.get("char"));
assertEquals("", var.get("word"));
assertEquals("5", var.get("count"));
assertFalse(template.matches("/dictionary/c,ca,cat/5", var));
var.clear();
template = new URITemplate("/dictionary/{user}/test?a={user}");
assertTrue(template.matches("/dictionary/hiranya/test?a=hiranya", var));
assertEquals("hiranya", var.get("user"));
assertFalse(template.matches("/dictionary/hiranya/test?a=foo", var));
var.clear();
template = new URITemplate("/dictionary/foo-{user}-bar");
assertTrue(template.matches("/dictionary/foo-hiranya-bar", var));
assertEquals("hiranya", var.get("user"));
var.clear();
assertTrue(template.matches("/dictionary/foo--bar", var));
assertFalse(template.matches("/dictionary/foo-bar", var));
template = new URITemplate("/alert/{id}.json");
assertTrue(template.matches("/alert/foo.json", var));
assertEquals("foo", var.get("id"));
var.clear();
template = new URITemplate("/");
assertTrue(template.matches("/", var));
template = new URITemplate("/*");
assertTrue(template.matches("/sanjeewa?test=done", var));
assertTrue(template.matches("/sanjeewa", var));
assertTrue(template.matches("/", var));
template = new URITemplate("/sanjeewa/*");
assertTrue(template.matches("/sanjeewa/admin?test=done", var));
assertTrue(template.matches("/sanjeewa/test", var));
template = new URITemplate("/sanjeewa*");
assertTrue(template.matches("/sanjeewa/admin?test=done", var));
assertTrue(template.matches("/sanjeewa/test", var));
assertTrue(template.matches("/sanjeewa/", var));
assertTrue(template.matches("/sanjeewa", var));
template = new URITemplate("/{sanjeewa}/*");
assertTrue(template.matches("/sanjeewa/admin?test=done", var));
assertTrue(template.matches("/sanjeewa/?test=done", var));
assertTrue(template.matches("/sanjeewa/test", var));
assertTrue(template.matches("/sanjeewa/", var));
template = new URITemplate("/dictionary/{char}/{word}");
assertTrue(template.matches("/dictionary/d/dog/", var));
assertTrue(template.matches("/dictionary/d/dog", var));
template = new URITemplate("/test{format}*");
assertTrue(template.matches("/test.json?test", var));
assertTrue(template.matches("/test.json/", var));
assertTrue(template.matches("/test.json", var));
template = new URITemplate("/test{format}/*");
assertTrue(template.matches("/test.json/test", var));
assertTrue(template.matches("/test.json/", var));
assertTrue(template.matches("/test.json", var));
template = new URITemplate("/sanjeewa/~{test}?*");
var.put("test", "tester");
assertTrue(template.matches("/sanjeewa/~tester?test", var));
var.clear();
template = new URITemplate("/sanjeewa/{name,id}/*");
var.put("name", "user");
var.put("id", "190");
// matching resource urls
assertTrue(template.matches("/sanjeewa/user,190/test", var));
assertTrue(template.matches("/sanjeewa/user,190/test?year=2012", var));
var.clear();
template = new URITemplate("/{name,id}/*");
var.put("name", "user");
var.put("id", "190");
// matching resource urls
assertTrue(template.matches("/user,190/test", var));
assertTrue(template.matches("/user,190/test?year=2012", var));
// un matching resource urls
assertFalse(template.matches("/sanjeewa/user,190", var));
assertFalse(template.matches("/sanjeewa/user,190,11/test", var));
assertFalse(template.matches("/sanjeewa/user/test", var));
assertFalse(template.matches("/rangana/user,190/", var));
assertFalse(template.matches("/sanjeewa/test", var));
var.clear();
}
public void testReservedStringExpansion() throws Exception {
assertEquals("value", new ReservedStringExpression("var").expand(variables));
assertEquals("Hello%20World!", new ReservedStringExpression("hello").expand(variables));
assertEquals("50%25", new ReservedStringExpression("half").expand(variables));
assertEquals("http://example.com/home/", new ReservedStringExpression("base").expand(variables));
assertEquals("", new ReservedStringExpression("empty").expand(variables));
assertNull(new ReservedStringExpression("undef").expand(variables));
assertEquals("/foo/bar", new ReservedStringExpression("path").expand(variables));
assertEquals("1024,Hello%20World!,768", new ReservedStringExpression("x,hello,y").expand(variables));
assertEquals("/foo/bar,1024", new ReservedStringExpression("path,x").expand(variables));
assertEquals("/foo/b", new ReservedStringExpression("path:6").expand(variables));
}
public void testReservedStringMatch() throws Exception {
URITemplate template = new URITemplate("/admin/~{+user}");
Map<String, String> var = new HashMap<String, String>();
assertTrue(template.matches("/admin/~foo!bar", var));
assertEquals("foo!bar", var.get("user"));
assertFalse(template.matches("/admi/~hiranya", var));
assertFalse(template.matches("/admin/hiranya", var));
assertFalse(template.matches("/admin/~hiranya/foo", var));
var.clear();
template = new URITemplate("/words?{+query}");
assertTrue(template.matches("/words?a=5", var));
assertEquals("a=5", var.get("query"));
var.clear();
template = new URITemplate("/{symbol}/feed.rss{+queryStr}");
assertTrue(template.matches("/APPLE/feed.rss?max=30", var));
assertEquals("?max=30", var.get("queryStr"));
var.clear();
assertFalse(template.matches("/APPLE?max=30", var));
}
public void testFragmentExpansion() throws Exception {
assertEquals("#value", new FragmentExpression("var").expand(variables));
assertEquals("#Hello%20World!", new FragmentExpression("hello").expand(variables));
assertEquals("#50%25", new FragmentExpression("half").expand(variables));
assertEquals("#", new FragmentExpression("empty").expand(variables));
assertNull(new FragmentExpression("undef").expand(variables));
assertEquals("#1024,Hello%20World!,768", new FragmentExpression("x,hello,y").expand(variables));
assertEquals("#/foo/bar,1024", new FragmentExpression("path,x").expand(variables));
assertEquals("#/foo/b", new FragmentExpression("path:6").expand(variables));
}
public void testFragmentMatch() throws Exception {
URITemplate template = new URITemplate("/admin{#foo}");
Map<String, String> var = new HashMap<String, String>();
assertTrue(template.matches("/admin#test", var));
assertEquals("test", var.get("foo"));
var.clear();
assertFalse(template.matches("/admin/test", var));
assertTrue(template.matches("/admin#test,value", var));
assertEquals("test,value", var.get("foo"));
}
public void testLabelExpansion() throws Exception {
assertEquals(".fred", new LabelExpression("who").expand(variables));
assertEquals(".fred.fred", new LabelExpression("who,who").expand(variables));
assertEquals(".50%25.fred", new LabelExpression("half,who").expand(variables));
assertEquals(".example.com", new LabelExpression("dom").expand(variables));
assertEquals(".", new LabelExpression("empty").expand(variables));
assertNull(new LabelExpression("undef").expand(variables));
assertEquals(".val", new LabelExpression("var:3").expand(variables));
}
public void testLabelMatch() throws Exception {
URITemplate template = new URITemplate("/admin{.action}");
Map<String, String> var = new HashMap<String, String>();
assertTrue(template.matches("/admin.do", var));
assertEquals("do", var.get("action"));
assertFalse(template.matches("/admin.do.bad", var));
var.clear();
template = new URITemplate("/admin{.action,sub}");
assertTrue(template.matches("/admin.do.view", var));
assertEquals("do", var.get("action"));
assertEquals("view", var.get("sub"));
}
public void testPathSegmentExpansion() throws Exception {
assertEquals("/fred", new PathSegmentExpression("who").expand(variables));
assertEquals("/fred/fred", new PathSegmentExpression("who,who").expand(variables));
assertEquals("/50%25/fred", new PathSegmentExpression("half,who").expand(variables));
assertEquals("/fred/me%2Ftoo", new PathSegmentExpression("who,dub").expand(variables));
assertEquals("/value/", new PathSegmentExpression("var,empty").expand(variables));
assertEquals("/value", new PathSegmentExpression("var,undef").expand(variables));
assertEquals("/value/1024", new PathSegmentExpression("var,x").expand(variables));
assertEquals("/v/value", new PathSegmentExpression("var:1,var").expand(variables));
}
public void testPathSegmentMatch() throws Exception {
URITemplate template = new URITemplate("/admin{/context}");
Map<String, String> var = new HashMap<String, String>();
assertTrue(template.matches("/admin/foo", var));
assertEquals("foo", var.get("context"));
assertFalse(template.matches("/admin.do.bad", var));
var.clear();
template = new URITemplate("/admin{/action,sub}");
assertTrue(template.matches("/admin/do/view", var));
assertEquals("do", var.get("action"));
assertEquals("view", var.get("sub"));
}
public void testComaSeperatedSimpleExpressions() throws Exception{
Map<String, String> var = new HashMap<String, String>();
URITemplate template = new URITemplate("/admin/{one},{two},{three}*");
assertTrue(template.matches("/admin/param1,param2,param3", var));
assertTrue(template.matches("/admin/param1,param2,param3/test", var));
assertTrue(template.matches("/admin/param1,param2,param3?query=param", var));
assertEquals("param1", var.get("one"));
assertEquals("param2", var.get("two"));
assertEquals("param3", var.get("three"));
var.clear();
}
public void testOptionalQueryParameters() throws Exception{
Map<String, String> var = new HashMap<String, String>();
URITemplate template = new URITemplate("/admin/{one}");
assertTrue(template.matches("/admin/param1?query=parameter", var));
assertEquals("param1", var.get("one"));
var.clear();
assertTrue(template.matches("/admin/param1", var));
assertEquals("param1", var.get("one"));
var.clear();
assertFalse(template.matches("/admin/param1/param2?query=parameter", var));
template = new URITemplate("/admin/{one}?query={two}");
assertTrue(template.matches("/admin/param1?query=param2", var));
assertEquals("param1", var.get("one"));
assertEquals("param2", var.get("two"));
var.clear();
assertFalse(template.matches("/admin/param1/param2?query=parameter", var));
assertFalse(template.matches("/admin/param1", var));
}
}