# HG changeset patch # User Chris Lessard # Date 1508429096 14400 # Node ID 4375a5dd5ec8ddb30e6dfe939b75258395feba39 # Parent 701a5b3037dd37313c6e9e21810525ab4d65abf2 Fix bug in metadata payloadCount values. Reviewed-by: jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-October/025403.html diff -r 701a5b3037dd -r 4375a5dd5ec8 common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGenerator.java --- a/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGenerator.java Thu Oct 19 15:49:00 2017 +0200 +++ b/common/mongodb/src/main/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGenerator.java Thu Oct 19 12:04:56 2017 -0400 @@ -54,6 +54,8 @@ private final Map requestParamArguments; private final String baseURL; + private static final int UNLIMITED = 0; + public MongoMetaDataGenerator(CommonQueryParams params, Map requestParamArguments, MongoDataResultContainer execResult, String baseUrl) { this.limit = params.getLimit(); @@ -70,11 +72,34 @@ public void setDocAndPayloadCount(MongoMetaDataResponseBuilder.MetaBuilder response) { if (!"".equals(queries)) { Integer docCount = (int) execResult.getGetReqCount(); - Integer payloadCount = (limit > 1) ? 0 : docCount; + Integer payloadCount = generatePayloadCount(offset, limit, docCount); + response.count(docCount).payloadCount(payloadCount); } } + // For testing purposes + int generatePayloadCount(int offset, int limit, int docCount) { + int payloadCount = 0; + + if (offset < 0 || limit < 0) { + throw new IllegalArgumentException(); + } + + if (offset == 0) { + if (limit == UNLIMITED) { + return docCount; + } + + return (docCount < limit) ? docCount : limit; + } else if (offset > 0 && offset < docCount) { + int diff = offset + limit; + payloadCount = (diff > docCount || diff <= docCount && limit == UNLIMITED) ? docCount - offset : limit; + } + + return payloadCount; + } + public void setPrev(MongoMetaDataResponseBuilder.MetaBuilder response) { if (!Integer.valueOf(0).equals(offset)) { StringBuilder prev = new StringBuilder(); diff -r 701a5b3037dd -r 4375a5dd5ec8 common/mongodb/src/test/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGeneratorTest.java --- a/common/mongodb/src/test/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGeneratorTest.java Thu Oct 19 15:49:00 2017 +0200 +++ b/common/mongodb/src/test/java/com/redhat/thermostat/gateway/common/mongodb/response/MongoMetaDataGeneratorTest.java Thu Oct 19 12:04:56 2017 -0400 @@ -80,7 +80,7 @@ public void testSetCounts() { fullGenerator.setDocAndPayloadCount(response); String output = response.build().toString(); - String expected = "{\"payloadCount\":0,\"count\":4}"; + String expected = "{\"payloadCount\":2,\"count\":4}"; assertEquals(expected, output); } @@ -123,4 +123,94 @@ assertEquals(expected, output); } + + @Test + public void testGeneratePayloadCountZeroLimitZeroOffset() { + Integer count = 10; + Integer limit = 0; + Integer offset = 0; + + assertEquals(10, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test(expected = IllegalArgumentException.class) + public void testGeneratePayloadCountLimitOffsetBothNegative() { + Integer count = 10; + Integer limit = -1; + Integer offset = -1; + + fullGenerator.generatePayloadCount(offset, limit, count); + } + + @Test + public void testGeneratePayloadCountLimitLessThanCountNoOffset() { + Integer count = 10; + Integer limit = 5; + Integer offset = 0; + + assertEquals(5, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountLimitEqualToCountNoOffset() { + Integer count = 10; + Integer limit = 10; + Integer offset = 0; + + assertEquals(10, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountLimitGreaterThanCountNoOffset() { + Integer count = 10; + Integer limit = 15; + Integer offset = 0; + + assertEquals(10, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountOffsetLessThanCountNoLimit() { + Integer count = 10; + Integer limit = 0; + Integer offset = 5; + + assertEquals(5, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountOffsetEqualToCountNoLimit() { + Integer count = 10; + Integer limit = 0; + Integer offset = 10; + + assertEquals(0, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountOffsetGreaterThanCountNoLimit() { + Integer count = 10; + Integer limit = 0; + Integer offset = 15; + + assertEquals(0, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountOffsetLimitLessThanCountAndOffset() { + Integer count = 10; + Integer limit = 3; + Integer offset = 5; + + assertEquals(3, fullGenerator.generatePayloadCount(offset, limit, count)); + } + + @Test + public void testGeneratePayloadCountOffsetLimitLessThanCountGreaterThanOffset() { + Integer count = 10; + Integer limit = 8; + Integer offset = 5; + + assertEquals(5, fullGenerator.generatePayloadCount(offset, limit, count)); + } }