fix broken ut DUBBO-577
diff --git a/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java b/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
index ed3a3ee..c1e6145 100644
--- a/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
+++ b/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and

  * limitations under the License.

  */

-package com.alibaba.dubbo.rpc.cluster.support;
-
+package com.alibaba.dubbo.rpc.cluster.support;

+

 import java.util.ArrayList;

 import java.util.List;

 import java.util.Map;

@@ -44,362 +44,365 @@
 import com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance;

 import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;

 import com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance;

-
-/**
- * AbstractClusterInvokerTest
- * @author chao.liuc
- *
- */
-@SuppressWarnings("rawtypes")
-public class AbstractClusterInvokerTest {
-    List<Invoker<IHelloService>> invokers = new ArrayList<Invoker<IHelloService>>();
-    List<Invoker<IHelloService>> selectedInvokers = new ArrayList<Invoker<IHelloService>>();
-    AbstractClusterInvoker<IHelloService> cluster;
+

+/**

+ * AbstractClusterInvokerTest

+ * @author chao.liuc

+ *

+ */

+@SuppressWarnings("rawtypes")

+public class AbstractClusterInvokerTest {

+    List<Invoker<IHelloService>> invokers = new ArrayList<Invoker<IHelloService>>();

+    List<Invoker<IHelloService>> selectedInvokers = new ArrayList<Invoker<IHelloService>>();

+    AbstractClusterInvoker<IHelloService> cluster;

     AbstractClusterInvoker<IHelloService> cluster_nocheck;

-    Directory<IHelloService> dic ;
+    Directory<IHelloService> dic ;

     RpcInvocation invocation = new RpcInvocation();

-    URL url = URL.valueOf("registry://localhost:9090");
-    
-    Invoker<IHelloService> invoker1 ;
-    Invoker<IHelloService> invoker2 ;
-    Invoker<IHelloService> invoker3 ;
-    Invoker<IHelloService> invoker4 ;
+    URL url = URL.valueOf("registry://localhost:9090");

+    

+    Invoker<IHelloService> invoker1 ;

+    Invoker<IHelloService> invoker2 ;

+    Invoker<IHelloService> invoker3 ;

+    Invoker<IHelloService> invoker4 ;

     Invoker<IHelloService> invoker5 ;

-    Invoker<IHelloService> mockedInvoker1 ;
-    
-
-    @BeforeClass
-    public static void setUpBeforeClass() throws Exception {
-    }
-    @SuppressWarnings({ "unchecked" })
-    @Before
-    public void setUp() throws Exception {
+    Invoker<IHelloService> mockedInvoker1 ;

+    

+

+    @BeforeClass

+    public static void setUpBeforeClass() throws Exception {

+    }

+    @SuppressWarnings({ "unchecked" })

+    @Before

+    public void setUp() throws Exception {

     	invocation.setMethodName("sayHello");

-        
-        invoker1 = EasyMock.createMock(Invoker.class);
-        invoker2 = EasyMock.createMock(Invoker.class);
-        invoker3 = EasyMock.createMock(Invoker.class);
-        invoker4 = EasyMock.createMock(Invoker.class);
+        

+        invoker1 = EasyMock.createMock(Invoker.class);

+        invoker2 = EasyMock.createMock(Invoker.class);

+        invoker3 = EasyMock.createMock(Invoker.class);

+        invoker4 = EasyMock.createMock(Invoker.class);

         invoker5 = EasyMock.createMock(Invoker.class);

-        mockedInvoker1 = EasyMock.createMock(Invoker.class);
-        
-        URL turl = URL.valueOf("test://test:11/test");
-        
-        EasyMock.expect(invoker1.isAvailable()).andReturn(false).anyTimes();
-        EasyMock.expect(invoker1.getInterface()).andReturn(IHelloService.class).anyTimes();
-        EasyMock.expect(invoker1.getUrl()).andReturn(turl.addParameter("name", "invoker1")).anyTimes();
-        
-        EasyMock.expect(invoker2.isAvailable()).andReturn(true).anyTimes();
-        EasyMock.expect(invoker2.getInterface()).andReturn(IHelloService.class).anyTimes();
-        EasyMock.expect(invoker2.getUrl()).andReturn(turl.addParameter("name", "invoker2")).anyTimes();
-        
-        EasyMock.expect(invoker3.isAvailable()).andReturn(false).anyTimes();
-        EasyMock.expect(invoker3.getInterface()).andReturn(IHelloService.class).anyTimes();
-        EasyMock.expect(invoker3.getUrl()).andReturn(turl.addParameter("name", "invoker3")).anyTimes();
-        
-        EasyMock.expect(invoker4.isAvailable()).andReturn(true).anyTimes();
-        EasyMock.expect(invoker4.getInterface()).andReturn(IHelloService.class).anyTimes();
-        EasyMock.expect(invoker4.getUrl()).andReturn(turl.addParameter("name", "invoker4")).anyTimes();
-        
-        EasyMock.expect(invoker5.isAvailable()).andReturn(false).anyTimes();
-        EasyMock.expect(invoker5.getInterface()).andReturn(IHelloService.class).anyTimes();
+        mockedInvoker1 = EasyMock.createMock(Invoker.class);

+        

+        URL turl = URL.valueOf("test://test:11/test");

+        

+        EasyMock.expect(invoker1.isAvailable()).andReturn(false).anyTimes();

+        EasyMock.expect(invoker1.getInterface()).andReturn(IHelloService.class).anyTimes();

+        EasyMock.expect(invoker1.getUrl()).andReturn(turl.addParameter("name", "invoker1")).anyTimes();

+        

+        EasyMock.expect(invoker2.isAvailable()).andReturn(true).anyTimes();

+        EasyMock.expect(invoker2.getInterface()).andReturn(IHelloService.class).anyTimes();

+        EasyMock.expect(invoker2.getUrl()).andReturn(turl.addParameter("name", "invoker2")).anyTimes();

+        

+        EasyMock.expect(invoker3.isAvailable()).andReturn(false).anyTimes();

+        EasyMock.expect(invoker3.getInterface()).andReturn(IHelloService.class).anyTimes();

+        EasyMock.expect(invoker3.getUrl()).andReturn(turl.addParameter("name", "invoker3")).anyTimes();

+        

+        EasyMock.expect(invoker4.isAvailable()).andReturn(true).anyTimes();

+        EasyMock.expect(invoker4.getInterface()).andReturn(IHelloService.class).anyTimes();

+        EasyMock.expect(invoker4.getUrl()).andReturn(turl.addParameter("name", "invoker4")).anyTimes();

+        

+        EasyMock.expect(invoker5.isAvailable()).andReturn(false).anyTimes();

+        EasyMock.expect(invoker5.getInterface()).andReturn(IHelloService.class).anyTimes();

         EasyMock.expect(invoker5.getUrl()).andReturn(turl.addParameter("name", "invoker5")).anyTimes();

         

         EasyMock.expect(mockedInvoker1.isAvailable()).andReturn(false).anyTimes();

         EasyMock.expect(mockedInvoker1.getInterface()).andReturn(IHelloService.class).anyTimes();

-        EasyMock.expect(mockedInvoker1.getUrl()).andReturn(turl.setProtocol("mock")).anyTimes();
-        
-        EasyMock.replay(invoker1,invoker2,invoker3,invoker4,invoker5,mockedInvoker1);
+        EasyMock.expect(mockedInvoker1.getUrl()).andReturn(turl.setProtocol("mock")).anyTimes();

+        

+        EasyMock.replay(invoker1,invoker2,invoker3,invoker4,invoker5,mockedInvoker1);

         

         invokers.add(invoker1);

         dic = new StaticDirectory<IHelloService>(url, invokers, null);

-        cluster = new AbstractClusterInvoker(dic) {
-            @Override
-            protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
-                    throws RpcException {
-                return null;
-            }
-        };
-        
-        cluster_nocheck = new AbstractClusterInvoker(dic,url.addParameterIfAbsent(Constants.CLUSTER_AVAILABLE_CHECK_KEY, Boolean.FALSE.toString())) {
-            @Override
-            protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
-                    throws RpcException {
-                return null;
-            }
+        cluster = new AbstractClusterInvoker(dic) {

+            @Override

+            protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)

+                    throws RpcException {

+                return null;

+            }

         };

         

-    }
-    
-    @Test
-    public void testSelect_Invokersize0() throws Exception {
-        {
-            Invoker invoker = cluster.select(null,null,null,null);
-            Assert.assertEquals(null, invoker);
-        }
-        {
-            invokers.clear();
-            selectedInvokers.clear();
-            Invoker invoker = cluster.select(null,null,invokers,null);
-            Assert.assertEquals(null, invoker);
-        }
-    }
-    
-    @Test
-    public void testSelect_Invokersize1() throws Exception {
-        invokers.clear();
-        invokers.add(invoker1);
-        Invoker invoker = cluster.select(null,null,invokers,null);
-        Assert.assertEquals(invoker1, invoker);
-    }
-    
-    @Test
-    public void testSelect_Invokersize2AndselectNotNull() throws Exception {
-        invokers.clear();
-        invokers.add(invoker1);
-        invokers.add(invoker2);
-        {
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            Invoker invoker = cluster.select(null,null,invokers,selectedInvokers);
-            Assert.assertEquals(invoker2, invoker);
-        }
-        {
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker2);
-            Invoker invoker = cluster.select(null,null,invokers,selectedInvokers);
-            Assert.assertEquals(invoker1, invoker);
-        }
-    }
-    
-    @Test
-    public void testSelect_multiInvokers() throws Exception {
-        testSelect_multiInvokers( RoundRobinLoadBalance.NAME);
-        testSelect_multiInvokers( LeastActiveLoadBalance.NAME);
-        testSelect_multiInvokers( RandomLoadBalance.NAME);
-    }
-    
-    @Test
-    public void testCloseAvailablecheck(){
-        LoadBalance lb = EasyMock.createMock(LoadBalance.class);
-        EasyMock.expect(lb.select(invokers, url, invocation)).andReturn(invoker1);
-        EasyMock.replay(lb);
-        initlistsize5();
-        
-        Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);
-        Assert.assertEquals(false,sinvoker.isAvailable());
-        Assert.assertEquals(invoker1,sinvoker);
-        
-    }
-    
-    @Test
-    public void testDonotSelectAgainAndNoCheckAvailable(){
-        
-        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);
-        initlistsize5();
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker4);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertSame(invoker1, sinvoker);
-        }
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker4);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertSame(invoker2, sinvoker);
-        }
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker4);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers );
-            Assert.assertSame(invoker3, sinvoker);
-        }
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker4);
-            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers );
-            Assert.assertSame(invoker5, sinvoker);
-        }
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker4);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertTrue(invokers.contains(sinvoker));
-        }
-        
-    }
-    
-    @Test
-    public void testSelectAgainAndCheckAvailable(){
-        
-        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);
-        initlistsize5();
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertTrue(sinvoker == invoker4 );
-        }
-        {
-            //边界测试.
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker4);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);
-        }
-        {
-            //边界测试.
-            for(int i=0;i<100;i++){
-                selectedInvokers.clear();
-                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);
-            }
-        }
-        {
-            //边界测试.
-            for(int i=0;i<100;i++){
-                selectedInvokers.clear();
-                selectedInvokers.add(invoker1);
-                selectedInvokers.add(invoker3);
-                selectedInvokers.add(invoker5);
-                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);
-            }
-        }
-        {
-            //边界测试.
-            for(int i=0;i<100;i++){
-                selectedInvokers.clear();
-                selectedInvokers.add(invoker1);
-                selectedInvokers.add(invoker3);
-                selectedInvokers.add(invoker2);
-                selectedInvokers.add(invoker4);
-                selectedInvokers.add(invoker5);
-                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);
-            }
-        }
-    }
-    
-    
-    public void testSelect_multiInvokers(String lbname) throws Exception {
-        
-        int min=1000,max=5000;
-        Double d =  (Math.random()*(max-min+1)+min);
-        int runs =  d.intValue();
-        Assert.assertTrue(runs>min);
-        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(lbname);
-        initlistsize5();
-        for(int i=0;i<runs;i++){
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker2);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker4);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker3);
-            selectedInvokers.add(invoker5);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            selectedInvokers.add(invoker1);
-            selectedInvokers.add(invoker2);
-            selectedInvokers.add(invoker3);
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            Assert.assertEquals(true,sinvoker.isAvailable());
-        }
-    }
-
-    /**
-     * 测试均衡.
-     */
-    @Test
-    public void testSelectBalance(){
-        
-        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);
-        initlistsize5();
-        
-        Map<Invoker,AtomicLong> counter = new ConcurrentHashMap<Invoker,AtomicLong>();
-        for(Invoker invoker :invokers){
-            counter.put(invoker, new AtomicLong(0));
-        }
-        int runs = 1000;
-        for(int i=0;i<runs;i++){
-            selectedInvokers.clear();
-            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);
-            counter.get(sinvoker).incrementAndGet();
-        }
-        
-        for (Invoker minvoker :counter.keySet() ){
-            Long count = counter.get(minvoker).get();
-//            System.out.println(count);
-            if(minvoker.isAvailable())
-                Assert.assertTrue("count should > avg", count>runs/invokers.size());
-        }
-        
-        Assert.assertEquals(runs, counter.get(invoker2).get()+counter.get(invoker4).get());;
-        
-    }
-    
-    private void initlistsize5(){
-        invokers.clear();
-        selectedInvokers.clear();//需要清除,之前的测试中会主动将正确的invoker2放入其中.
-        invokers.add(invoker1);
-        invokers.add(invoker2);
-        invokers.add(invoker3);
-        invokers.add(invoker4);
+        cluster_nocheck = new AbstractClusterInvoker(dic,url.addParameterIfAbsent(Constants.CLUSTER_AVAILABLE_CHECK_KEY, Boolean.FALSE.toString())) {

+            @Override

+            protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)

+                    throws RpcException {

+                return null;

+            }

+        };

