You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/03/30 09:37:44 UTC

[incubator-servicecomb-java-chassis] branch master updated: [SCB-443] fix randomly UT failure of TestProviderQpsFlowControlHandler

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 13743fe  [SCB-443] fix randomly UT failure of TestProviderQpsFlowControlHandler
13743fe is described below

commit 13743fe38b44be36fefb4563507a295a536a0489
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Wed Mar 28 16:09:00 2018 +0800

    [SCB-443] fix randomly UT failure of TestProviderQpsFlowControlHandler
---
 .../qps/TestConsumerQpsFlowControlHandler.java     | 140 ++++++++---------
 .../qps/TestProviderQpsFlowControlHandler.java     | 173 +++++++++++----------
 2 files changed, 158 insertions(+), 155 deletions(-)

diff --git a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
index 6359a7e..ea58948 100644
--- a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
@@ -17,16 +17,23 @@
 
 package org.apache.servicecomb.qps;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
+import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
 import mockit.Deencapsulation;
@@ -43,6 +50,9 @@ public class TestConsumerQpsFlowControlHandler {
 
   OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
 
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   @Before
   public void setUP() {
     ArchaiusUtils.resetConfig();
@@ -58,6 +68,13 @@ public class TestConsumerQpsFlowControlHandler {
 
   @Test
   public void testQpsController() {
+    // to avoid time influence on QpsController
+    new MockUp<System>() {
+      @Mock
+      long currentTimeMillis() {
+        return 1L;
+      }
+    };
     QpsController qpsController = new QpsController("abc", 100);
     Assert.assertEquals(false, qpsController.isLimitNewRequest());
 
@@ -66,80 +83,61 @@ public class TestConsumerQpsFlowControlHandler {
   }
 
   @Test
-  public void testHandleWithException() {
-    boolean validAssert;
-    try {
-      validAssert = true;
-
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      validAssert = false;
-    }
-    Assert.assertFalse(validAssert);
-  }
-
-  @Test
-  public void testHandle() {
-    boolean validAssert;
-    try {
-      validAssert = true;
-      String key = "svc.schema.opr";
-      QpsController qpsController = new QpsController("key", 12);
-      Mockito.when(invocation.getOperationMeta()).thenReturn(operationMeta);
-      Mockito.when(operationMeta.getMicroserviceQualifiedName()).thenReturn(key);
-      setQpsController(key, qpsController);
-      new MockUp<QpsController>() {
-        @Mock
-        public boolean isLimitNewRequest() {
-          return true;
-        }
-      };
-
-      new MockUp<QpsControllerManager>() {
-        @Mock
-        protected QpsController create(String qualifiedNameKey) {
-          return qpsController;
-        }
-      };
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      e.printStackTrace();
-      validAssert = false;
-    }
-    Assert.assertTrue(validAssert);
+  public void testHandle() throws Exception {
+    String key = "svc.schema.opr";
+    QpsController qpsController = new QpsController("key", 12);
+    Mockito.when(invocation.getOperationMeta()).thenReturn(operationMeta);
+    Mockito.when(operationMeta.getMicroserviceQualifiedName()).thenReturn(key);
+    setQpsController(key, qpsController);
+    new MockUp<QpsController>() {
+      @Mock
+      public boolean isLimitNewRequest() {
+        return true;
+      }
+    };
+
+    new MockUp<QpsControllerManager>() {
+      @Mock
+      protected QpsController create(String qualifiedNameKey) {
+        return qpsController;
+      }
+    };
+
+    handler.handle(invocation, asyncResp);
+
+    ArgumentCaptor<InvocationException> captor = ArgumentCaptor.forClass(InvocationException.class);
+    Mockito.verify(asyncResp).consumerFail(captor.capture());
+    InvocationException invocationException = captor.getValue();
+    assertEquals(QpsConst.TOO_MANY_REQUESTS_STATUS, invocationException.getStatus());
+    assertEquals("rejected by qps flowcontrol",
+        ((CommonExceptionData) invocationException.getErrorData()).getMessage());
   }
 
   @Test
-  public void testHandleIsLimitNewRequestAsFalse() {
-    boolean validAssert;
-    try {
-      validAssert = true;
-      String key = "MicroserviceQualifiedName";
-      QpsController qpsController = new QpsController("key", 12);
-      Mockito.when(invocation.getOperationMeta()).thenReturn(operationMeta);
-      Mockito.when(operationMeta.getMicroserviceQualifiedName()).thenReturn(key);
-      setQpsController(key, qpsController);
-
-      new MockUp<QpsController>() {
-        @Mock
-        public boolean isLimitNewRequest() {
-          return false;
-        }
-      };
-
-      new MockUp<QpsControllerManager>() {
-
-        @Mock
-        protected QpsController create(String qualifiedNameKey) {
-          return qpsController;
-        }
-      };
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      e.printStackTrace();
-      validAssert = false;
-    }
-    Assert.assertTrue(validAssert);
+  public void testHandleIsLimitNewRequestAsFalse() throws Exception {
+    String key = "MicroserviceQualifiedName";
+    QpsController qpsController = new QpsController("key", 12);
+    Mockito.when(invocation.getOperationMeta()).thenReturn(operationMeta);
+    Mockito.when(operationMeta.getMicroserviceQualifiedName()).thenReturn(key);
+    setQpsController(key, qpsController);
+
+    new MockUp<QpsController>() {
+      @Mock
+      public boolean isLimitNewRequest() {
+        return false;
+      }
+    };
+
+    new MockUp<QpsControllerManager>() {
+
+      @Mock
+      protected QpsController create(String qualifiedNameKey) {
+        return qpsController;
+      }
+    };
+    handler.handle(invocation, asyncResp);
+
+    Mockito.verify(invocation).next(asyncResp);
   }
 
   private void setQpsController(String key, QpsController qpsController) {
diff --git a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
index 1bdf8a2..52cf625 100644
--- a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
@@ -17,17 +17,22 @@
 
 package org.apache.servicecomb.qps;
 
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.times;
 
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
+import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
 import mockit.Expectations;
@@ -44,6 +49,9 @@ public class TestProviderQpsFlowControlHandler {
 
   OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
 
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   @Before
   public void setUP() {
     ArchaiusUtils.resetConfig();
@@ -71,109 +79,106 @@ public class TestProviderQpsFlowControlHandler {
         result = new RuntimeException("test error");
       }
     };
+    mockUpSystemTime();
 
     ProviderQpsFlowControlHandler gHandler = new ProviderQpsFlowControlHandler();
     gHandler.handle(invocation, asyncResp);
 
     Utils.updateProperty(Config.PROVIDER_LIMIT_KEY_GLOBAL, 3);
 
-    int count = 1;
-    try {
-      gHandler.handle(invocation, asyncResp);
-      count++;
-      gHandler.handle(invocation, asyncResp);
-      fail("An exception is expected!");
-    } catch (Exception e) {
-      Assert.assertEquals(2, count);
-      Assert.assertEquals("test error", e.getMessage());
-    }
+    expectedException.expect(RuntimeException.class);
+    expectedException.expectMessage("test error");
+
+    gHandler.handle(invocation, asyncResp);
+    gHandler.handle(invocation, asyncResp);
   }
 
+
   @Test
   public void testQpsController() {
+    mockUpSystemTime();
     QpsController qpsController = new QpsController("abc", 100);
-    Assert.assertEquals(false, qpsController.isLimitNewRequest());
+    assertEquals(false, qpsController.isLimitNewRequest());
 
     qpsController.setQpsLimit(1);
-    Assert.assertEquals(true, qpsController.isLimitNewRequest());
+    assertEquals(true, qpsController.isLimitNewRequest());
   }
 
   @Test
-  public void testHandleWithException() {
-    boolean validAssert;
-    try {
-      Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn(null);
-
-      validAssert = true;
-      handler.handle(invocation, asyncResp);
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      e.printStackTrace();
-      validAssert = false;
-    }
-    Assert.assertTrue(validAssert);
+  public void testHandleOnSourceMicroserviceNameIsNull() throws Exception {
+    Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn(null);
+
+    handler.handle(invocation, asyncResp);
+    handler.handle(invocation, asyncResp);
+
+    Mockito.verify(invocation, times(2)).next(asyncResp);
   }
 
   @Test
-  public void testHandle() {
-    boolean validAssert;
-    try {
-      validAssert = true;
-      Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn("test");
-      OperationMeta mockOperationMeta = QpsControllerManagerTest.getMockOperationMeta("pojo", "server", "opr");
-      Mockito.when(invocation.getOperationMeta()).thenReturn(mockOperationMeta);
-
-      new MockUp<QpsController>() {
-        @Mock
-        public boolean isLimitNewRequest() {
-          return true;
-        }
-      };
-
-      new MockUp<QpsControllerManager>() {
-
-        @Mock
-        protected QpsController create(String qualifiedNameKey) {
-          return new QpsController(qualifiedNameKey, 12);
-        }
-      };
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      e.printStackTrace();
-      validAssert = false;
-    }
-    Assert.assertTrue(validAssert);
+  public void testHandle() throws Exception {
+    Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn("test");
+    OperationMeta mockOperationMeta = QpsControllerManagerTest.getMockOperationMeta("pojo", "server", "opr");
+    Mockito.when(invocation.getOperationMeta()).thenReturn(mockOperationMeta);
+
+    new MockUp<QpsController>() {
+      @Mock
+      public boolean isLimitNewRequest() {
+        return true;
+      }
+    };
+
+    new MockUp<QpsControllerManager>() {
+
+      @Mock
+      protected QpsController create(String qualifiedNameKey) {
+        return new QpsController(qualifiedNameKey, 12);
+      }
+    };
+
+    handler.handle(invocation, asyncResp);
+
+    ArgumentCaptor<InvocationException> captor = ArgumentCaptor.forClass(InvocationException.class);
+    Mockito.verify(asyncResp).producerFail(captor.capture());
+
+    InvocationException invocationException = captor.getValue();
+    assertEquals(QpsConst.TOO_MANY_REQUESTS_STATUS, invocationException.getStatus());
+    assertEquals("rejected by qps flowcontrol",
+        ((CommonExceptionData) invocationException.getErrorData()).getMessage());
   }
 
   @Test
-  public void testHandleIsLimitNewRequestAsFalse() {
-    boolean validAssert;
-    try {
-      validAssert = true;
-      Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn("test");
-      OperationMeta mockOperationMeta = QpsControllerManagerTest
-          .getMockOperationMeta("pojo", "server", "opr");
-      Mockito.when(invocation.getOperationMeta()).thenReturn(mockOperationMeta);
-
-      new MockUp<QpsController>() {
-        @Mock
-        public boolean isLimitNewRequest() {
-          return false;
-        }
-      };
-
-      new MockUp<QpsControllerManager>() {
-
-        @Mock
-        protected QpsController create(String qualifiedNameKey) {
-          return new QpsController(qualifiedNameKey, 12);
-        }
-      };
-      handler.handle(invocation, asyncResp);
-    } catch (Exception e) {
-      e.printStackTrace();
-      validAssert = false;
-    }
-    Assert.assertTrue(validAssert);
+  public void testHandleIsLimitNewRequestAsFalse() throws Exception {
+    Mockito.when(invocation.getContext(Const.SRC_MICROSERVICE)).thenReturn("test");
+    OperationMeta mockOperationMeta = QpsControllerManagerTest
+        .getMockOperationMeta("pojo", "server", "opr");
+    Mockito.when(invocation.getOperationMeta()).thenReturn(mockOperationMeta);
+
+    new MockUp<QpsController>() {
+      @Mock
+      public boolean isLimitNewRequest() {
+        return false;
+      }
+    };
+
+    new MockUp<QpsControllerManager>() {
+
+      @Mock
+      protected QpsController create(String qualifiedNameKey) {
+        return new QpsController(qualifiedNameKey, 12);
+      }
+    };
+    handler.handle(invocation, asyncResp);
+
+    Mockito.verify(invocation).next(asyncResp);
+  }
+
+  private void mockUpSystemTime() {
+    // to avoid time influence on QpsController
+    new MockUp<System>() {
+      @Mock
+      long currentTimeMillis() {
+        return 1L;
+      }
+    };
   }
 }

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.