/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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.cxf.ws.policy; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.Bus; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.InterceptorChain; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.Message; import org.apache.cxf.service.model.BindingFaultInfo; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.service.model.FaultInfo; import org.apache.cxf.transport.Conduit; import org.apache.cxf.transport.Destination; import org.apache.neethi.Assertion; import org.apache.neethi.Policy; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * */ public class PolicyInterceptorsTest extends Assert { private static final QName ASSERTION_QNAME = new QName("http://apache.cxf", "test"); private IMocksControl control; private Message message; private Exchange exchange; private BindingOperationInfo boi; private Endpoint endpoint; private EndpointInfo ei; private Bus bus; private PolicyEngineImpl pe; private Conduit conduit; private Destination destination; @Before public void setUp() { control = EasyMock.createNiceControl(); bus = control.createMock(Bus.class); } @SuppressWarnings("unchecked") private List<Interceptor<? extends Message>> createMockInterceptorList() { Interceptor<? extends Message> i = control.createMock(Interceptor.class); Interceptor<? extends Message> m = i; List<Interceptor<? extends Message>> a = new ArrayList<Interceptor<? extends Message>>(); a.add(m); return a; } @Test public void testClientPolicyOutInterceptor() { PolicyOutInterceptor interceptor = new PolicyOutInterceptor(); doTestBasics(interceptor, true, true); control.reset(); setupMessage(true, true, true, true, true, true); EffectivePolicy effectivePolicy = control.createMock(EffectivePolicy.class); EasyMock.expect(pe.getEffectiveClientRequestPolicy(ei, boi, conduit, message)) .andReturn(effectivePolicy); List<Interceptor<? extends Message>> li = createMockInterceptorList(); EasyMock.expect(effectivePolicy.getInterceptors()) .andReturn(li); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic); ic.add(li.get(0)); EasyMock.expectLastCall(); Collection<Assertion> assertions = CastUtils.cast(Collections.EMPTY_LIST, Assertion.class); EasyMock.expect(effectivePolicy.getChosenAlternative()).andReturn(assertions); control.replay(); interceptor.handleMessage(message); control.verify(); } @SuppressWarnings("unchecked") @Test public void testClientPolicyInInterceptor() { PolicyInInterceptor interceptor = new PolicyInInterceptor(); doTestBasics(interceptor, true, false); control.reset(); setupMessage(true, true, true, true, true, true); EffectivePolicy effectivePolicy = control.createMock(EffectivePolicy.class); EasyMock.expect(pe.getEffectiveClientResponsePolicy(ei, boi, message)).andReturn(effectivePolicy); EasyMock.expect(effectivePolicy.getPolicy()).andReturn(new Policy()).times(2); Interceptor<? extends Message> i = control.createMock(Interceptor.class); List<Interceptor<? extends Message>> lst = new ArrayList<Interceptor<? extends Message>>(); lst.add(i); EasyMock.expect(effectivePolicy.getInterceptors()).andReturn(lst); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic).anyTimes(); ic.add(i); EasyMock.expectLastCall(); message.put(EasyMock.eq(AssertionInfoMap.class), EasyMock.isA(AssertionInfoMap.class)); EasyMock.expectLastCall(); ic.add(PolicyVerificationInInterceptor.INSTANCE); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testClientPolicyInFaultInterceptor() { ClientPolicyInFaultInterceptor interceptor = new ClientPolicyInFaultInterceptor(); doTestBasics(interceptor, true, false); control.reset(); setupMessage(true, true, false, false, true, true); EndpointPolicy endpointPolicy = control.createMock(EndpointPolicy.class); EasyMock.expect(pe.getClientEndpointPolicy(ei, conduit, message)).andReturn(endpointPolicy); List<Interceptor<? extends Message>> li = createMockInterceptorList(); EasyMock.expect(endpointPolicy.getFaultInterceptors(message)) .andReturn(li); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic); ic.add(li.get(0)); EasyMock.expectLastCall(); Collection<Assertion> assertions = CastUtils.cast(Collections.EMPTY_LIST, Assertion.class); EasyMock.expect(endpointPolicy.getFaultVocabulary(message)).andReturn(assertions); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyInInterceptor() { PolicyInInterceptor interceptor = new PolicyInInterceptor(); doTestBasics(interceptor, false, false); control.reset(); setupMessage(false, false, false, false, true, true); EndpointPolicy endpointPolicy = control.createMock(EndpointPolicyImpl.class); EasyMock.expect(pe.getServerEndpointPolicy(ei, destination, message)).andReturn(endpointPolicy); List<Interceptor<? extends Message>> li = createMockInterceptorList(); EasyMock.expect(endpointPolicy.getInterceptors(message)) .andReturn(li); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic); ic.add(li.get(0)); EasyMock.expectLastCall(); Collection<Assertion> assertions = CastUtils.cast(Collections.EMPTY_LIST, Assertion.class); EasyMock.expect(endpointPolicy.getVocabulary(message)).andReturn(assertions); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyOutInterceptor() { PolicyOutInterceptor interceptor = new PolicyOutInterceptor(); doTestBasics(interceptor, false, true); control.reset(); setupMessage(false, false, true, true, true, true); EffectivePolicy effectivePolicy = control.createMock(EffectivePolicy.class); EasyMock.expect(pe.getEffectiveServerResponsePolicy(ei, boi, destination, null, message)) .andReturn(effectivePolicy); List<Interceptor<? extends Message>> li = createMockInterceptorList(); EasyMock.expect(effectivePolicy.getInterceptors()) .andReturn(li); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic); ic.add(li.get(0)); EasyMock.expectLastCall(); Collection<Assertion> assertions = CastUtils.cast(Collections.EMPTY_LIST, Assertion.class); EasyMock.expect(effectivePolicy.getChosenAlternative()).andReturn(assertions); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyOutFaultInterceptor() throws NoSuchMethodException { Method m = AbstractPolicyInterceptor.class.getDeclaredMethod("getBindingFaultInfo", new Class[] {Message.class, Exception.class, BindingOperationInfo.class}); ServerPolicyOutFaultInterceptor interceptor = EasyMock.createMockBuilder(ServerPolicyOutFaultInterceptor.class) .addMockedMethod(m).createMock(control); doTestBasics(interceptor, false, true); control.reset(); setupMessage(false, false, true, true, true, true); Exception ex = control.createMock(Exception.class); EasyMock.expect(exchange.get(Exception.class)).andReturn(ex); EasyMock.expect(interceptor.getBindingFaultInfo(message, ex, boi)).andReturn(null); control.replay(); interceptor.handleMessage(message); control.verify(); control.reset(); setupMessage(false, false, true, true, true, true); // Exception ex = control.createMock(Exception.class); EasyMock.expect(exchange.get(Exception.class)).andReturn(ex); BindingFaultInfo bfi = control.createMock(BindingFaultInfo.class); EasyMock.expect(interceptor.getBindingFaultInfo(message, ex, boi)).andReturn(bfi); EffectivePolicy effectivePolicy = control.createMock(EffectivePolicyImpl.class); EasyMock.expect(pe.getEffectiveServerFaultPolicy(ei, boi, bfi, destination, message)) .andReturn(effectivePolicy); List<Interceptor<? extends Message>> li = createMockInterceptorList(); EasyMock.expect(effectivePolicy.getInterceptors()) .andReturn(li); InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic); ic.add(li.get(0)); EasyMock.expectLastCall(); Collection<Assertion> assertions = CastUtils.cast(Collections.EMPTY_LIST, Assertion.class); EasyMock.expect(effectivePolicy.getChosenAlternative()).andReturn(assertions); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyOutFaultInterceptorGetBindingFaultInfo() { ServerPolicyOutFaultInterceptor interceptor = new ServerPolicyOutFaultInterceptor(); message = control.createMock(Message.class); Exception ex = new UnsupportedOperationException(new RuntimeException()); boi = control.createMock(BindingOperationInfo.class); EasyMock.expect(message.get(BindingFaultInfo.class)).andReturn(null); BindingFaultInfo bfi = control.createMock(BindingFaultInfo.class); Collection<BindingFaultInfo> bfis = CastUtils.cast(Collections.EMPTY_LIST); EasyMock.expect(boi.getFaults()).andReturn(bfis); BindingOperationInfo wrappedBoi = control.createMock(BindingOperationInfo.class); EasyMock.expect(boi.getWrappedOperation()).andReturn(wrappedBoi).times(2); Collection<BindingFaultInfo> wrappedBfis = CastUtils.cast(Collections.singletonList(bfi)); EasyMock.expect(wrappedBoi.getFaults()).andReturn(wrappedBfis); FaultInfo fi = control.createMock(FaultInfo.class); EasyMock.expect(bfi.getFaultInfo()).andReturn(fi); EasyMock.expect(fi.getProperty(Class.class.getName(), Class.class)) .andReturn(RuntimeException.class); message.put(BindingFaultInfo.class, bfi); EasyMock.expectLastCall(); control.replay(); assertSame(bfi, interceptor.getBindingFaultInfo(message, ex, boi)); control.verify(); } @Test public void testClientPolicyInInterceptorPolicyOverride() { PolicyInInterceptor interceptor = new PolicyInInterceptor(); doTestBasics(interceptor, true, false); control.reset(); setupMessage(true, true, true, true, true, true); coachPolicyOverride(true, false); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testClientPolicyOutInterceptorPolicyOverride() { PolicyOutInterceptor interceptor = new PolicyOutInterceptor(); doTestBasics(interceptor, true, true); control.reset(); setupMessage(true, true, true, true, true, true); coachPolicyOverride(false, false); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyInInterceptorPolicyOverride() { PolicyInInterceptor interceptor = new PolicyInInterceptor(); doTestBasics(interceptor, false, false); control.reset(); setupMessage(false, false, false, false, true, true); coachPolicyOverride(true, false); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyOutInterceptorPolicyOverride() { PolicyOutInterceptor interceptor = new PolicyOutInterceptor(); doTestBasics(interceptor, false, true); control.reset(); setupMessage(false, false, true, true, true, true); coachPolicyOverride(false, false); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testClientPolicyInFaultInterceptorPolicyOverride() { ClientPolicyInFaultInterceptor interceptor = new ClientPolicyInFaultInterceptor(); doTestBasics(interceptor, true, false); control.reset(); setupMessage(true, true, false, false, true, true); coachPolicyOverride(true, true); control.replay(); interceptor.handleMessage(message); control.verify(); } @Test public void testServerPolicyOutFaultInterceptorPolicyOverride() { ServerPolicyOutFaultInterceptor interceptor = new ServerPolicyOutFaultInterceptor(); doTestBasics(interceptor, false, true); control.reset(); setupMessage(false, false, true, true, true, true); coachPolicyOverride(false, true); control.replay(); interceptor.handleMessage(message); control.verify(); } private void doTestBasics(Interceptor<Message> interceptor, boolean isClient, boolean usesOperationInfo) { setupMessage(!isClient, isClient, usesOperationInfo, !usesOperationInfo, false, false); control.replay(); interceptor.handleMessage(message); control.verify(); control.reset(); setupMessage(isClient, isClient, usesOperationInfo, !usesOperationInfo, false, false); control.replay(); interceptor.handleMessage(message); control.verify(); control.reset(); setupMessage(isClient, isClient, usesOperationInfo, usesOperationInfo, false, false); control.replay(); interceptor.handleMessage(message); control.verify(); control.reset(); setupMessage(isClient, isClient, usesOperationInfo, usesOperationInfo, true, false); control.replay(); interceptor.handleMessage(message); control.verify(); } void setupMessage(boolean setupRequestor, boolean isClient, boolean usesOperationInfo, boolean setupOperation, Boolean setupEndpoint, Boolean setupEngine) { message = control.createMock(Message.class); exchange = control.createMock(Exchange.class); EasyMock.expect(message.get(Message.REQUESTOR_ROLE)) .andReturn(isClient ? Boolean.TRUE : Boolean.FALSE).anyTimes(); EasyMock.expect(message.getExchange()).andReturn(exchange); EasyMock.expect(exchange.getBus()).andReturn(bus).anyTimes(); if (usesOperationInfo) { if (null == boi && setupOperation) { boi = control.createMock(BindingOperationInfo.class); } EasyMock.expect(exchange.getBindingOperationInfo()).andReturn(setupOperation ? boi : null) .anyTimes(); if (!setupOperation) { return; } } if (null == endpoint && setupEndpoint) { endpoint = control.createMock(Endpoint.class); } EasyMock.expect(exchange.getEndpoint()).andReturn(setupEndpoint ? endpoint : null); if (!setupEndpoint) { return; } if (null == ei) { ei = control.createMock(EndpointInfo.class); } EasyMock.expect(endpoint.getEndpointInfo()).andReturn(ei); if (null == pe && setupEngine) { pe = control.createMock(PolicyEngineImpl.class); } EasyMock.expect(bus.getExtension(PolicyEngine.class)).andReturn(setupEngine ? pe : null); if (!setupEngine) { return; } if (isClient) { conduit = control.createMock(Conduit.class); EasyMock.expect(exchange.getConduit(message)).andReturn(conduit).anyTimes(); } else { destination = control.createMock(Destination.class); EasyMock.expect(exchange.getDestination()).andReturn(destination).anyTimes(); } } private void coachPolicyOverride(boolean in, boolean fault) { Assertion assertion = control.createMock(Assertion.class); EasyMock.expect(assertion.getName()).andReturn(ASSERTION_QNAME); Collection<Assertion> assertions = new ArrayList<>(); assertions.add(assertion); Policy policyOverride = control.createMock(Policy.class); EasyMock.expect(message.getContextualProperty(PolicyConstants.POLICY_OVERRIDE)) .andReturn(policyOverride); AlternativeSelector selector = control.createMock(AlternativeSelector.class); EasyMock.expect(selector.selectAlternative(policyOverride, pe, null, null, message)).andReturn(assertions); EasyMock.expect(pe.getAlternativeSelector()).andReturn(selector); EasyMock.expect(pe.getBus()).andReturn(bus).anyTimes(); PolicyInterceptorProviderRegistry reg = control .createMock(PolicyInterceptorProviderRegistry.class); EasyMock.expect(bus.getExtension(PolicyInterceptorProviderRegistry.class)).andReturn(reg); List<Interceptor<? extends Message>> li = createMockInterceptorList(); if (in && fault) { EasyMock.expect(reg.getInFaultInterceptorsForAssertion(ASSERTION_QNAME)).andReturn(li); } else if (!in && fault) { EasyMock.expect(reg.getOutFaultInterceptorsForAssertion(ASSERTION_QNAME)).andReturn(li); } else if (in && !fault) { EasyMock.expect(reg.getInInterceptorsForAssertion(ASSERTION_QNAME)).andReturn(li); } else if (!in && !fault) { EasyMock.expect(reg.getOutInterceptorsForAssertion(ASSERTION_QNAME)).andReturn(li); } InterceptorChain ic = control.createMock(InterceptorChain.class); EasyMock.expect(message.getInterceptorChain()).andReturn(ic).anyTimes(); ic.add(li.get(0)); EasyMock.expectLastCall(); } }