/*
* 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.pull;
import static com.alibaba.citrus.test.TestUtil.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.citrus.service.pull.support.ConstantTool;
import com.alibaba.citrus.service.pull.support.ConstantToolSet;
import com.alibaba.citrus.service.pull.tool.SimpleTool;
import com.alibaba.citrus.service.pull.tool.SimpleToolSet;
import com.alibaba.citrus.util.Utils;
import org.junit.Test;
import org.springframework.beans.FatalBeanException;
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
import org.springframework.context.ApplicationContext;
public class PullServiceConfigTests extends AbstractPullServiceConfigTests {
private static final int constantCount;
private static final int utilCount;
private Map<String, Object> tools;
static {
ConstantToolSet myconst = new ConstantToolSet();
myconst.setConstantClass(HttpServletResponse.class);
constantCount = getFieldValue(myconst, "constants", Map.class).size();
utilCount = Utils.getUtils().size();
}
@Test
public void noId() {
try {
createContext("pull/services-pull-wrong-no-id-1.xml");
fail();
} catch (BeanDefinitionParsingException e) {
assertThat(e, exception("Unnamed bean definition"));
}
try {
createContext("pull/services-pull-wrong-no-id-2.xml");
fail();
} catch (FatalBeanException e) {
assertThat(e, exception(IllegalArgumentException.class, "missing id for tool", "myString"));
}
}
@Test
public void dupId() {
try {
createContext("pull/services-pull-wrong-dup-id.xml");
fail();
} catch (FatalBeanException e) {
assertThat(e, exception(IllegalArgumentException.class, "duplicated tool or tool-set ID: constant"));
}
}
@Test
public void toolNames() {
factory = createContext("pull/services-pull-names.xml");
pullService = (PullService) factory.getBean("toolNames");
// 根据element自动生成toolName
assertToolName("constants", ConstantTool.class); // <constants />
assertToolName("myInner", InnerTool.class); // <my-inner-tool />
// 根据类名自动生成toolName
assertToolName("inner", InnerTool.class); // <factory class="...$InnerTool" />
assertToolName("simple", SimpleTool.class); // <factory class="...SimpleTool" />
assertToolName("simple", SimpleToolSet.class, "toolNames2"); // <factory class="...SimpleToolSet" />
// 指定toolName
assertToolName("myconst", ConstantTool.class); // <constants id="myconst" />
assertToolName("inner3", InnerTool.class); // <my-inner-tool id="inner3" />
assertToolName("simple2", SimpleTool.class); // <factory id="inner3" class="...SimpleTool" />
// 根据ref生成toolName
assertToolName("outterSimple", SimpleTool.class); // <factory ref="outterSimple" />
// 根据class attribute生成toolName
assertToolName("innerBean", InnerBean.class); // <bean-tool class="...$InnerBean" />
}
private void assertToolName(String toolName, Class<?> type) {
assertToolName(toolName, type, "toolNames");
}
private void assertToolName(String toolName, Class<?> type, String beanName) {
pullService = (PullService) factory.getBean(beanName);
Object tool = pullService.getContext().pull(toolName);
assertNotNull(beanName + "." + toolName, tool);
assertThat(tool, instanceOf(type));
}
@Test
public void toolSet() throws Exception {
prepareWebEnvironment(null);
pullService = (PullService) factory.getBean("pullService");
tools = pullService.getTools();
// constantToolSet
ConstantToolSet myconst = (ConstantToolSet) tools.get("myconst");
assertNotNull(myconst);
assertNotNull(tools.get("SC_NOT_FOUND"));
assertNotNull(myconst.get("SC_NOT_FOUND"));
// utilToolSet
assertNotNull(tools.get("utils"));
assertNotNull(tools.get("stringUtil"));
assertSame(Utils.getUtils().get("stringUtil"), tools.get("stringUtil"));
assertSame(Utils.getUtils().get("utils"), tools.get("utils"));
}
@Test
public void nonSingleton() throws Exception {
pullService = (PullService) factory.getBean("pullService");
// ------------------
// request 1
// ------------------
prepareWebEnvironment("?id=runtime1");
Object object1 = getTool("object1");
Object object2 = getTool("object2");
Object object3 = getTool("object3");
Object objectInSet1 = getTool("inset1");
Object objectInSet2 = getTool("runtime1"); // id由请求的参数决定
assertNotNull(object1);
assertNotNull(object2);
assertNotNull(object3);
assertNotNull(objectInSet1);
assertNotNull(objectInSet2);
assertSame(object1, getTool("object1"));
assertSame(object2, getTool("object2"));
assertSame(object3, getTool("object3"));
assertSame(objectInSet1, getTool("inset1"));
assertSame(objectInSet2, getTool("runtime1"));
// ------------------
// request 2
// ------------------
prepareWebEnvironment("?id=runtime2");
assertNotNull(getTool("object1"));
assertNotNull(getTool("object2"));
assertNotNull(getTool("object3"));
assertNotNull(getTool("inset1"));
assertNull(getTool("runtime1"));
assertNotNull(getTool("runtime2")); // id由请求的参数决定
assertNotSame(object1, getTool("object1"));
assertNotSame(object2, getTool("object2"));
assertNotSame(object3, getTool("object3"));
assertNotSame(objectInSet1, getTool("inset1"));
assertNotSame(objectInSet2, getTool("runtime2"));
}
@Test
public void sharing() throws Exception {
ApplicationContext parentContext = createContext("pull/services-pull-parent.xml");
ApplicationContext factory1 = createContext("pull/services-pull-sub.xml", parentContext);
ApplicationContext factory2 = createContext("pull/services-pull-sub.xml", parentContext);
PullService sub1 = (PullService) factory1.getBean("pullService");
PullService sub2 = (PullService) factory2.getBean("pullService");
assertNotNull(getFieldValue(sub1, "parent", null));
assertNotNull(getFieldValue(sub2, "parent", null));
prepareWebEnvironment("?parent=parentRuntime2&sub=subRuntime2");
// parentObject is shared among subs
assertSameAndNotNull(sub1.getContext().pull("parentSingleton1"), sub2.getContext().pull("parentSingleton1"));
assertSameAndNotNull(sub1.getContext().pull("parentSingleton2"), sub2.getContext().pull("parentSingleton2"));
assertSameAndNotNull(sub1.getContext().pull("parentSingleton3"), sub2.getContext().pull("parentSingleton3"));
assertSameAndNotNull(sub1.getContext().pull("parentPrototype1"), sub2.getContext().pull("parentPrototype1"));
assertSameAndNotNull(sub1.getContext().pull("parentPrototype2"), sub2.getContext().pull("parentPrototype2"));
assertSameAndNotNull(sub1.getContext().pull("parentPrototype3"), sub2.getContext().pull("parentPrototype3"));
assertSameAndNotNull(sub1.getContext().pull("parentRuntime1"), sub2.getContext().pull("parentRuntime1"));
assertSameAndNotNull(sub1.getContext().pull("parentRuntime2"), sub2.getContext().pull("parentRuntime2"));
// subs objects
assertNotSameAndNotNull(sub1.getContext().pull("subSingleton1"), sub2.getContext().pull("subSingleton1"));
assertNotSameAndNotNull(sub1.getContext().pull("subSingleton2"), sub2.getContext().pull("subSingleton2"));
assertNotSameAndNotNull(sub1.getContext().pull("subSingleton3"), sub2.getContext().pull("subSingleton3"));
assertNotSameAndNotNull(sub1.getContext().pull("subPrototype1"), sub2.getContext().pull("subPrototype1"));
assertNotSameAndNotNull(sub1.getContext().pull("subPrototype2"), sub2.getContext().pull("subPrototype2"));
assertNotSameAndNotNull(sub1.getContext().pull("subPrototype3"), sub2.getContext().pull("subPrototype3"));
assertNotSameAndNotNull(sub1.getContext().pull("subRuntime1"), sub2.getContext().pull("subRuntime1"));
assertNotSameAndNotNull(sub1.getContext().pull("subRuntime2"), sub2.getContext().pull("subRuntime2"));
}
private void assertSameAndNotNull(Object o1, Object o2) {
assertNotNull(o1);
assertNotNull(o2);
assertSame(o1, o2);
}
private void assertNotSameAndNotNull(Object o1, Object o2) {
assertNotNull(o1);
assertNotNull(o2);
assertNotSame(o1, o2);
}
@Test
public void getTools() throws Exception {
prepareWebEnvironment("?id=inset2");
pullService = (PullService) factory.getBean("pullService");
tools = pullService.getTools();
assertNotNull(tools.get("myconst"));
assertNotNull(tools.get("myconst2"));
assertNotNull(tools.get("object1"));
assertNotNull(tools.get("object2"));
assertNotNull(tools.get("object3"));
assertNotNull(tools.get("inset1"));
assertNotNull(tools.get("inset2"));
assertNotNull(tools.get("mymap"));
assertNotNull(tools.get("mylist2"));
assertEquals(constantCount + utilCount + 10, tools.size());
}
private Object getTool(String name) {
return pullService.getContext().pull(name);
}
}