package org.jgroups.tests; import org.jgroups.*; import org.jgroups.util.Util; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; /** * Demos the creation of a channel and subsequent connection and closing. Demo application should exit (no * more threads running) */ @Test(groups=Global.STACK_DEPENDENT,singleThreaded=true) public class CloseTest extends ChannelTestBase { protected JChannel a, b, c; @AfterMethod void tearDown() throws Exception {Util.close(c,b,a);} protected boolean useBlocking() {return false;} public void testDoubleClose() throws Exception { a=createChannel(true, 1, "A"); a.connect("CloseTest.testDoubleClose"); assert a.isOpen(); assert a.isConnected(); Util.close(a); Util.close(a); assert !a.isConnected(); } public void testCreationAndClose() throws Exception { a=createChannel(true, 1, "A"); a.connect("CloseTest.testCreationAndClose"); assert a.isOpen(); Util.close(a); assert !a.isConnected(); } public void testCreationAndCoordClose() throws Exception { a=createChannel(true, 2, "A"); b=createChannel(a, "B"); a.connect("testCreationAndCoordClose"); b.connect("testCreationAndCoordClose"); Util.waitUntilAllChannelsHaveSameView(10000, 500, a, b); a.disconnect(); Util.waitUntilAllChannelsHaveSameView(10000, 500, b); } public void testViewChangeReceptionOnChannelCloseByParticipant() throws Exception { List<Address> members; MyReceiver r1=new MyReceiver(), r2=new MyReceiver(); Address a_addr, b_addr; final String GROUP="CloseTest.testViewChangeReceptionOnChannelCloseByParticipant"; a=createChannel(true, 2, "A"); a.setReceiver(r1); a.connect(GROUP); System.out.println("A: " + r1.getViews()); b=createChannel(a, "B"); b.setReceiver(r2); r1.clearViews(); b.connect(GROUP); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); a_addr=a.getAddress(); b_addr=b.getAddress(); Util.close(b); Util.waitUntilAllChannelsHaveSameView(10000, 500, a); View v=r1.getViews().get(0); members=v.getMembers(); System.out.println("-- first view of c1: " + v); Assert.assertEquals(2, members.size()); assertTrue(members.contains(a_addr)); assertTrue(members.contains(b_addr)); v=r1.getViews().get(1); members=v.getMembers(); System.out.println("-- second view of c1: " + v); assert 1 == members.size(); assert members.contains(a_addr); assert !members.contains(b_addr); } public void testViewChangeReceptionOnChannelCloseByCoordinator() throws Exception { List<Address> members; MyReceiver r1=new MyReceiver(), r2=new MyReceiver(); Address a_addr, b_addr; final String GROUP="CloseTest.testViewChangeReceptionOnChannelCloseByCoordinator"; a=createChannel(true, 2, "A"); a.setReceiver(r1); a.connect(GROUP); b=createChannel(a, "B"); b.setReceiver(r2); b.connect(GROUP); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); a_addr=a.getAddress(); b_addr=b.getAddress(); View v=r2.getViews().get(0); members=v.getMembers(); assert 2 == members.size(); assert members.contains(a.getAddress()); r2.clearViews(); Util.close(b); Util.waitUntilAllChannelsHaveSameView(5000, 500, a); v=r1.getViews().get(r1.getViews().size() -1); members=v.getMembers(); assert 1 == members.size(); assert members.contains(a_addr); assert !members.contains(b_addr); } public void testConnectDisconnectConnectCloseSequence() throws Exception { a=createChannel(true, 1, "A"); a.connect("CloseTest.testConnectDisconnectConnectCloseSequence-CloseTest"); System.out.println("view is " + a.getView()); System.out.println("-- disconnecting channel --"); a.disconnect(); System.out.println("-- connecting channel to OtherGroup --"); a.connect("CloseTest.testConnectDisconnectConnectCloseSequence-OtherGroup"); System.out.println("view is " + a.getView()); } public void testConnectCloseSequenceWith2Members() throws Exception { a=createChannel(true, 2, "A"); final String GROUP="CloseTest.testConnectCloseSequenceWith2Members"; a.connect(GROUP); b=createChannel(a, "B"); b.connect(GROUP); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); System.out.println("view is " + b.getView()); } public void testCreationAndClose2() throws Exception { a=createChannel(true, 1, "A"); a.connect("CloseTest.testCreationAndClose2"); } public void testClosedChannel() throws Exception { a=createChannel(true, 1, "A"); a.connect("CloseTest.testClosedChannel"); Util.close(a); Util.sleep(2000); try { a.connect("CloseTest.testClosedChannel"); assert false; } catch(IllegalStateException ex) { } } public void testMultipleConnectsAndDisconnects() throws Exception { final String GROUP="CloseTest.testMultipleConnectsAndDisconnects"; a=createChannel(true, 10, "A"); assert a.isOpen() && !a.isConnected(); a.connect(GROUP); assert a.isConnected(); assertView(a, 1); b=createChannel(a, "B"); assert b.isOpen() && !b.isConnected(); b.connect(GROUP); assert b.isConnected(); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); b.disconnect(); assert b.isOpen() && !b.isConnected(); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a); b.connect(GROUP); assert b.isConnected(); Util.waitUntilAllChannelsHaveSameView(20000, 1000, a, b); // Now see what happens if we disaconnect and reconnect A (the current coord) a.disconnect(); assert a.isOpen() && !a.isConnected(); Util.waitUntilAllChannelsHaveSameView(10000, 1000, b); a.connect(GROUP); assert a.isOpen() && a.isConnected(); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); } public void testMultipleConnectsAndDisconnects2() throws Exception { int NUM=10; a=createChannel(true, NUM, "A"); a.connect("CloseTest"); b=createChannel(a, "B"); b.connect("CloseTest"); Util.waitUntilAllChannelsHaveSameView(10000, 500, a, b); for(int i=1; i <= NUM; i++) { System.out.print("#" + i + " disconnecting: "); b.disconnect(); System.out.println("OK"); Util.waitUntilAllChannelsHaveSameView(10000, 500, a); b.connect("CloseTest"); Util.waitUntilAllChannelsHaveSameView(10000, 500, a, b); } } private static void assertView(JChannel ch, int num) { View view=ch.getView(); String msg="view=" + view; assertNotNull(view); Assert.assertEquals(view.size(), num, msg); } private static class MyReceiver extends ReceiverAdapter { final List<View> views=new ArrayList<>(); public void viewAccepted(View new_view) { views.add(new_view); System.out.println("new_view = " + new_view); } public List<View> getViews() {return views;} public void clearViews() {views.clear();} } }