/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * 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 com.alibaba.citrus.service.uribroker.uri; import static com.alibaba.citrus.test.TestUtil.*; import static com.alibaba.citrus.util.BasicConstant.*; import static com.alibaba.citrus.util.CollectionUtil.*; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Iterator; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.alibaba.citrus.service.uribroker.interceptor.URIBrokerPathInterceptor; import com.alibaba.citrus.service.uribroker.uri.URIBroker.URIType; import com.alibaba.citrus.springext.util.ProxyTargetFactory; import com.alibaba.citrus.util.i18n.LocaleUtil; import org.junit.Test; public class GenericURIBrokerTests extends AbstractURIBrokerFeaturesTests<GenericURIBroker> { @Override protected void setupParentBroker(GenericURIBroker parent) { super.setupParentBroker(parent); parent.setURIType(URIType.absolute); parent.setBaseURI("http://www.alibaba.com/a/../hello/world"); parent.setServerScheme("https"); parent.setServerName("localhost"); parent.setServerPort(443); parent.setLoginUser("user"); parent.setLoginPassword("pass"); parent.setReference("ref"); parent.addPath("/aa/bb"); parent.addQueryData("a", 1); parent.addQueryData("b", 2); } @Override protected void setupBroker(GenericURIBroker broker) { super.setupBroker(broker); broker.setURIType(URIType.relative); broker.setBaseURI("http://www.taobao.com//hello/world"); broker.setServerScheme("http"); broker.setServerName("taobao.com"); broker.setServerPort(8888); broker.setLoginUser("user2"); broker.setLoginPassword("pass2"); broker.setReference("ref2"); broker.addPath("/cc/dd"); broker.addQueryData("a", 3); broker.addQueryData("a", 4); broker.addQueryData("c", 4); } @Override protected void assertParentBroker(GenericURIBroker broker) { super.assertParentBroker(broker); assertEquals(URIType.absolute, broker.getURIType()); assertEquals("http://www.alibaba.com/hello/world", broker.getBaseURI()); assertEquals("https", broker.getServerScheme()); assertEquals("localhost", broker.getServerName()); assertEquals(443, broker.getServerPort()); assertEquals("user", broker.getLoginUser()); assertEquals("pass", broker.getLoginPassword()); assertEquals("ref", broker.getReference()); assertEquals("/aa/bb", broker.getPath()); assertEquals("/aa/bb", broker.getPath()); assertArrayEquals(new String[] { "aa", "bb" }, broker.getPathElements().toArray(new String[broker.getPathElements().size()])); assertEquals(2, broker.getQuery().size()); Iterator<Map.Entry<String, Object>> i = broker.getQuery().entrySet().iterator(); assertEquals("a=1", toString(i.next())); assertEquals("b=2", toString(i.next())); } @Override protected void assertBroker(GenericURIBroker broker) { super.assertBroker(broker); assertEquals(URIType.relative, broker.getURIType()); assertEquals("http://www.taobao.com/hello/world", broker.getBaseURI()); assertEquals("http", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(8888, broker.getServerPort()); assertEquals("user2", broker.getLoginUser()); assertEquals("pass2", broker.getLoginPassword()); assertEquals("ref2", broker.getReference()); assertEquals("/aa/bb/cc/dd", broker.getPath()); assertArrayEquals(new String[] { "aa", "bb", "cc", "dd" }, broker.getPathElements().toArray(new String[broker.getPathElements().size()])); assertEquals(3, broker.getQuery().size()); Iterator<Map.Entry<String, Object>> i = broker.getQuery().entrySet().iterator(); assertEquals("a=[1, 3, 4]", toString(i.next())); assertEquals("b=2", toString(i.next())); assertEquals("c=4", toString(i.next())); } private String toString(Map.Entry<String, Object> entry) { String id = entry.getKey(); Object values = entry.getValue(); if (values instanceof String[]) { return id + "=" + Arrays.toString((String[]) values); } else { return id + "=" + values; } } @Override protected void assertAfterReset_noParent(GenericURIBroker broker) { super.assertAfterReset_noParent(broker); assertEquals(null, broker.getURIType()); assertEquals(null, broker.getBaseURI()); assertEquals(null, broker.getServerScheme()); assertEquals(null, broker.getServerName()); assertEquals(-1, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals(null, broker.getReference()); assertTrue(broker.getQuery().isEmpty()); assertEquals("", broker.getPath()); assertTrue(broker.getPathElements().isEmpty()); } @Test public void reset_withRequest() { // 空broker,not request aware,web环境 request = getMockRequest("https", "taobao.com", 8888); broker.setRequest(request); broker.setRequestAware(false); assertFalse(broker.isRequestAware()); request.getServerName(); // no exception broker.reset(); assertEquals(null, broker.getServerScheme()); assertEquals(null, broker.getServerName()); assertEquals(-1, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals(null, broker.getReference()); // 空broker,request aware, 非web环境 request = getMockRequest(); broker.setRequest(request); broker.setRequestAware(true); assertTrue(broker.isRequestAware()); try { ((ProxyTargetFactory) request).getObject(); fail(); } catch (IllegalStateException e) { } broker.reset(); assertEquals(null, broker.getServerScheme()); assertEquals(null, broker.getServerName()); assertEquals(-1, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals(null, broker.getReference()); // 空broker,request aware web环境 request = getMockRequest("https", "taobao.com", 8888); broker.setRequest(request); broker.setRequestAware(true); assertTrue(broker.isRequestAware()); request.getServerName(); // no exception broker.reset(); assertEquals("https", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(8888, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals(null, broker.getReference()); // 非空broker, request aware, web环境 GenericURIBroker parent = newInstance(); parent.setServerName("localhost"); request = getMockRequest("https", "taobao.com", 8888); broker.setRequest(request); broker.setRequestAware(true); broker.setParent(parent); assertTrue(broker.isRequestAware()); request.getServerName(); // no exception broker.reset(); assertEquals(null, broker.getServerScheme()); assertEquals("localhost", broker.getServerName()); assertEquals(-1, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals(null, broker.getReference()); } @Test public void setURIType() { // default value assertEquals(null, broker.getURIType()); // set value broker.autoURI(); assertEquals(URIType.auto, broker.getURIType()); broker.fullURI(); assertEquals(URIType.full, broker.getURIType()); broker.absoluteURI(); assertEquals(URIType.absolute, broker.getURIType()); broker.relativeURI(); assertEquals(URIType.relative, broker.getURIType()); } @Test public void setBaseURI() { // init value assertNull(broker.getBaseURI()); // set empty broker.setBaseURI(null); assertNull(broker.getBaseURI()); broker.setBaseURI(" "); assertNull(broker.getBaseURI()); // set unnormalized uri broker.setBaseURI("http://localhost/aaa/..//bbb"); assertEquals("http://localhost/bbb", broker.getBaseURI()); // set null broker.setBaseURI(null); assertNull(broker.getBaseURI()); } @Test public void setServerURI() { // 设置broker.autoReset=true,确保getServerURI不会reset broker broker = (GenericURIBroker) broker.fork(); assertTrue(broker.isAutoReset()); // empty try { broker.setServerURI((String) null); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("serverURI")); } try { broker.setServerURI(" "); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("serverURI")); } // full uri broker.reset(); broker.addQueryData("x", 1); broker.setServerURI(" https://user:pass@taobao.com:8888/aaa/bbb/ccc?a=1#ref "); assertEquals("https", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(8888, broker.getServerPort()); assertEquals("user", broker.getLoginUser()); assertEquals("pass", broker.getLoginPassword()); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); assertEquals("ref", broker.getReference()); assertArrayEquals(new String[] { "x", "a" }, broker.getQuery().keySet().toArray(EMPTY_STRING_ARRAY)); broker.setReference("ref2"); assertEquals("https://user:pass@taobao.com:8888/aaa/bbb/ccc", broker.getServerURI()); assertEquals("https://user:pass@taobao.com:8888/aaa/bbb/ccc?x=1&a=1#ref2", broker.toString()); // without password broker.reset(); broker.addQueryData("x", 1); broker.setServerURI(" https://user@taobao.com:8888/aaa/bbb/ccc?a=1#ref "); assertEquals("https", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(8888, broker.getServerPort()); assertEquals("user", broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); assertEquals("ref", broker.getReference()); assertArrayEquals(new String[] { "x", "a" }, broker.getQuery().keySet().toArray(EMPTY_STRING_ARRAY)); broker.setReference("ref2"); assertEquals("https://user@taobao.com:8888/aaa/bbb/ccc", broker.getServerURI()); assertEquals("https://user@taobao.com:8888/aaa/bbb/ccc?x=1&a=1#ref2", broker.toString()); // without user broker.reset(); broker.addQueryData("x", 1); broker.setServerURI(" https://taobao.com:8888/aaa/bbb/ccc?a=1#ref "); assertEquals("https", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(8888, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); assertEquals("ref", broker.getReference()); assertArrayEquals(new String[] { "x", "a" }, broker.getQuery().keySet().toArray(EMPTY_STRING_ARRAY)); broker.setReference("ref2"); assertEquals("https://taobao.com:8888/aaa/bbb/ccc", broker.getServerURI()); assertEquals("https://taobao.com:8888/aaa/bbb/ccc?x=1&a=1#ref2", broker.toString()); // without port broker.reset(); broker.addQueryData("x", 1); broker.setServerURI(" https://taobao.com/aaa/bbb/ccc?a=1#ref "); assertEquals("https", broker.getServerScheme()); assertEquals("taobao.com", broker.getServerName()); assertEquals(-1, broker.getServerPort()); assertEquals(null, broker.getLoginUser()); assertEquals(null, broker.getLoginPassword()); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); assertEquals("ref", broker.getReference()); assertArrayEquals(new String[] { "x", "a" }, broker.getQuery().keySet().toArray(EMPTY_STRING_ARRAY)); broker.setReference("ref2"); assertEquals("https://taobao.com/aaa/bbb/ccc", broker.getServerURI()); assertEquals("https://taobao.com/aaa/bbb/ccc?x=1&a=1#ref2", broker.toString()); // set twice broker.reset(); broker.addQueryData("x", 1); broker.setServerURI("http://taobao.com/aaa/bbb/ccc?a=1"); broker.setServerURI("http://taobao.com/aaa/bbb/ccc"); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); broker.setReference("ref2"); assertEquals("http://taobao.com/aaa/bbb/ccc", broker.getServerURI()); assertEquals("http://taobao.com/aaa/bbb/ccc?x=1&a=1#ref2", broker.toString()); // with interceptor, URIType=relative broker.reset(); broker.addQueryData("x", 1); broker.setURIType(URIType.relative); broker.setBaseURI("http://taobao.com/"); broker.setServerURI("http://taobao.com/aaa/bbb/ccc"); broker.addInterceptor(new URIBrokerPathInterceptor() { public void perform(URIBroker broker) { broker.addQueryData("y", 2); broker.setReference("ref2"); } public String perform(URIBroker broker, String path) { return "/hello" + path; } }); assertEquals("http://taobao.com/hello/aaa/bbb/ccc", broker.getServerURI()); assertEquals("hello/aaa/bbb/ccc?x=1&y=2#ref2", broker.toString()); } @Test public void setServerScheme() { // init value == null assertNull(broker.getServerScheme()); // empty value broker.setServerScheme(null); assertNull(broker.getServerScheme()); broker.setServerScheme(" "); assertEquals("", broker.getServerScheme()); // simple value broker.setServerScheme(" http"); assertEquals("http", broker.getServerScheme()); } @Test public void setServerName() { // init value == null assertNull(broker.getServerName()); // empty value broker.setServerName(null); assertNull(broker.getServerName()); broker.setServerName(" "); assertEquals("", broker.getServerName()); // simple value broker.setServerName(" taobao"); assertEquals("taobao", broker.getServerName()); } @Test public void setServerPort() { // init value == -1 assertEquals(-1, broker.getServerPort()); // empty value broker.setServerPort(0); assertEquals(-1, broker.getServerPort()); broker.setServerPort(-10); assertEquals(-1, broker.getServerPort()); // simple value broker.setServerPort(8080); assertEquals(8080, broker.getServerPort()); } @Test public void setLoginUser() { // init value == null assertNull(broker.getLoginUser()); // empty value broker.setLoginUser(null); assertNull(broker.getLoginUser()); broker.setLoginUser(" "); assertEquals("", broker.getLoginUser()); // simple value broker.setLoginUser(" user"); assertEquals("user", broker.getLoginUser()); } @Test public void setLoginPassword() { // init value == null assertNull(broker.getLoginPassword()); // empty value broker.setLoginPassword(null); assertNull(broker.getLoginPassword()); broker.setLoginPassword(" "); assertEquals("", broker.getLoginPassword()); // simple value broker.setLoginPassword(" pass"); assertEquals("pass", broker.getLoginPassword()); } @Test public void setReference() { // init value == null assertNull(broker.getReference()); // empty value broker.setReference(null); assertNull(broker.getReference()); broker.setReference(" "); assertEquals("", broker.getReference()); // simple value broker.setReference(" ref"); assertEquals("ref", broker.getReference()); } @Test public void pathSegment() { class MyBroker extends URIBroker { @Override protected int getPathSegmentCount() { return 3; } @Override protected URIBroker newInstance() { return new MyBroker(); } } URIBroker broker = new MyBroker(); // wrong segment for (int i = 0; i < 8; i++) { int segment = -1; try { switch (i) { case 0: broker.getPathSegment(segment = -1); break; case 1: broker.getPathSegment(segment = 3); break; case 2: broker.getPathSegmentAsString(segment = -1); break; case 3: broker.getPathSegmentAsString(segment = 3); break; case 4: broker.addPathSegment(segment = -1, ""); break; case 5: broker.addPathSegment(segment = 3, ""); break; case 6: broker.clearPathSegment(segment = -1); break; case 7: broker.clearPathSegment(segment = 3); break; } fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("segment index " + segment + " out of bound [0, 3)")); } } assertEquals("http:///", broker.toString()); // add broker.addPathSegment(2, "c11/c22"); broker.addPathSegment(0, "a11/a22"); assertEquals("http:///a11/a22/c11/c22", broker.toString()); broker.addPathSegment(1, "b11/b22"); assertEquals("http:///a11/a22/b11/b22/c11/c22", broker.toString()); // set / clear and add broker.setPathSegment(1, createStringList("B11", "B22")); assertEquals("http:///a11/a22/B11/B22/c11/c22", broker.toString()); broker.clearPathSegment(0); broker.addPathSegment(0, "A11/A22"); assertEquals("http:///A11/A22/B11/B22/c11/c22", broker.toString()); broker.clearPathSegment(2); broker.addPathSegment(2, "C11/C22"); assertEquals("http:///A11/A22/B11/B22/C11/C22", broker.toString()); // get assertEquals("/A11/A22", broker.getPathSegmentAsString(0)); assertEquals("/B11/B22", broker.getPathSegmentAsString(1)); assertEquals("/C11/C22", broker.getPathSegmentAsString(2)); assertArrayEquals(new String[] { "A11", "A22" }, broker.getPathSegment(0).toArray(new String[2])); assertArrayEquals(new String[] { "B11", "B22" }, broker.getPathSegment(1).toArray(new String[2])); assertArrayEquals(new String[] { "C11", "C22" }, broker.getPathSegment(2).toArray(new String[2])); } @Test public void setPath_addPath_clearPath() { broker.clearPath(); // addPath / addPath broker.addPath(" /aaa//\\ bbb \\ ccc// "); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); broker.addPath("ddd"); assertEquals("/aaa/bbb/ccc/ddd", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc", "ddd" }, broker.getPathElements().toArray(new String[0])); // clearPath broker.clearPath(); // addPath / setPath broker.addPath(" /aaa//\\ bbb \\ ccc// "); assertEquals("/aaa/bbb/ccc", broker.getPath()); assertArrayEquals(new String[] { "aaa", "bbb", "ccc" }, broker.getPathElements().toArray(new String[0])); broker.setPathElements(createStringList("ddd", " /eee/fff ")); assertEquals("/ddd/eee/fff", broker.getPath()); assertArrayEquals(new String[] { "ddd", "eee", "fff" }, broker.getPathElements().toArray(new String[0])); } @Test public void setQuery_clearQuery() { // hasQuery broker.clearQuery(); // setQuery Map<String, Object> query = createLinkedHashMap(); query.put(" a ", null); // null value query.put(" b ", new Object[] { 123, "456", null }); // object array query.put(" c ", 123); // scalar value broker.setQuery(query); assertEquals(3, broker.getQuery().size()); assertEquals("", broker.getQuery().get("a")); assertArrayEquals(new String[] { "123", "456", "" }, (String[]) broker.getQuery().get("b")); assertEquals("123", broker.getQuery().get("c")); // clearQuery broker.clearQuery(); } @Test public void setQueryData() { // empty id try { broker.setQueryData(null, "test"); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } try { broker.setQueryData(" ", "test"); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } // null value -> empty_string broker.setQueryData(" id ", null); assertEquals("", broker.getQuery().get("id")); // String[] values,替换其中的null -> empty_string broker.setQueryData("id", new String[] { null, "aa", " bb " }); assertArrayEquals(new String[] { "", "aa", " bb " }, (String[]) broker.getQuery().get("id")); // int[] values broker.setQueryData("id", new int[] { 1, 2, 3 }); assertArrayEquals(new String[] { "1", "2", "3" }, (String[]) broker.getQuery().get("id")); // Object[] values, 替换其中的null -> empty_string broker.setQueryData("id", new Object[] { null, "aa", 3 }); assertArrayEquals(new String[] { "", "aa", "3" }, (String[]) broker.getQuery().get("id")); // scalar value broker.setQueryData("id", 3); assertEquals("3", broker.getQuery().get("id")); } @Test public void getQueryData() { // 无值 assertNull(broker.getQueryData("myid")); // null值 broker.setQueryData("myid", null); assertEquals("", broker.getQueryData("myid")); // 单值 broker.setQueryData("myid", "test"); assertEquals("test", broker.getQueryData("myid")); // 多值 broker.addQueryData("myid", "test2"); assertArrayEquals(new String[] { "test", "test2" }, (String[]) broker.getQuery().get("myid")); assertEquals("test", broker.getQueryData("myid")); } @Test public void addQueryData_Object() { // empty id try { broker.addQueryData(null, 1); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } try { broker.setQueryData(" ", 1); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } // null value broker.addQueryData(" id ", (Object) null); assertEquals("", broker.getQuery().get("id")); // array value try { broker.addQueryData("id", new String[1]); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("use setQueryData(array) instead")); } // Object value broker.addQueryData(" id ", 123); assertArrayEquals(new String[] { "", "123" }, (String[]) broker.getQuery().get("id")); } @Test public void addQueryData_String() { // empty id try { broker.addQueryData(null, "1"); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } try { broker.setQueryData(" ", "1"); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("empty query id")); } // null value broker.addQueryData(" id ", (String) null); assertEquals("", broker.getQuery().get("id")); // remove query data broker.removeQueryData(" id "); assertEquals(null, broker.getQuery().get("id")); // first value broker.addQueryData("id", "aa"); assertEquals("aa", broker.getQuery().get("id")); // second value broker.addQueryData("id", "bb"); assertArrayEquals(new String[] { "aa", "bb" }, (String[]) broker.getQuery().get("id")); // third value broker.addQueryData("id", "cc"); assertArrayEquals(new String[] { "aa", "bb", "cc" }, (String[]) broker.getQuery().get("id")); // fourth value == null broker.addQueryData("id", null); assertArrayEquals(new String[] { "aa", "bb", "cc", "" }, (String[]) broker.getQuery().get("id")); } @Test public void removeQueryData() { broker.removeQueryData("id"); broker.setQueryData("id", "aa"); assertEquals("aa", broker.getQuery().get("id")); broker.removeQueryData(" id "); assertEquals(null, broker.getQuery().get("id")); } @Test public void processPathInterceptors() { processPathInterceptors(true); processPathInterceptors(false); } private void processPathInterceptors(final boolean withLeadingSlash) { GenericURIBroker broker = new GenericURIBroker(); i3 = new URIBrokerPathInterceptor() { public void perform(URIBroker broker) { } public String perform(URIBroker broker, String path) { if (withLeadingSlash) { return "/hello" + path; } else { return "hello" + path; } } }; setupBroker(broker); broker = (GenericURIBroker) broker.fork(); assertEquals("http://user2:pass2@taobao.com:8888/hello/cc/dd?a=3&a=4&c=4#ref2", broker.render()); assertEquals("http://user2:pass2@taobao.com:8888/hello/cc/dd?a=3&a=4&c=4#ref2", broker.render()); } @Test public void charsetEncoding() { GenericURIBroker broker = new GenericURIBroker(); broker.setServerURI("http://taobao.com"); broker.addPath("中国"); broker.addQueryData("中国", "万岁"); // 使用locale context assertNull(broker.getCharset()); LocaleUtil.setContext(Locale.CHINA, "UTF-8"); assertEquals("http://taobao.com/%E4%B8%AD%E5%9B%BD?%E4%B8%AD%E5%9B%BD=%E4%B8%87%E5%B2%81", broker.render()); LocaleUtil.setContext(Locale.CHINA, "GBK"); assertEquals("http://taobao.com/%D6%D0%B9%FA?%D6%D0%B9%FA=%CD%F2%CB%EA", broker.render()); // 指定charset broker.setCharset("UTF-8"); assertEquals("http://taobao.com/%E4%B8%AD%E5%9B%BD?%E4%B8%AD%E5%9B%BD=%E4%B8%87%E5%B2%81", broker.render()); } @Test public void render() { GenericURIBroker broker = new GenericURIBroker(); setupBroker(broker); assertEquals("http://user2:pass2@taobao.com:8888/cc/dd?a=3&a=4&c=4#ref2", broker.render()); // multi-values broker.addQueryData("a", 1); broker.setQueryData("b", new String[] { "2", "3" }); assertEquals("http://user2:pass2@taobao.com:8888/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); // default port broker.setServerPort(80); assertEquals("http://user2:pass2@taobao.com/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); broker.setServerScheme("https"); assertEquals("https://user2:pass2@taobao.com:80/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); broker.setServerPort(443); assertEquals("https://user2:pass2@taobao.com/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); // no userInfo broker.setLoginPassword(null); assertEquals("https://user2@taobao.com/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); broker.setLoginUser(null); assertEquals("https://taobao.com/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3#ref2", broker.render()); // no ref broker.setReference(null); assertEquals("https://taobao.com/cc/dd?a=3&a=4&a=1&c=4&b=2&b=3", broker.render()); // no query broker.clearQuery(); assertEquals("https://taobao.com/cc/dd", broker.render()); // no path broker.clearPath(); assertEquals("https://taobao.com/", broker.render()); // no serverInfo broker.setServerName(null); assertEquals("https:///", broker.render()); // no serverScheme broker.setServerScheme(null); assertEquals("http:///", broker.render()); } @Test public void prerender() { // 情况一,经过init的broker是被预渲染的。 GenericURIBroker parent = newInstance(); setupParentBroker(parent); parent.init(); assertRenderer(parent, true, true, true, "https://user:pass@localhost/aa/bb?a=1&b=2#ref"); assertPrerender((GenericURIBroker) parent.fork()); // 情况二,非autoReset的broker,在fork(true)时,会自动创建一个被预渲染的parent。 parent = (GenericURIBroker) newInstance().fork(); // autoReset=true setupParentBroker(parent); assertRenderer(parent, false, false, false, "https://user:pass@localhost/aa/bb?a=1&b=2#ref"); assertRenderer(parent, false, false, false, "http:///"); setupParentBroker(parent); assertPrerender((GenericURIBroker) parent.fork()); } private void assertPrerender(GenericURIBroker broker) { // serverScheme broker.setServerScheme("http"); assertRenderer(broker, false, true, true, "http://user:pass@localhost:443/aa/bb?a=1&b=2#ref"); // serverName broker.setServerName("taobao.com"); assertRenderer(broker, false, true, true, "https://user:pass@taobao.com/aa/bb?a=1&b=2#ref"); // serverPort broker.setServerPort(123); assertRenderer(broker, false, true, true, "https://user:pass@localhost:123/aa/bb?a=1&b=2#ref"); // loginUser broker.setLoginUser("user1"); assertRenderer(broker, false, true, true, "https://user1:pass@localhost/aa/bb?a=1&b=2#ref"); // loginPassword broker.setLoginPassword("pass1"); assertRenderer(broker, false, true, true, "https://user:pass1@localhost/aa/bb?a=1&b=2#ref"); // setPath broker.setPathElements(createStringList("cc/dd")); assertRenderer(broker, true, false, true, "https://user:pass@localhost/cc/dd?a=1&b=2#ref"); // addPath broker.addPath(null); assertRenderer(broker, true, true, true, "https://user:pass@localhost/aa/bb?a=1&b=2#ref"); broker.addPath("cc"); assertRenderer(broker, true, true, true, "https://user:pass@localhost/aa/bb/cc?a=1&b=2#ref"); // clearPath broker.clearPath(); assertRenderer(broker, true, false, true, "https://user:pass@localhost/?a=1&b=2#ref"); // setQuery Map<String, Object> map = createLinkedHashMap(); map.put("c", new Object[] { 3, 4 }); broker.setQuery(map); assertRenderer(broker, true, true, false, "https://user:pass@localhost/aa/bb?c=3&c=4#ref"); // clearQuery broker.clearQuery(); assertRenderer(broker, true, true, false, "https://user:pass@localhost/aa/bb#ref"); // setQueryData broker.setQueryData("a", 3); assertRenderer(broker, true, true, false, "https://user:pass@localhost/aa/bb?a=3&b=2#ref"); // addQueryData broker.addQueryData("a", 3); assertRenderer(broker, true, true, true, "https://user:pass@localhost/aa/bb?a=1&b=2&a=3#ref"); broker.addQueryData("a", "4"); assertRenderer(broker, true, true, true, "https://user:pass@localhost/aa/bb?a=1&b=2&a=4#ref"); // removeQueryData broker.removeQueryData("a"); assertRenderer(broker, true, true, false, "https://user:pass@localhost/aa/bb?b=2#ref"); } private void assertRenderer(GenericURIBroker broker, boolean server, boolean path, boolean query, String renderResult) { assertEquals(server, broker.renderer.isServerRendered()); assertEquals(path, broker.renderer.isPathRendered()); assertEquals(query, broker.renderer.isQueryRendered()); assertEquals(renderResult, broker.render()); } @Test public void baseURI_request() { broker.setURIType(URIType.absolute); // 以request作为baseURI, requestAware=false/true broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.setRequest(getMockRequest_withRequestURI("http", "www.taobao.com", 80)); broker.setRequestAware(false); assertEquals("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequestAware(true); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); // default scheme/port broker.setRequest(getMockRequest_withRequestURI("http", "www.taobao.com", 80)); broker.setServerScheme(null); broker.setServerPort(-1); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI(null, "www.taobao.com", -1)); broker.setServerScheme(null); broker.setServerPort(-1); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); // matching scheme/server/port broker.setRequest(getMockRequest_withRequestURI(null, "www.taobao.com", 8080)); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); // port diffs assertEquals("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI(null, "www.taobao.com", 8080)); broker.setServerURI("http://www.taobao.com:8080/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI(null, "www.taobao.com", 8080)); broker.setServerURI("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp"); // server diffs assertEquals("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI("http", "www.alibaba.com", 8080)); broker.setServerURI("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI("https", "www.alibaba.com", -1)); broker.setServerURI("http://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp"); // scheme diffs assertEquals("http://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setRequest(getMockRequest_withRequestURI("https", "www.alibaba.com", -1)); broker.setServerURI("https://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); } @Test public void baseURI_path() { broker.setURIType(URIType.absolute); // 设置request,但如有baseURI,则以baseURI为准 broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.setRequest(getMockRequest_withRequestURI("http", "www.taobao.com", 80)); broker.setRequestAware(true); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); // default scheme/port broker.setBaseURI("http://www.taobao.com:80/hello/world/index.html?a=1"); broker.setServerScheme(null); broker.setServerPort(-1); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("http://www.taobao.com/hello/world/index.html?a=1"); broker.setServerScheme(null); broker.setServerPort(-1); assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); // matching scheme/server/port broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html?a=1"); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); // port diffs assertEquals("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html?a=1"); broker.setServerURI("http://www.taobao.com:8080/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html?a=1"); broker.setServerURI("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp"); // server diffs assertEquals("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("http://www.alibaba.com:8080/hello/world/index.html?a=1"); broker.setServerURI("http://www.alibaba.com:8080/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("https://www.alibaba.com/hello/world/index.html?a=1"); broker.setServerURI("http://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp"); // scheme diffs assertEquals("http://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp", broker.toString()); broker.setBaseURI("https://www.alibaba.com/hello/world/index.html?a=1"); broker.setServerURI("https://www.alibaba.com:443/hello/world/aaa/bbb/ccc.jsp"); // matched assertEquals("/hello/world/aaa/bbb/ccc.jsp", broker.toString()); } private HttpServletRequest getMockRequest_withRequestURI(String scheme, String serverName, int port) { HttpServletRequest request = getMockRequest_noReplay(scheme, serverName, port, "/hello", "/world/index.html", null); expect(request.getRequestURI()).andReturn("/hello/world/index.html?a=1&b=2").anyTimes(); replay(request); return request; } @Test public void fullURI() { broker.setBaseURI("http://www.taobao.com/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.addQueryData("test", "value"); assertEquals(null, broker.getURIType()); assertEquals("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setURIType(URIType.full); assertEquals("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp?test=value", broker.toString()); } @Test public void absolutePath() { broker.setBaseURI("http://www.taobao.com/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.addQueryData("test", "value"); broker.setURIType(URIType.absolute); assertEquals("/hello/world/aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/hello/aaa/bbb/ccc.jsp"); assertEquals("/hello/aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("/aaa/bbb/ccc.jsp?test=value", broker.toString()); // server not match broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("http://www.taobao.com/aaa/bbb/ccc.jsp?test=value", broker.toString()); } @Test public void relativeURI() { // baseURI=file broker.setBaseURI("http://www.taobao.com/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.addQueryData("test", "value"); broker.setURIType(URIType.relative); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/hello/aaa/bbb/ccc.jsp"); assertEquals("../aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("../../aaa/bbb/ccc.jsp?test=value", broker.toString()); // baseURI=dir broker.setBaseURI("http://www.taobao.com/hello/world/"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("../../aaa/bbb/ccc.jsp?test=value", broker.toString()); // baseURI=root dir broker.setBaseURI("http://www.taobao.com//"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setBaseURI("http://www.taobao.com"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); // server not match broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("http://www.taobao.com/aaa/bbb/ccc.jsp?test=value", broker.toString()); } @Test public void autoURI() { // baseURI=file broker.setBaseURI("http://www.taobao.com/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/hello/world/aaa/bbb/ccc.jsp"); broker.addQueryData("test", "value"); broker.setURIType(URIType.auto); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/hello/aaa/bbb/ccc.jsp"); assertEquals("/hello/aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("/aaa/bbb/ccc.jsp?test=value", broker.toString()); // baseURI=dir broker.setBaseURI("http://www.taobao.com/hello/world/"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("/aaa/bbb/ccc.jsp?test=value", broker.toString()); // baseURI=root dir broker.setBaseURI("http://www.taobao.com//"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setBaseURI("http://www.taobao.com"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("aaa/bbb/ccc.jsp?test=value", broker.toString()); broker.setBaseURI("http://www.taobao.com"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); broker.addInterceptor(new URIBrokerPathInterceptor() { public void perform(URIBroker broker) { } public String perform(URIBroker broker, String path) { return "aa/bb/cc"; } }); assertEquals("aa/bb/cc?test=value", broker.fork().render()); broker.clearInterceptors(); // server not match broker.setBaseURI("http://www.taobao.com:8080/hello/world/index.html"); broker.setServerURI("http://www.taobao.com/aaa/bbb/ccc.jsp"); assertEquals("http://www.taobao.com/aaa/bbb/ccc.jsp?test=value", broker.toString()); } }