/*
* Copyright 2002-2004 The Apache Software Foundation.
*
* 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 test.properties;
import junit.framework.TestCase;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.configuration.BasicClientConfig;
import org.apache.axis.configuration.BasicServerConfig;
import org.apache.axis.configuration.SimpleProvider;
import org.apache.axis.handlers.soap.SOAPService;
import org.apache.axis.providers.java.RPCProvider;
import org.apache.axis.server.AxisServer;
import org.apache.axis.transport.local.LocalTransport;
/**
* Test scoped properties. This test confirms that MessageContext.getProperty
* will correctly defer to a higher-level property scope (the Call on the
* client side, the SOAPService on the server side) to obtain values for
* properties that are not explicitly set in the MessageContext itself.
*
* @author Glen Daniels (gdaniels@apache.org)
*/
public class TestScopedProperties extends TestCase {
public static final String PROP_NAME = "test.property";
public static final String CLIENT_VALUE = "client-side property value!";
public static final String SERVER_VALUE = "this is the server side value";
public static final String OVERRIDE_NAME = "override.property";
public static final String OVERRIDE_VALUE = "The REAL value!";
private SOAPService service;
private PropertyHandler serverHandler = new PropertyHandler();
private SimpleProvider config;
private AxisServer server;
public TestScopedProperties(String s) {
super(s);
}
/**
* Sets up the server side for this test. We deploy a service with
* a PropertyHandler as a request handler, and PropertyHandler as the
* backend class as well. We set an option on the service to a well-
* known value (PROP_NAME -> PROP_VALUE), and also set an option on
* the service (OVERRIDE_NAME) which we expect to be overriden by
* an explicit setting in the MessageContext.
*/
protected void setUp() throws Exception {
config = new BasicServerConfig();
server = new AxisServer(config);
// Deploy a service which contains an option that we expect to be
// available by asking the MessageContext in the service method (see
// PropertyHandler.java).
RPCProvider provider = new RPCProvider();
service = new SOAPService(serverHandler, provider, null);
service.setOption("className", PropertyHandler.class.getName());
service.setOption("allowedMethods", "*");
// Here's the interesting property.
service.setOption(PROP_NAME, SERVER_VALUE);
// Also set a property which we expect to be overriden by an explicit
// value in the MessageContext (see PropertyHandler.invoke()). We
// should never see this value.
service.setOption(OVERRIDE_NAME, SERVER_VALUE);
config.deployService("service", service);
}
/**
* Basic scoped properties test. Set up a client side service with a
* PropertyHandler as the request handler, then set a property on the
* Call which we expect to be available when the request handler queries
* the MessageContext. Call the backend service, and make sure the
* client handler, the server handler, and the result all agree on what
* the values should be.
*/
public void testScopedProperties() throws Exception {
BasicClientConfig config = new BasicClientConfig();
PropertyHandler clientHandler = new PropertyHandler();
SOAPService clientService = new SOAPService(clientHandler, null, null);
config.deployService("service", clientService);
Service s = new Service(config);
Call call = new Call(s);
// Set a property on the Call which we expect to be available via
// the MessageContext in the client-side handler.
call.setProperty(PROP_NAME, CLIENT_VALUE);
LocalTransport transport = new LocalTransport(server);
transport.setRemoteService("service");
call.setTransport(transport);
// Make the call.
String result = (String)call.invoke("service",
"testScopedProperty",
new Object [] { });
assertEquals("Returned scoped property wasn't correct",
SERVER_VALUE,
result);
// Confirm that both the client and server side properties were
// correctly read.
assertEquals("Client-side scoped property wasn't correct",
CLIENT_VALUE,
clientHandler.getPropVal());
assertEquals("Server-side scoped property wasn't correct",
SERVER_VALUE,
serverHandler.getPropVal());
}
/**
* Test overriding a property that's set in the service with an explicit
* setting in the MessageContext. The server-side handler will set the
* OVERRIDDE_NAME property, and the "testOverrideProperty" method will
* return the value it sees, which should match.
*/
public void testMessageContextOverride() throws Exception {
// Only the server side matters on this one, so don't bother with
// special client config.
Call call = new Call(new Service());
LocalTransport transport = new LocalTransport(server);
transport.setRemoteService("service");
call.setTransport(transport);
// Make the call.
String result = (String)call.invoke("service",
"testOverrideProperty",
new Object [] { });
assertEquals("Overriden property value didn't match",
OVERRIDE_VALUE,
result);
}
/**
* Test of three-level client scopes (MC -> service -> Call).
*
* Set a property on the Call, then try the invocation. The client-side
* handler should see the Call value. Then set the same property to a
* different value in the client-side service object, and confirm that
* when we invoke again we see the new value.
*/
public void testFullClientScopes() throws Exception {
Call call = new Call(new Service());
PropertyHandler clientHandler = new PropertyHandler();
SOAPService clientService = new SOAPService(clientHandler, null, null);
call.setSOAPService(clientService);
// Set a property on the Call which we expect to be available via
// the MessageContext in the client-side handler.
call.setProperty(PROP_NAME, CLIENT_VALUE);
LocalTransport transport = new LocalTransport(server);
transport.setRemoteService("service");
call.setTransport(transport);
// First call should get the value from the Call object.
call.invoke("testOverrideProperty", new Object [] { });
assertEquals("Client-side scoped property from Call wasn't correct",
CLIENT_VALUE,
clientHandler.getPropVal());
// Now set the same option on the client service, which should
// take precedence over the value in the Call.
clientService.setOption(PROP_NAME, OVERRIDE_VALUE);
// Second call should now get the value from the client service.
call.invoke("testOverrideProperty", new Object [] { });
assertEquals("Client-side scoped property from service wasn't correct",
OVERRIDE_VALUE,
clientHandler.getPropVal());
}
}
|