package water; import jsr166y.CountedCompleter; import org.junit.Ignore; import org.junit.Test; import water.api.TimelineHandler; import water.api.schemas3.TimelineV3; import java.util.HashSet; import java.util.Set; import static junit.framework.TestCase.assertEquals; public class TimelineTest extends TestUtil{ public TimelineTest() { super(5); } // Simple class to test the timeline. We want to send this task around and // see that timeline shows this and in correct order. An instance is sent // from all nodes to all nodes (full cross-bar). private static class TestTask extends DTask { // nothing to do here... @Override public void compute2() { tryComplete(); } } // RPC call of above simple class from here to 'tgt' private static class TestLauncher extends DTask { final H2ONode _tgt; TestLauncher (H2ONode tgt, H2O.H2OCountedCompleter cmp) { super(cmp); _tgt = tgt; } TestLauncher (H2ONode tgt){ _tgt = tgt; } @Override public void compute2() { new RPC(_tgt,new TestTask()).addCompleter(this).call(); } @Override public boolean onExceptionalCompletion(Throwable ex, CountedCompleter caller){ ex.printStackTrace(); return true; } } // fixme: ignored for now, faling on java 8 (timeline is missing some of the sent messages) // make a test task and see it gets shown in the timeline @Test @Ignore public void basicTest(){ final int n = H2O.CLOUD.size(); // Make a CountedCompleter, so we can have lots of pending tasks for which // this is the completer. When they all complete, this one completes as well. H2O.H2OCountedCompleter test = new H2O.H2OCountedCompleter() { @Override public void compute2() { if( H2O.CLOUD.size() > 1) { for( H2ONode from : H2O.CLOUD.members() ) { for( H2ONode to : H2O.CLOUD.members() ) { if( from == to ) continue; addToPendingCount(1); if( from != H2O.SELF ) { new RPC(from, new TestLauncher(to)).addCompleter(this).call(); } else { new TestLauncher(to,this).fork(); } } } } // otherwise nothing to test, no one to send msgs to... tryComplete(); } }; H2O.submitTask(test).join(); TimelineHandler handler = new TimelineHandler(); TimelineV3 t = handler.fetch(2, new TimelineV3()); Set<String> msgs = new HashSet<>(); for( TimelineV3.EventV3 e : t.events) { if(e.bytes().contains("TestTask") && e instanceof TimelineV3.NetworkEvent) { TimelineV3.NetworkEvent ne = (TimelineV3.NetworkEvent)e; msgs.add((ne.is_send ?"SEND":"RECV") + " " + ne.from + " -> " + ne.to); } } // crude test for now, just look we got send and recv message for all test dtasks we made // we should also test the order and acks/ackacks! assertEquals("some msgs are missing from the timeline: epxected " + (2*n*(n-1)) + ", got " + msgs.size() + ", msgs = " + msgs.toString(),msgs.size(),2*n*(n-1)); } }