package org.jacorb.test.notification;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.jacorb.test.notification.common.NotificationTestUtils;
import org.jacorb.test.notification.common.NotifyServerTestCase;
import org.junit.Before;
import org.junit.Test;
import org.omg.CORBA.Any;
import org.omg.CORBA.IntHolder;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.TRANSIENT;
import org.omg.CosNotification.EventHeader;
import org.omg.CosNotification.EventType;
import org.omg.CosNotification.FixedEventHeader;
import org.omg.CosNotification.Property;
import org.omg.CosNotification.StructuredEvent;
import org.omg.CosNotifyChannelAdmin.EventChannel;
import org.omg.CosNotifyChannelAdmin.ObtainInfoMode;
import org.omg.CosNotifyFilter.ConstraintExp;
import org.omg.CosNotifyFilter.Filter;
/**
* @author Alphonse Bendt
*/
public class StructuredEventChannelTest extends NotifyServerTestCase
{
private static final EventType[] EMPTY_EVENT_TYPE = new EventType[0];
EventChannel channel_;
StructuredEvent testEvent_;
Filter trueFilter_;
Filter falseFilter_;
NotificationTestUtils testUtils_;
// //////////////////////////////////////
// //////////////////////////////////////
@Before
public void setUp() throws Exception
{
channel_ = getDefaultChannel();
// set test event type and name
testEvent_ = new StructuredEvent();
EventType _type = new EventType("testDomain", "testType");
FixedEventHeader _fixed = new FixedEventHeader(_type, "testing");
// complete header date
Property[] _variable = new Property[0];
testEvent_.header = new EventHeader(_fixed, _variable);
// set filterable event body data
testEvent_.filterable_data = new Property[1];
Any _personAny = setup.getClientOrb().create_any();
// prepare filterable body data
Person _p = new NotificationTestUtils(setup.getClientOrb()).getTestPerson();
Address _a = new Address();
_p.first_name = "firstname";
_p.last_name = "lastname";
_p.age = 5;
_p.phone_numbers = new String[2];
_p.phone_numbers[0] = "12345678";
_p.phone_numbers[1] = "";
_p.nv = new NamedValue[2];
_p.nv[0] = new NamedValue();
_p.nv[1] = new NamedValue();
_p.person_profession = Profession.STUDENT;
_a.street = "Takustr.";
_a.number = 9;
_a.city = "Berlin";
_p.home_address = _a;
PersonHelper.insert(_personAny, _p);
testEvent_.filterable_data[0] = new Property("person", _personAny);
testEvent_.remainder_of_body = setup.getClientOrb().create_any();
trueFilter_ = createFilter();
ConstraintExp[] _constraintExp = new ConstraintExp[1];
EventType[] _eventType = new EventType[1];
_eventType[0] = new EventType("*", "*");
_constraintExp[0] = new ConstraintExp(_eventType, "true");
trueFilter_.add_constraints(_constraintExp);
falseFilter_ = createFilter();
_constraintExp = new ConstraintExp[1];
_eventType = new EventType[1];
_eventType[0] = new EventType("*", "*");
_constraintExp[0] = new ConstraintExp(_eventType, "false");
falseFilter_.add_constraints(_constraintExp);
}
private StructuredPushSender getPushSender()
{
StructuredPushSender sender = new StructuredPushSender(setup.getClientOrb());
sender.setStructuredEvent(testEvent_);
return sender;
}
@Test
public void testDestroyChannelDisconnectsClients() throws Exception
{
Property[] _p = new Property[0];
EventChannel _channel = getEventChannelFactory().create_channel(_p, _p, new IntHolder());
StructuredPushSender _pushSender = getPushSender();
StructuredPullSender _pullSender = new StructuredPullSender(setup.getClientOrb(), testEvent_);
StructuredPushReceiver _pushReceiver = new StructuredPushReceiver(setup.getClientOrb());
StructuredPullReceiver _pullReceiver = new StructuredPullReceiver(setup.getClientOrb());
_pushSender.connect(_channel, false);
_pullSender.connect(_channel, false);
_pushReceiver.connect(_channel, false);
_pullReceiver.connect(_channel, false);
assertTrue(_pushSender.isConnected());
assertTrue(_pullSender.isConnected());
assertTrue(_pushReceiver.isConnected());
assertTrue(_pullReceiver.isConnected());
_channel.destroy();
assertTrue(!_pushSender.isConnected());
assertTrue(!_pullSender.isConnected());
assertTrue(!_pushReceiver.isConnected());
assertTrue(!_pullReceiver.isConnected());
}
@Test
public void testObtainSubscriptionTypes_sender_throws_NO_IMPLEMENT() throws Exception
{
final AtomicInteger subscriptionChangeCounter = new AtomicInteger(0);
StructuredPushSender _sender = new StructuredPushSender(setup.getClientOrb())
{
public void subscription_change(EventType[] added, EventType[] removed)
{
subscriptionChangeCounter.incrementAndGet();
throw new NO_IMPLEMENT();
}
};
_sender.setStructuredEvent(testEvent_);
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
assertEquals(0, _sender.pushConsumer_.obtain_subscription_types(ObtainInfoMode.NONE_NOW_UPDATES_ON).length);
EventType[] offers = new EventType[] { new EventType("domain1", "type1") };
_receiver.pushSupplier_.subscription_change(offers, EMPTY_EVENT_TYPE);
offers = new EventType[] { new EventType("domain2", "type2") };
_receiver.pushSupplier_.subscription_change(offers, EMPTY_EVENT_TYPE);
Thread.sleep(1000);
assertEquals(1, subscriptionChangeCounter.get());
}
@Test
public void testObtainSubscriptionTypes_NONE_NOW_UPDATE_ON() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
assertEquals(0, _sender.pushConsumer_.obtain_subscription_types(ObtainInfoMode.NONE_NOW_UPDATES_ON).length);
EventType[] offers = new EventType[] { new EventType("domain1", "type1") };
_receiver.pushSupplier_.subscription_change(offers, EMPTY_EVENT_TYPE);
Thread.sleep(1000);
assertEquals(1, _sender.addedSubscriptions_.size());
assertEquals("domain1", ((EventType) _sender.addedSubscriptions_.get(0)).domain_name);
assertEquals("type1", ((EventType) _sender.addedSubscriptions_.get(0)).type_name);
}
@Test
public void testObtainSubscriptionTypes_ALL_NOW_UPDATE_OFF() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
EventType[] offers = new EventType[] { new EventType("domain1", "type1") };
_receiver.pushSupplier_.subscription_change(offers, EMPTY_EVENT_TYPE);
EventType[] _subscriptionTypes = _sender.pushConsumer_
.obtain_subscription_types(ObtainInfoMode.ALL_NOW_UPDATES_ON);
Thread.sleep(1000);
assertEquals(1, _subscriptionTypes.length);
assertEquals("domain1", _subscriptionTypes[0].domain_name);
assertEquals("type1", _subscriptionTypes[0].type_name);
}
@Test
public void testObtainOfferedTypes_NONE_NOW_UPDATES_ON() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
assertEquals(0, _receiver.pushSupplier_.obtain_offered_types(ObtainInfoMode.NONE_NOW_UPDATES_ON).length);
EventType[] offers = new EventType[] { new EventType("domain1", "type1") };
_sender.pushConsumer_.offer_change(offers, EMPTY_EVENT_TYPE);
Thread.sleep(1000);
assertEquals(1, _receiver.addedOffers.size());
assertEquals("domain1", ((EventType) _receiver.addedOffers.get(0)).domain_name);
assertEquals("type1", ((EventType) _receiver.addedOffers.get(0)).type_name);
}
@Test
public void testObtainOfferedTypes_ALL_NOW_UPDATES_ON() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
EventType[] offers = new EventType[] { new EventType("domain1", "type1"),
new EventType("domain2", "type2") };
_sender.pushConsumer_.offer_change(offers, EMPTY_EVENT_TYPE);
EventType[] _offeredTypes = _receiver.pushSupplier_
.obtain_offered_types(ObtainInfoMode.ALL_NOW_UPDATES_ON);
assertEquals(2, _offeredTypes.length);
}
@Test
public void testObtainOfferedTypes_receiver_throws_NO_IMPLEMENT() throws Exception
{
final AtomicInteger offerChangeCalled = new AtomicInteger(0);
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb())
{
public void offer_change(org.omg.CosNotification.EventType[] added,org.omg.CosNotification.EventType[] removed)
{
offerChangeCalled.incrementAndGet();
throw new NO_IMPLEMENT();
}
};
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.pushSupplier_.obtain_offered_types(ObtainInfoMode.NONE_NOW_UPDATES_ON);
EventType[] offers = new EventType[] { new EventType("domain1", "type1"),
new EventType("domain2", "type2") };
_sender.pushConsumer_.offer_change(offers, EMPTY_EVENT_TYPE);
offers = new EventType[] { new EventType("domain3", "type3"),
new EventType("domain4", "type4") };
_sender.pushConsumer_.offer_change(offers, EMPTY_EVENT_TYPE);
assertEquals(1, offerChangeCalled.get());
}
@Test
public void testSendPushPush() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.start();
_sender.start();
_sender.join();
_receiver.join();
assertTrue("Error while sending", !_sender.error_);
assertTrue("Should have received something", _receiver.isEventHandled());
}
@Test
public void testSendPushPush_MisbehavingConsumer() throws Exception
{
StructuredPushSender _sender = getPushSender();
final CountDownLatch disconnectedLatch = new CountDownLatch(1);
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb())
{
public void push_structured_event(StructuredEvent event)
{
throw new TRANSIENT();
}
public void disconnect_structured_push_consumer()
{
super.disconnect_structured_push_consumer();
disconnectedLatch.countDown();
}
};
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.start();
_sender.start();
_sender.join();
_receiver.join();
assertTrue(disconnectedLatch.await(20000, TimeUnit.MILLISECONDS));
assertFalse(_receiver.isConnected());
}
@Test
public void testSendPushPull() throws Exception
{
StructuredPushSender _sender = getPushSender();
StructuredPullReceiver _receiver = new StructuredPullReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.start();
_sender.start();
_sender.join();
_receiver.join();
assertTrue("Error while sending", !_sender.error_);
assertTrue("Should have received something", _receiver.isEventHandled());
}
@Test
public void testSendPullPush() throws Exception
{
StructuredPullSender _sender = new StructuredPullSender(setup.getClientOrb(), testEvent_);
StructuredPushReceiver _receiver = new StructuredPushReceiver(setup.getClientOrb());
_receiver.setTimeOut(2000);
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.start();
_sender.start();
_sender.join();
_receiver.join();
assertTrue("Error while sending", !_sender.isError());
assertTrue("Should have received something", _receiver.isEventHandled());
}
@Test
public void testSendPullPull() throws Exception
{
StructuredPullSender _sender = new StructuredPullSender(setup.getClientOrb(), testEvent_);
StructuredPullReceiver _receiver = new StructuredPullReceiver(setup.getClientOrb());
_sender.connect(channel_, false);
_receiver.connect(channel_, false);
_receiver.start();
_sender.start();
_sender.join();
_receiver.join();
boolean _senderError = ((TestClientOperations) _sender).isError();
assertTrue("Error while sending", !_senderError);
assertTrue("Should have received something", _receiver.isEventHandled());
}
}