/*
* 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.synapse.eventing;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.databinding.utils.ConverterUtil;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.eventing.managers.DefaultInMemorySubscriptionManager;
import org.apache.synapse.mediators.TestUtils;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.core.axis2.Axis2SynapseEnvironment;
import org.wso2.eventing.SubscriptionManager;
import org.wso2.eventing.EventingConstants;
import org.wso2.eventing.exceptions.EventException;
import junit.framework.TestCase;
import javax.xml.namespace.QName;
import java.util.Date;
import java.util.Calendar;
public class SynapseEventSourceTest extends TestCase {
private SubscriptionManager subMan;
private SynapseEventSource source;
private String id;
private static final String SUB_MAN_URL = "http://synapse.test.com/eventing/subscriptions";
private static final String ADDR_URL = "http://www.other.example.com/OnStormWarning";
private static final String FILTER_DIALECT = "http://www.example.org/topicFilter";
private static final String FILTER = "weather.storms";
protected void setUp() throws Exception {
source = new SynapseEventSource("foo");
subMan = new DefaultInMemorySubscriptionManager();
source.setSubscriptionManager(subMan);
}
public void testSubscriptionHandling() {
subscribeTest();
renewTest();
unsubscribeTest();
}
private void subscribeTest() {
Date date = new Date(System.currentTimeMillis() + 3600000);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
String message =
"<wse:Subscribe xmlns:wse=\"http://schemas.xmlsoap.org/ws/2004/08/eventing\" " +
" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" " +
" xmlns:ew=\"http://www.example.com/warnings\">\n" +
" <wse:EndTo>\n" +
" <wsa:Address>http://www.example.com/MyEventSink</wsa:Address>\n" +
" <wsa:ReferenceProperties>\n" +
" <ew:MySubscription>2597</ew:MySubscription>\n" +
" </wsa:ReferenceProperties>\n" +
" </wse:EndTo>\n" +
" <wse:Delivery>\n" +
" <wse:NotifyTo>\n" +
" <wsa:Address>" + ADDR_URL + "</wsa:Address>\n" +
" <wsa:ReferenceProperties>\n" +
" <ew:MySubscription>2597</ew:MySubscription>\n" +
" </wsa:ReferenceProperties>\n" +
" </wse:NotifyTo>\n" +
" </wse:Delivery>\n" +
" <wse:Expires>" + ConverterUtil.convertToString(cal) + "</wse:Expires>\n" +
" <wse:Filter xmlns:ow=\"http://www.example.org/oceanwatch\"\n" +
" Dialect=\"" + FILTER_DIALECT + "\" >" + FILTER +"</wse:Filter>\n" +
"</wse:Subscribe>";
try {
MessageContext msgCtx = createMessageContext(message, EventingConstants.WSE_SUBSCRIBE);
source.receive(msgCtx);
} catch (Exception ignored) {
}
try {
assertEquals(1, subMan.getSubscriptions().size());
SynapseSubscription s = (SynapseSubscription) subMan.getSubscriptions().get(0);
assertEquals(SUB_MAN_URL, s.getSubManUrl());
assertEquals(ADDR_URL, s.getAddressUrl());
assertEquals(FILTER_DIALECT, s.getFilterDialect());
assertEquals(FILTER, s.getFilterValue());
assertEquals(date, s.getExpires().getTime());
id = s.getId();
} catch (EventException e) {
fail("Eventing exception occured while accessing the subscription manager");
}
}
public void renewTest() {
Date date = new Date(System.currentTimeMillis() + 3600000 * 2);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
String message =
"<wse:Renew xmlns:wse=\"http://schemas.xmlsoap.org/ws/2004/08/eventing\">\n" +
" <wse:Expires>" + ConverterUtil.convertToString(cal) + "</wse:Expires>\n" +
"</wse:Renew>";
try {
MessageContext msgCtx = createMessageContext(message, EventingConstants.WSE_RENEW);
QName qname = new QName(EventingConstants.WSE_EVENTING_NS,
EventingConstants.WSE_EN_IDENTIFIER, "wse");
TestUtils.addSOAPHeaderBlock(msgCtx, qname, id);
source.receive(msgCtx);
} catch (Exception ignored) {
}
try {
assertEquals(1, subMan.getSubscriptions().size());
SynapseSubscription s = (SynapseSubscription) subMan.getSubscription(this.id);
assertEquals(SUB_MAN_URL, s.getSubManUrl());
assertEquals(ADDR_URL, s.getAddressUrl());
assertEquals(FILTER_DIALECT, s.getFilterDialect());
assertEquals(FILTER, s.getFilterValue());
assertEquals(date, s.getExpires().getTime());
} catch (EventException e) {
fail("Eventing exception occured while accessing the subscription manager");
}
}
public void unsubscribeTest() {
String message =
"<wse:Unsubscribe xmlns:wse=\"http://schemas.xmlsoap.org/ws/2004/08/eventing\"/>";
try {
MessageContext msgCtx = createMessageContext(message, EventingConstants.WSE_UNSUBSCRIBE);
QName qname = new QName(EventingConstants.WSE_EVENTING_NS,
EventingConstants.WSE_EN_IDENTIFIER, "wse");
TestUtils.addSOAPHeaderBlock(msgCtx, qname, id);
source.receive(msgCtx);
} catch (Exception ignored) {
}
try {
assertEquals(0, subMan.getSubscriptions().size());
} catch (EventException e) {
fail("Eventing exception occured while accessing the subscription manager");
}
}
private MessageContext createMessageContext(String payload, String action) {
try {
SynapseConfiguration synapseConfig = new SynapseConfiguration();
AxisConfiguration axisConfig = new AxisConfiguration();
synapseConfig.setAxisConfiguration(axisConfig);
ConfigurationContext cfgCtx = new ConfigurationContext(axisConfig);
SynapseEnvironment env = new Axis2SynapseEnvironment(cfgCtx, synapseConfig);
axisConfig.addParameter(SynapseConstants.SYNAPSE_CONFIG, synapseConfig);
axisConfig.addParameter(SynapseConstants.SYNAPSE_ENV, env);
MessageContext msgCtx = TestUtils.getAxis2MessageContext(payload, null).
getAxis2MessageContext();
msgCtx.setConfigurationContext(cfgCtx);
msgCtx.setTo(new EndpointReference(SUB_MAN_URL));
msgCtx.setWSAAction(action);
return msgCtx;
} catch (Exception e) {
fail();
}
return null;
}
}