+        

+    }

+    

+    @Test

+    public void testSelect_Invokersize0() throws Exception {

+        {

+            Invoker invoker = cluster.select(null,null,null,null);

+            Assert.assertEquals(null, invoker);

+        }

+        {

+            invokers.clear();

+            selectedInvokers.clear();

+            Invoker invoker = cluster.select(null,null,invokers,null);

+            Assert.assertEquals(null, invoker);

+        }

+    }

+    

+    @Test

+    public void testSelect_Invokersize1() throws Exception {

+        invokers.clear();

+        invokers.add(invoker1);

+        Invoker invoker = cluster.select(null,null,invokers,null);

+        Assert.assertEquals(invoker1, invoker);

+    }

+    

+    @Test

+    public void testSelect_Invokersize2AndselectNotNull() throws Exception {

+        invokers.clear();

+        invokers.add(invoker1);

+        invokers.add(invoker2);

+        {

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            Invoker invoker = cluster.select(null,null,invokers,selectedInvokers);

+            Assert.assertEquals(invoker2, invoker);

+        }

+        {

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker2);

+            Invoker invoker = cluster.select(null,null,invokers,selectedInvokers);

+            Assert.assertEquals(invoker1, invoker);

+        }

+    }

+    

+    @Test

+    public void testSelect_multiInvokers() throws Exception {

+        testSelect_multiInvokers( RoundRobinLoadBalance.NAME);

+        testSelect_multiInvokers( LeastActiveLoadBalance.NAME);

+        testSelect_multiInvokers( RandomLoadBalance.NAME);

+    }

