acksenderwindowtest.java
来自「JGRoups源码」· Java 代码 · 共 177 行
JAVA
177 行
// $Id: AckSenderWindowTest.java,v 1.5 2005/05/30 16:15:05 belaban Exp $package org.jgroups.tests;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;import org.jgroups.Message;import org.jgroups.stack.AckSenderWindow;import org.jgroups.util.Util;import java.util.HashMap;/** * Test cases for AckSenderWindow * @author Bela Ban */public class AckSenderWindowTest extends TestCase { AckSenderWindow win=null; final int NUM_MSGS=100; long[] xmit_timeouts={1000, 2000, 4000, 8000}; double PERCENTAGE_OFF=1.3; // how much can expected xmit_timeout and real timeout differ to still be okay ? HashMap msgs=new HashMap(); // keys=seqnos (Long), values=Entries class Entry { long start_time=0; // time message was added long first_xmit=0; // time between start_time and first_xmit should be ca. 1000ms long second_xmit=0; // time between first_xmit and second_xmit should be ca. 2000ms long third_xmit=0; // time between third_xmit and second_xmit should be ca. 4000ms long fourth_xmit=0; // time between third_xmit and second_xmit should be ca. 8000ms Entry() { start_time=System.currentTimeMillis(); } /** Entry is correct if xmit timeouts are not more than 30% off the mark */ boolean isCorrect(long seqno) { long t; long expected; long diff, delta; boolean off=false; t=first_xmit - start_time; expected=xmit_timeouts[0]; diff=Math.abs(expected - t); delta=(long)(expected * PERCENTAGE_OFF); if(diff >= delta) off=true; t=second_xmit - first_xmit; expected=xmit_timeouts[1]; diff=Math.abs(expected - t); delta=(long)(expected * PERCENTAGE_OFF); if(diff >= delta) off=true; t=third_xmit - second_xmit; expected=xmit_timeouts[2]; diff=Math.abs(expected - t); delta=(long)(expected * PERCENTAGE_OFF); if(diff >= delta) off=true; t=fourth_xmit - third_xmit; expected=xmit_timeouts[3]; diff=Math.abs(expected - t); delta=(long)(expected * PERCENTAGE_OFF); if(diff >= delta) off=true; if(off) { System.err.println("#" + seqno + ": " + this + ": (" + "entry is more than " + PERCENTAGE_OFF + " percentage off "); return false; } return true; } public String toString() { StringBuffer sb=new StringBuffer(); sb.append(first_xmit - start_time).append(", ").append(second_xmit-first_xmit).append(", "); sb.append(third_xmit-second_xmit).append(", ").append(fourth_xmit-third_xmit); return sb.toString(); } } class MyRetransmitCommand implements AckSenderWindow.RetransmitCommand { public void retransmit(long seqno, Message msg) { Entry entry=(Entry)msgs.get(new Long(seqno)); // System.out.println(" -- retransmit(" + seqno + ")"); if(entry != null) { if(entry.first_xmit == 0) { entry.first_xmit=System.currentTimeMillis(); return; } if(entry.second_xmit == 0) { entry.second_xmit=System.currentTimeMillis(); return; } if(entry.third_xmit == 0) { entry.third_xmit=System.currentTimeMillis(); return; } if(entry.fourth_xmit == 0) { entry.fourth_xmit=System.currentTimeMillis(); return; } } } } public AckSenderWindowTest(String name) { super(name); } /** Tests whether retransmits are called at correct times for 1000 messages */ public void testRetransmits() { Entry entry; int num_non_correct_entries=0; win=new AckSenderWindow(new MyRetransmitCommand(), xmit_timeouts); // 1. Send NUM_MSGS messages: System.out.println("-- sending " + NUM_MSGS + " messages:"); for(long i=0; i < NUM_MSGS; i++) { msgs.put(new Long(i), new Entry()); win.add(i, new Message()); } System.out.println("-- done"); // 2. Wait for at least 4 xmits/msg: total of 1000 + 2000 + 4000 + 8000ms = 15000ms; wait for 20000ms System.out.println("-- waiting for 20 secs for all retransmits"); Util.sleep(20000); // 3. Check whether all Entries have correct retransmission times for(long i=0; i < NUM_MSGS; i++) { entry=(Entry)msgs.get(new Long(i)); if(!entry.isCorrect(i)) { num_non_correct_entries++; } } if(num_non_correct_entries > 0) System.err.println("Number of incorrect retransmission timeouts: " + num_non_correct_entries); assertTrue(num_non_correct_entries == 0); win.reset(); } public static Test suite() { TestSuite suite; suite = new TestSuite(AckSenderWindowTest.class); return(suite); } public static void main(String[] args) { String[] name = {AckSenderWindowTest.class.getName()}; junit.textui.TestRunner.main(name); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?