summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
7cce324)
Use guava stopwatch and mockito runner.
Change-Id: I87fd7f6b32379307875a2d3f353e6ad2d5bc2d38
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
package org.opendaylight.controller.cluster.datastore.utils;
import static org.hamcrest.MatcherAssert.assertThat;
package org.opendaylight.controller.cluster.datastore.utils;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import com.codahale.metrics.Snapshot;
import com.codahale.metrics.Timer;
import com.codahale.metrics.Snapshot;
import com.codahale.metrics.Timer;
+import com.google.common.base.Stopwatch;
+import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
-import org.apache.commons.lang3.time.StopWatch;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.controller.cluster.datastore.DatastoreContext;
import org.opendaylight.controller.cluster.datastore.DatastoreContext;
+// FIXME: use Strict runner
+@RunWith(MockitoJUnitRunner.Silent.class)
public class TransactionRateLimiterTest {
public class TransactionRateLimiterTest {
@Mock
public ActorUtils actorUtils;
@Mock
public ActorUtils actorUtils;
@Mock
public DatastoreContext datastoreContext;
@Mock
public DatastoreContext datastoreContext;
@Mock
public Timer commitTimer;
@Mock
public Timer commitTimer;
@Mock
private Timer.Context commitTimerContext;
@Mock
private Timer.Context commitTimerContext;
@Mock
private Snapshot commitSnapshot;
@Before
public void setUp() {
@Mock
private Snapshot commitSnapshot;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
doReturn(datastoreContext).when(actorUtils).getDatastoreContext();
doReturn(30).when(datastoreContext).getShardTransactionCommitTimeoutInSeconds();
doReturn(100L).when(datastoreContext).getTransactionCreationInitialRateLimit();
doReturn(datastoreContext).when(actorUtils).getDatastoreContext();
doReturn(30).when(datastoreContext).getShardTransactionCommitTimeoutInSeconds();
doReturn(100L).when(datastoreContext).getTransactionCreationInitialRateLimit();
}
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
}
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(292));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(292));
assertEquals(147, rateLimiter.getPollOnCount());
}
assertEquals(147, rateLimiter.getPollOnCount());
}
@Test
public void testAcquirePercentileValueZero() {
@Test
public void testAcquirePercentileValueZero() {
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
doReturn(TimeUnit.MILLISECONDS.toNanos(0) * 1D).when(commitSnapshot).getValue(0.1);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
doReturn(TimeUnit.MILLISECONDS.toNanos(0) * 1D).when(commitSnapshot).getValue(0.1);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(192));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(192));
assertEquals(97, rateLimiter.getPollOnCount());
}
@Test
public void testAcquireOnePercentileValueVeryHigh() {
assertEquals(97, rateLimiter.getPollOnCount());
}
@Test
public void testAcquireOnePercentileValueVeryHigh() {
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
doReturn(TimeUnit.MILLISECONDS.toNanos(10000) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
doReturn(TimeUnit.MILLISECONDS.toNanos(10000) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(282));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(282));
assertEquals(142, rateLimiter.getPollOnCount());
}
assertEquals(142, rateLimiter.getPollOnCount());
}
}
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
}
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
// The initial rate limit will be retained here because the calculated rate limit was too small
assertThat(rateLimiter.getTxCreationLimit(), approximately(100));
rateLimiter.acquire();
// The initial rate limit will be retained here because the calculated rate limit was too small
assertThat(rateLimiter.getTxCreationLimit(), approximately(100));
assertEquals(1, rateLimiter.getPollOnCount());
}
@Test
public void testAcquireWithRealPercentileValues() {
assertEquals(1, rateLimiter.getPollOnCount());
}
@Test
public void testAcquireWithRealPercentileValues() {
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
doReturn(TimeUnit.MILLISECONDS.toNanos(200) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
doReturn(TimeUnit.MILLISECONDS.toNanos(200) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
assertEquals(51, rateLimiter.getPollOnCount());
}
assertEquals(51, rateLimiter.getPollOnCount());
}
DatastoreContext.getGlobalDatastoreNames().add("operational");
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
DatastoreContext.getGlobalDatastoreNames().add("operational");
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(292));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(292));
assertEquals(147, rateLimiter.getPollOnCount());
}
@Test
public void testRateLimiting() {
assertEquals(147, rateLimiter.getPollOnCount());
}
@Test
public void testRateLimiting() {
for (int i = 1; i < 11; i++) {
doReturn(TimeUnit.SECONDS.toNanos(1) * 1D).when(commitSnapshot).getValue(i * 0.1);
}
for (int i = 1; i < 11; i++) {
doReturn(TimeUnit.SECONDS.toNanos(1) * 1D).when(commitSnapshot).getValue(i * 0.1);
}
- TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
-
- StopWatch watch = new StopWatch();
-
- watch.start();
+ final TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
+ final Stopwatch watch = Stopwatch.createStarted();
rateLimiter.acquire();
rateLimiter.acquire();
rateLimiter.acquire();
rateLimiter.acquire();
- assertTrue("did not take as much time as expected rate limit : " + rateLimiter.getTxCreationLimit(),
- watch.getTime() > 1000);
+ assertThat("did not take as much time as expected rate limit : " + rateLimiter.getTxCreationLimit(),
+ watch.elapsed(), greaterThan(Duration.ofSeconds(1)));
}
@Test
public void testRateLimitNotCalculatedUntilPollCountReached() {
}
@Test
public void testRateLimitNotCalculatedUntilPollCountReached() {
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
doReturn(TimeUnit.MILLISECONDS.toNanos(200) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
doReturn(TimeUnit.MILLISECONDS.toNanos(200) * 1D).when(commitSnapshot).getValue(1.0);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
assertEquals(51, rateLimiter.getPollOnCount());
for (int i = 0; i < 49; i++) {
assertEquals(51, rateLimiter.getPollOnCount());
for (int i = 0; i < 49; i++) {
@Test
public void testAcquireNegativeAcquireAndPollOnCount() {
@Test
public void testAcquireNegativeAcquireAndPollOnCount() {
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
for (int i = 1; i < 11; i++) {
// Keep on increasing the amount of time it takes to complete transaction for each tenth of a
// percentile. Essentially this would be 1ms for the 10th percentile, 2ms for 20th percentile and so on.
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.setAcquireCount(Long.MAX_VALUE - 1);
rateLimiter.setPollOnCount(Long.MAX_VALUE);
TransactionRateLimiter rateLimiter = new TransactionRateLimiter(actorUtils);
rateLimiter.setAcquireCount(Long.MAX_VALUE - 1);
rateLimiter.setPollOnCount(Long.MAX_VALUE);
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
rateLimiter.acquire();
assertThat(rateLimiter.getTxCreationLimit(), approximately(101));
assertEquals(-9223372036854775759L, rateLimiter.getPollOnCount());
for (int i = 0; i < 50; i++) {
assertEquals(-9223372036854775759L, rateLimiter.getPollOnCount());
for (int i = 0; i < 50; i++) {
}
verify(commitTimer, times(2)).getSnapshot();
}
verify(commitTimer, times(2)).getSnapshot();
}
public Matcher<Double> approximately(final double val) {
}
public Matcher<Double> approximately(final double val) {