+    

+    @Test

+    public void testCloseAvailablecheck(){

+        LoadBalance lb = EasyMock.createMock(LoadBalance.class);

+        EasyMock.expect(lb.select(

+                EasyMock.same(invokers),

+                (URL)EasyMock.anyObject(),

+                EasyMock.same(invocation))).andReturn(invoker1);

+        EasyMock.replay(lb);

+        initlistsize5();

+        

+        Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);

+        Assert.assertEquals(false,sinvoker.isAvailable());

+        Assert.assertEquals(invoker1,sinvoker);

+        

+    }

+    

+    @Test

+    public void testDonotSelectAgainAndNoCheckAvailable(){

+        

+        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);

+        initlistsize5();

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker4);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertSame(invoker1, sinvoker);

+        }

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker4);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertSame(invoker2, sinvoker);

+        }

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker4);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers );

+            Assert.assertSame(invoker3, sinvoker);

+        }

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker4);

+            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers );

+            Assert.assertSame(invoker5, sinvoker);

+        }

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker4);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster_nocheck.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertTrue(invokers.contains(sinvoker));

+        }

+        

+    }

+    

+    @Test

+    public void testSelectAgainAndCheckAvailable(){

+        

+        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);

+        initlistsize5();

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertTrue(sinvoker == invoker4 );

