From fe9ef89970d7c4031791c575f734bc3ebf54cf64 Mon Sep 17 00:00:00 2001 From: Piotr Fus Date: Tue, 11 Aug 2020 12:53:35 +0200 Subject: [PATCH] Do not remove mock from history after max uses --- README.md | 2 +- .../touk/mockserver/tests/MockServerMaxUsesTest.groovy | 2 ++ .../pl/touk/mockserver/server/ContextExecutor.groovy | 8 +++----- .../main/groovy/pl/touk/mockserver/server/Mock.groovy | 9 +++------ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7439888..042fc5d 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ Send POST request to localhost:/serverControl - schema - path to xsd schema file on mockserver classpath; default empty, so no vallidation of request is performed; if validation fails then response has got status 400 and response is raw message from validator - imports - list of imports for closures (each import is separate tag); `alias` is the name of `fullClassName` available in closure; `fullClassName` must be available on classpath of mock server - https - HTTPS configuration -- maxUses - limit uses of mock to the specific number, after that mock is removed (any negative number means unlimited - default, cannot set value to 0) +- maxUses - limit uses of mock to the specific number, after that mock is marked as ignored (any negative number means unlimited - default, cannot set value to 0), after this number of invocation mock history is still available, but mock does not apply to any request - cyclic - should mock be added after `maxUses` uses at the end of the mock list (by default false) #### HTTPS configuration diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy index 08d2c12..9e05890 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerMaxUsesTest.groovy @@ -96,6 +96,8 @@ class MockServerMaxUsesTest extends Specification { CloseableHttpResponse response3 = client.execute(restPost) then:'no mock should be found' response3.statusLine.statusCode == 404 + and:'mock should exist' + remoteMockServer.listMocks().find { it.name == 'mock1' } != null } def 'should return two mocks in cyclic order'() { diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index 7b31b22..57aa952 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -97,17 +97,15 @@ class ContextExecutor { private synchronized void handleMaxUses(Mock mock) { if (mock.hasLimitedUses()) { mock.decrementUses() - removeAndResetIfNeeded(mock) + resetIfNeeded(mock) log.debug("Uses left ${mock.usesLeft} of ${mock.maxUses} (is cyclic: ${mock.cyclic})") } } - private void removeAndResetIfNeeded(Mock mock) { - if (mock.shouldBeRemoved()) { - mocks.remove(mock) - } + private void resetIfNeeded(Mock mock) { if (mock.shouldUsesBeReset()) { mock.resetUses() + mocks.remove(mock) mocks.add(mock) } } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index 0a4fa42..434dd0f 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -59,7 +59,8 @@ class Mock implements Comparable { } boolean match(Method method, MockRequest request) { - return this.method == method && predicate(request) + boolean usesCondition = hasLimitedUses() ? usesLeft > 0 : true + return usesCondition && this.method == method && predicate(request) } MockResponse apply(MockRequest request) { @@ -188,12 +189,8 @@ class Mock implements Comparable { usesLeft-- } - boolean shouldBeRemoved() { - return hasLimitedUses() && usesLeft <= 0 - } - boolean shouldUsesBeReset() { - return shouldBeRemoved() && cyclic + return hasLimitedUses() && usesLeft <= 0 && cyclic } void resetUses() {