+        }

+        {

+            //边界测试.

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker4);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);

+        }

+        {

+            //边界测试.

+            for(int i=0;i<100;i++){

+                selectedInvokers.clear();

+                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);

+            }

+        }

+        {

+            //边界测试.

+            for(int i=0;i<100;i++){

+                selectedInvokers.clear();

+                selectedInvokers.add(invoker1);

+                selectedInvokers.add(invoker3);

+                selectedInvokers.add(invoker5);

+                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);

+            }

+        }

+        {

+            //边界测试.

+            for(int i=0;i<100;i++){

+                selectedInvokers.clear();

+                selectedInvokers.add(invoker1);

+                selectedInvokers.add(invoker3);

+                selectedInvokers.add(invoker2);

+                selectedInvokers.add(invoker4);

+                selectedInvokers.add(invoker5);

+                Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+                Assert.assertTrue(sinvoker == invoker2 || sinvoker == invoker4);

+            }

+        }

+    }

+    

+    

+    public void testSelect_multiInvokers(String lbname) throws Exception {

+        

+        int min=1000,max=5000;

+        Double d =  (Math.random()*(max-min+1)+min);

+        int runs =  d.intValue();

+        Assert.assertTrue(runs>min);

+        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(lbname);

+        initlistsize5();

+        for(int i=0;i<runs;i++){

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker2);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker4);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker3);

+            selectedInvokers.add(invoker5);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            selectedInvokers.add(invoker1);

+            selectedInvokers.add(invoker2);

+            selectedInvokers.add(invoker3);

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            Assert.assertEquals(true,sinvoker.isAvailable());

+        }

+    }

+

+    /**

+     * 测试均衡.

+     */

+    @Test

+    public void testSelectBalance(){

+        

+        LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(RoundRobinLoadBalance.NAME);

+        initlistsize5();

+        

+        Map<Invoker,AtomicLong> counter = new ConcurrentHashMap<Invoker,AtomicLong>();

+        for(Invoker invoker :invokers){

+            counter.put(invoker, new AtomicLong(0));

+        }

+        int runs = 1000;

+        for(int i=0;i<runs;i++){

+            selectedInvokers.clear();

+            Invoker sinvoker = cluster.select(lb, invocation, invokers, selectedInvokers);

+            counter.get(sinvoker).incrementAndGet();

+        }

+        

+        for (Invoker minvoker :counter.keySet() ){

+            Long count = counter.get(minvoker).get();

+//            System.out.println(count);

+            if(minvoker.isAvailable())

+                Assert.assertTrue("count should > avg", count>runs/invokers.size());

+        }

+        

+        Assert.assertEquals(runs, counter.get(invoker2).get()+counter.get(invoker4).get());;

+        

+    }

+    

+    private void initlistsize5(){

+        invokers.clear();

+        selectedInvokers.clear();//需要清除,之前的测试中会主动将正确的invoker2放入其中.

+        invokers.add(invoker1);

+        invokers.add(invoker2);

+        invokers.add(invoker3);

+        invokers.add(invoker4);

         invokers.add(invoker5);

-    }
+    }

     @Test()

     public void testTimeoutExceptionCode() {

         List<Invoker<DemoService>> invokers = new ArrayList<Invoker<DemoService>>();