From 3c7a867d848d6de896b9eb88fd5ce9312f1870fc Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Wed, 7 May 2025 13:47:30 -0700 Subject: [PATCH 1/8] Send pings to endpoint --- .../service/ping/PingEndpointService.java | 6 +++++ .../ping/impl/PingEndpointServiceImpl.java | 25 +++++++++++++++++++ .../webservice/crater/CRaterPingRequest.java | 24 ++++++++++++++++++ .../org/wise/vle/web/CRaterController.java | 15 +++++++++++ 4 files changed, 70 insertions(+) create mode 100644 src/main/java/org/wise/portal/service/ping/PingEndpointService.java create mode 100644 src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java create mode 100644 src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java diff --git a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java new file mode 100644 index 000000000..b8bb272e9 --- /dev/null +++ b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java @@ -0,0 +1,6 @@ +package org.wise.portal.service.ping; + +public interface PingEndpointService { + public boolean hasPingedItem(String itemId); + public void cachePingTimestamp(String itemId); +} diff --git a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java new file mode 100644 index 000000000..c83facca0 --- /dev/null +++ b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java @@ -0,0 +1,25 @@ +package org.wise.portal.service.ping.impl; + +import java.time.Duration; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; +import org.wise.portal.service.ping.PingEndpointService; + +@Service +public class PingEndpointServiceImpl implements PingEndpointService{ + @Autowired + private StringRedisTemplate stringRedisTemplate; + + public boolean hasPingedItem(String itemId) { + Set members = stringRedisTemplate.opsForSet().members(itemId); + return members.size() > 0; + } + + public void cachePingTimestamp(String itemId) { + this.stringRedisTemplate.opsForSet().add(itemId, "pinged"); + this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(270)); + } +} \ No newline at end of file diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java new file mode 100644 index 000000000..0cd0ff0a1 --- /dev/null +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java @@ -0,0 +1,24 @@ +package org.wise.vle.domain.webservice.crater; + +import org.json.JSONException; +import org.json.JSONObject; + +import lombok.Setter; + +@Setter +public class CRaterPingRequest extends AbstractCRaterRequest { + public String generateBodyData() throws JSONException { + JSONObject body = new JSONObject(super.generateBodyData()); + body.put("ping", true); + return body.toString(); + } + + @Override + public String getCRaterUrlVariableBase() { + return "cRater_scoring_url"; + } + + public String getItemId() { + return this.itemId; + } +} diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 58573b402..6565c1ffc 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -31,6 +31,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.wise.vle.domain.webservice.crater.CRaterVerificationRequest; +import org.wise.portal.service.ping.PingEndpointService; +import org.wise.vle.domain.webservice.crater.CRaterPingRequest; import org.wise.vle.domain.webservice.crater.CRaterScoringRequest; import org.wise.vle.domain.webservice.crater.CRaterService; @@ -40,6 +42,9 @@ public class CRaterController { @Autowired private CRaterService cRaterService; + + @Autowired + private PingEndpointService pingEndpointService; @GetMapping("/verify") String verifyItemId(CRaterVerificationRequest request) throws JSONException { @@ -50,4 +55,14 @@ String verifyItemId(CRaterVerificationRequest request) throws JSONException { String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException { return cRaterService.getCRaterResponse(request); } + + @PostMapping("/ping-endpoint") + public void receivePingRequest(@RequestBody CRaterPingRequest ping) throws JSONException { + String itemId = ping.getItemId(); + boolean readyToPing = !this.pingEndpointService.hasPingedItem(itemId); + if (ping.forBerkeleyEndpoint() && readyToPing) { + this.pingEndpointService.cachePingTimestamp(itemId); + this.cRaterService.getCRaterResponse(ping); + } + } } From 59093eb62ea7288661e1b07741000ba6ca70de7e Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Fri, 9 May 2025 16:03:27 -0700 Subject: [PATCH 2/8] Add LoadService to body and clean up --- .../org/wise/portal/service/ping/PingEndpointService.java | 2 +- .../portal/service/ping/impl/PingEndpointServiceImpl.java | 4 ++-- .../vle/domain/webservice/crater/CRaterPingRequest.java | 2 +- src/main/java/org/wise/vle/web/CRaterController.java | 7 ++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java index b8bb272e9..f2b7dc2ae 100644 --- a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java +++ b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java @@ -2,5 +2,5 @@ public interface PingEndpointService { public boolean hasPingedItem(String itemId); - public void cachePingTimestamp(String itemId); + public void cachePingedItem(String itemId); } diff --git a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java index c83facca0..79df4bd2c 100644 --- a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java +++ b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java @@ -18,8 +18,8 @@ public boolean hasPingedItem(String itemId) { return members.size() > 0; } - public void cachePingTimestamp(String itemId) { + public void cachePingedItem(String itemId) { this.stringRedisTemplate.opsForSet().add(itemId, "pinged"); - this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(270)); + this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(280)); } } \ No newline at end of file diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java index 0cd0ff0a1..12ef72f19 100644 --- a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterPingRequest.java @@ -9,7 +9,7 @@ public class CRaterPingRequest extends AbstractCRaterRequest { public String generateBodyData() throws JSONException { JSONObject body = new JSONObject(super.generateBodyData()); - body.put("ping", true); + body.put("service", "LoadService"); return body.toString(); } diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 6565c1ffc..85741e72c 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -57,12 +57,13 @@ String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException } @PostMapping("/ping-endpoint") - public void receivePingRequest(@RequestBody CRaterPingRequest ping) throws JSONException { + public String receivePingRequest(@RequestBody CRaterPingRequest ping) throws JSONException { String itemId = ping.getItemId(); boolean readyToPing = !this.pingEndpointService.hasPingedItem(itemId); if (ping.forBerkeleyEndpoint() && readyToPing) { - this.pingEndpointService.cachePingTimestamp(itemId); - this.cRaterService.getCRaterResponse(ping); + this.pingEndpointService.cachePingedItem(itemId); + return this.cRaterService.getCRaterResponse(ping); } + return ""; } } From 46a91e1a840783f15f9c0908fdd3dd60ba2e2a08 Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Mon, 12 May 2025 11:50:46 -0700 Subject: [PATCH 3/8] Write tests --- .../service/ping/PingEndpointService.java | 2 +- .../ping/impl/PingEndpointServiceImpl.java | 4 +- .../org/wise/vle/web/CRaterController.java | 6 +- .../impl/PingEndpointServiceImplTest.java | 62 +++++++++++++++++++ .../wise/vle/web/CRaterControllerTest.java | 57 +++++++++++++++++ 5 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java diff --git a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java index f2b7dc2ae..bd6a9d916 100644 --- a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java +++ b/src/main/java/org/wise/portal/service/ping/PingEndpointService.java @@ -2,5 +2,5 @@ public interface PingEndpointService { public boolean hasPingedItem(String itemId); - public void cachePingedItem(String itemId); + public void cachePingedItem(String itemId, int ttl); } diff --git a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java index 79df4bd2c..0416c4d2e 100644 --- a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java +++ b/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java @@ -18,8 +18,8 @@ public boolean hasPingedItem(String itemId) { return members.size() > 0; } - public void cachePingedItem(String itemId) { + public void cachePingedItem(String itemId, int ttl) { this.stringRedisTemplate.opsForSet().add(itemId, "pinged"); - this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(280)); + this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(ttl)); } } \ No newline at end of file diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 85741e72c..033850370 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -57,13 +57,13 @@ String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException } @PostMapping("/ping-endpoint") - public String receivePingRequest(@RequestBody CRaterPingRequest ping) throws JSONException { + public String pingItem(@RequestBody CRaterPingRequest ping) throws JSONException { String itemId = ping.getItemId(); boolean readyToPing = !this.pingEndpointService.hasPingedItem(itemId); if (ping.forBerkeleyEndpoint() && readyToPing) { - this.pingEndpointService.cachePingedItem(itemId); + this.pingEndpointService.cachePingedItem(itemId, 280); return this.cRaterService.getCRaterResponse(ping); } return ""; - } + } } diff --git a/src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java b/src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java new file mode 100644 index 000000000..322fbad6b --- /dev/null +++ b/src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java @@ -0,0 +1,62 @@ +package org.wise.portal.service.ping.impl; + +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.verify; + +import java.util.HashSet; +import java.util.Set; + +import org.easymock.EasyMockExtension; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.data.redis.core.StringRedisTemplate; + +@ExtendWith(EasyMockExtension.class) +public class PingEndpointServiceImplTest { + @TestSubject + private PingEndpointServiceImpl pingEndpointServiceImpl = new PingEndpointServiceImpl(); + + @Mock + private StringRedisTemplate stringRedisTemplate; + + private String testId = "test"; + + // @Test + // public void hasPingedItem_ItemPinged_ShouldReturnTrue() { + // Set members = new HashSet(); + // members.add("pinged"); + // expect(stringRedisTemplate.opsForSet().members(testId)).andReturn(members); + // replay(stringRedisTemplate); + // assertTrue(pingEndpointServiceImpl.hasPingedItem(testId)); + // verify(stringRedisTemplate); + // } + + // @Test + // public void hasPingedItem_ItemNotPinged_ShouldReturnFalse() { + // expect(stringRedisTemplate.opsForSet().members(testId)).andReturn(new HashSet()); + // assertFalse(pingEndpointServiceImpl.hasPingedItem(testId)); + // } + + + // @Test + // public void cachePingedItem_ShouldCacheAndExpireItemId() { + // assertTrue(stringRedisTemplateOpsSize(testId) == 0); + // pingEndpointServiceImpl.cachePingedItem(testId, 1); + // assertTrue(stringRedisTemplateOpsSize(testId) == 1); + // try { + // Thread.sleep(1001); + // } catch(InterruptedException e) { + // e.printStackTrace(); + // } + // assertTrue(stringRedisTemplateOpsSize(testId) == 0); + // } + + // private int stringRedisTemplateOpsSize(String id) { + // return stringRedisTemplate.opsForSet().members(id).size(); + // } +} diff --git a/src/test/java/org/wise/vle/web/CRaterControllerTest.java b/src/test/java/org/wise/vle/web/CRaterControllerTest.java index 837c018b7..365b8face 100644 --- a/src/test/java/org/wise/vle/web/CRaterControllerTest.java +++ b/src/test/java/org/wise/vle/web/CRaterControllerTest.java @@ -1,6 +1,8 @@ package org.wise.vle.web; +import static junit.framework.TestCase.assertEquals; import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import org.easymock.EasyMockExtension; @@ -9,6 +11,8 @@ import org.json.JSONException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.wise.portal.service.ping.PingEndpointService; +import org.wise.vle.domain.webservice.crater.CRaterPingRequest; import org.wise.vle.domain.webservice.crater.CRaterScoringRequest; import org.wise.vle.domain.webservice.crater.CRaterService; import org.wise.vle.domain.webservice.crater.CRaterVerificationRequest; @@ -22,8 +26,12 @@ public class CRaterControllerTest { @Mock private CRaterService cRaterService; + @Mock + private PingEndpointService pingEndpointService; + private String clientId = "wise-test"; private String itemId = "test-item-id"; + private String berkeleyItemId = "berkeley_test-item-id"; private Long trackingId = 123456789L; @Test @@ -80,4 +88,53 @@ private String createScoringResponseString(String itemId, Long trackingId, Strin responseBuffer.append("}"); return responseBuffer.toString(); } + + @Test + public void pingItem_ItemAlreadyPinged_ShouldReturnEmpty() { + CRaterPingRequest request = new CRaterPingRequest(); + request.setItemId(berkeleyItemId); + try { + expect(pingEndpointService.hasPingedItem(berkeleyItemId)) + .andReturn(true); + replay(cRaterService, pingEndpointService); + String response = controller.pingItem(request); + assertEquals(response, ""); + verify(cRaterService, pingEndpointService); + } catch (JSONException exception) { + + } + } + + @Test + public void pingItem_ItemNotPinged_ShouldReturnString() { + CRaterPingRequest request = new CRaterPingRequest(); + request.setItemId(berkeleyItemId); + try { + expect(cRaterService.getCRaterResponse(request)) + .andReturn(createPingResponseString(berkeleyItemId, trackingId, clientId)); + expect(pingEndpointService.hasPingedItem(berkeleyItemId)) + .andReturn(false); + pingEndpointService.cachePingedItem(berkeleyItemId, 280); + expectLastCall(); + replay(cRaterService, pingEndpointService); + String response = controller.pingItem(request); + assertNotNull(response); + assertNotEquals(response, ""); + verify(cRaterService, pingEndpointService); + } catch (JSONException exception) { + + } + + } + + private String createPingResponseString(String itemId, Long trackingId, String clientId) { + StringBuffer responseBuffer = new StringBuffer(); + responseBuffer.append("{"); + responseBuffer.append(" \"item_id\": \"" + itemId + "\","); + responseBuffer.append(" \"success\": true,"); + responseBuffer.append(" \"tracking_id\": " + trackingId + ","); + responseBuffer.append(" \"client_id\": \"" + clientId + "\""); + responseBuffer.append("}"); + return responseBuffer.toString(); + } } From 3fbfdfb55e9e7a6f7f3a1a4350b0addf836df3ad Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Mon, 12 May 2025 14:42:40 -0700 Subject: [PATCH 4/8] Move berkeley check to client to reduce # of requests --- src/main/java/org/wise/vle/web/CRaterController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 033850370..8242e7792 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -59,8 +59,7 @@ String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException @PostMapping("/ping-endpoint") public String pingItem(@RequestBody CRaterPingRequest ping) throws JSONException { String itemId = ping.getItemId(); - boolean readyToPing = !this.pingEndpointService.hasPingedItem(itemId); - if (ping.forBerkeleyEndpoint() && readyToPing) { + if (!this.pingEndpointService.hasPingedItem(itemId)) { this.pingEndpointService.cachePingedItem(itemId, 280); return this.cRaterService.getCRaterResponse(ping); } From 74fd85ee4e1f0d76057f62ae7d1904ee8777007e Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Thu, 15 May 2025 11:10:36 -0700 Subject: [PATCH 5/8] Change PingEndpointService to CRaterPingService --- .../{PingEndpointService.java => CRaterPingService.java} | 2 +- ...gEndpointServiceImpl.java => CRaterPingServiceImpl.java} | 4 ++-- src/main/java/org/wise/vle/web/CRaterController.java | 6 +++--- ...tServiceImplTest.java => CRaterPingServiceImplTest.java} | 4 ++-- src/test/java/org/wise/vle/web/CRaterControllerTest.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/org/wise/portal/service/ping/{PingEndpointService.java => CRaterPingService.java} (78%) rename src/main/java/org/wise/portal/service/ping/impl/{PingEndpointServiceImpl.java => CRaterPingServiceImpl.java} (84%) rename src/test/java/org/wise/portal/service/ping/impl/{PingEndpointServiceImplTest.java => CRaterPingServiceImplTest.java} (93%) diff --git a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java b/src/main/java/org/wise/portal/service/ping/CRaterPingService.java similarity index 78% rename from src/main/java/org/wise/portal/service/ping/PingEndpointService.java rename to src/main/java/org/wise/portal/service/ping/CRaterPingService.java index bd6a9d916..38e16deb3 100644 --- a/src/main/java/org/wise/portal/service/ping/PingEndpointService.java +++ b/src/main/java/org/wise/portal/service/ping/CRaterPingService.java @@ -1,6 +1,6 @@ package org.wise.portal.service.ping; -public interface PingEndpointService { +public interface CRaterPingService { public boolean hasPingedItem(String itemId); public void cachePingedItem(String itemId, int ttl); } diff --git a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java b/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java similarity index 84% rename from src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java rename to src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java index 0416c4d2e..559bde979 100644 --- a/src/main/java/org/wise/portal/service/ping/impl/PingEndpointServiceImpl.java +++ b/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java @@ -6,10 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; -import org.wise.portal.service.ping.PingEndpointService; +import org.wise.portal.service.ping.CRaterPingService; @Service -public class PingEndpointServiceImpl implements PingEndpointService{ +public class CRaterPingServiceImpl implements CRaterPingService{ @Autowired private StringRedisTemplate stringRedisTemplate; diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 8242e7792..941a4bd4f 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.wise.vle.domain.webservice.crater.CRaterVerificationRequest; -import org.wise.portal.service.ping.PingEndpointService; +import org.wise.portal.service.ping.CRaterPingService; import org.wise.vle.domain.webservice.crater.CRaterPingRequest; import org.wise.vle.domain.webservice.crater.CRaterScoringRequest; import org.wise.vle.domain.webservice.crater.CRaterService; @@ -44,7 +44,7 @@ public class CRaterController { private CRaterService cRaterService; @Autowired - private PingEndpointService pingEndpointService; + private CRaterPingService pingEndpointService; @GetMapping("/verify") String verifyItemId(CRaterVerificationRequest request) throws JSONException { @@ -56,7 +56,7 @@ String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException return cRaterService.getCRaterResponse(request); } - @PostMapping("/ping-endpoint") + @PostMapping("/ping") public String pingItem(@RequestBody CRaterPingRequest ping) throws JSONException { String itemId = ping.getItemId(); if (!this.pingEndpointService.hasPingedItem(itemId)) { diff --git a/src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java similarity index 93% rename from src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java rename to src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java index 322fbad6b..908ca5e52 100644 --- a/src/test/java/org/wise/portal/service/ping/impl/PingEndpointServiceImplTest.java +++ b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java @@ -17,9 +17,9 @@ import org.springframework.data.redis.core.StringRedisTemplate; @ExtendWith(EasyMockExtension.class) -public class PingEndpointServiceImplTest { +public class CRaterPingServiceImplTest { @TestSubject - private PingEndpointServiceImpl pingEndpointServiceImpl = new PingEndpointServiceImpl(); + private CRaterPingServiceImpl pingEndpointServiceImpl = new CRaterPingServiceImpl(); @Mock private StringRedisTemplate stringRedisTemplate; diff --git a/src/test/java/org/wise/vle/web/CRaterControllerTest.java b/src/test/java/org/wise/vle/web/CRaterControllerTest.java index 365b8face..7c65c50ac 100644 --- a/src/test/java/org/wise/vle/web/CRaterControllerTest.java +++ b/src/test/java/org/wise/vle/web/CRaterControllerTest.java @@ -11,7 +11,7 @@ import org.json.JSONException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.wise.portal.service.ping.PingEndpointService; +import org.wise.portal.service.ping.CRaterPingService; import org.wise.vle.domain.webservice.crater.CRaterPingRequest; import org.wise.vle.domain.webservice.crater.CRaterScoringRequest; import org.wise.vle.domain.webservice.crater.CRaterService; @@ -27,7 +27,7 @@ public class CRaterControllerTest { private CRaterService cRaterService; @Mock - private PingEndpointService pingEndpointService; + private CRaterPingService pingEndpointService; private String clientId = "wise-test"; private String itemId = "test-item-id"; From 70500f085e00c968bf9d34249ccecb74fdce0ac2 Mon Sep 17 00:00:00 2001 From: Aaron Detre Date: Thu, 15 May 2025 12:42:16 -0700 Subject: [PATCH 6/8] Fix CRaterPingService tests --- .../ping/impl/CRaterPingServiceImplTest.java | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java index 908ca5e52..6533e6745 100644 --- a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java +++ b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java @@ -2,18 +2,21 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.verify; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.time.Duration; import java.util.HashSet; import java.util.Set; import org.easymock.EasyMockExtension; import org.easymock.Mock; import org.easymock.TestSubject; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.StringRedisTemplate; @ExtendWith(EasyMockExtension.class) @@ -24,39 +27,43 @@ public class CRaterPingServiceImplTest { @Mock private StringRedisTemplate stringRedisTemplate; + @Mock + private SetOperations setOperations; + private String testId = "test"; - // @Test - // public void hasPingedItem_ItemPinged_ShouldReturnTrue() { - // Set members = new HashSet(); - // members.add("pinged"); - // expect(stringRedisTemplate.opsForSet().members(testId)).andReturn(members); - // replay(stringRedisTemplate); - // assertTrue(pingEndpointServiceImpl.hasPingedItem(testId)); - // verify(stringRedisTemplate); - // } + @Test + public void hasPingedItem_ItemPinged_ShouldReturnTrue() { + Set members = new HashSet(); + members.add(testId); + expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); + expect(setOperations.members(testId)).andReturn(members); + replay(stringRedisTemplate, setOperations); + assertTrue(pingEndpointServiceImpl.hasPingedItem(testId)); + verify(stringRedisTemplate); + verify(setOperations); + } - // @Test - // public void hasPingedItem_ItemNotPinged_ShouldReturnFalse() { - // expect(stringRedisTemplate.opsForSet().members(testId)).andReturn(new HashSet()); - // assertFalse(pingEndpointServiceImpl.hasPingedItem(testId)); - // } - - - // @Test - // public void cachePingedItem_ShouldCacheAndExpireItemId() { - // assertTrue(stringRedisTemplateOpsSize(testId) == 0); - // pingEndpointServiceImpl.cachePingedItem(testId, 1); - // assertTrue(stringRedisTemplateOpsSize(testId) == 1); - // try { - // Thread.sleep(1001); - // } catch(InterruptedException e) { - // e.printStackTrace(); - // } - // assertTrue(stringRedisTemplateOpsSize(testId) == 0); - // } - - // private int stringRedisTemplateOpsSize(String id) { - // return stringRedisTemplate.opsForSet().members(id).size(); - // } -} + @Test + public void hasPingedItem_ItemNotPinged_ShouldReturnFalse() { + Set members = new HashSet(); + expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); + expect(setOperations.members(testId)).andReturn(members); + replay(stringRedisTemplate, setOperations); + assertFalse(pingEndpointServiceImpl.hasPingedItem(testId)); + verify(stringRedisTemplate); + verify(setOperations); + + } + + + @Test + public void cachePingedItem_ShouldCacheAndExpireItemId() { + expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); + expect(stringRedisTemplate.expire(testId, Duration.ofSeconds(1))).andReturn(null); + expect(setOperations.add(testId, "pinged")).andReturn(null); + replay(stringRedisTemplate, setOperations); + pingEndpointServiceImpl.cachePingedItem(testId, 1); + verify(stringRedisTemplate, setOperations); + } +} \ No newline at end of file From b4e623dc85b47467e971cb03f12365544d99250f Mon Sep 17 00:00:00 2001 From: Hiroki Terashima Date: Wed, 28 May 2025 16:26:07 -0700 Subject: [PATCH 7/8] Change redis operations from using set to value. --- .../ping/impl/CRaterPingServiceImpl.java | 12 +++--- .../ping/impl/CRaterPingServiceImplTest.java | 40 ++++++++----------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java b/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java index 559bde979..03a780ee7 100644 --- a/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java +++ b/src/main/java/org/wise/portal/service/ping/impl/CRaterPingServiceImpl.java @@ -1,7 +1,6 @@ package org.wise.portal.service.ping.impl; import java.time.Duration; -import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -9,17 +8,16 @@ import org.wise.portal.service.ping.CRaterPingService; @Service -public class CRaterPingServiceImpl implements CRaterPingService{ +public class CRaterPingServiceImpl implements CRaterPingService { @Autowired private StringRedisTemplate stringRedisTemplate; public boolean hasPingedItem(String itemId) { - Set members = stringRedisTemplate.opsForSet().members(itemId); - return members.size() > 0; + return stringRedisTemplate.opsForValue().size(itemId) == 1; } public void cachePingedItem(String itemId, int ttl) { - this.stringRedisTemplate.opsForSet().add(itemId, "pinged"); - this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(ttl)); + this.stringRedisTemplate.opsForValue().setIfAbsent(itemId, "pinged"); + this.stringRedisTemplate.expire(itemId, Duration.ofSeconds(ttl)); } -} \ No newline at end of file +} diff --git a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java index 6533e6745..0fdcf09b8 100644 --- a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java +++ b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java @@ -5,19 +5,15 @@ import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.Duration; -import java.util.HashSet; -import java.util.Set; - import org.easymock.EasyMockExtension; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; @ExtendWith(EasyMockExtension.class) public class CRaterPingServiceImplTest { @@ -28,42 +24,38 @@ public class CRaterPingServiceImplTest { private StringRedisTemplate stringRedisTemplate; @Mock - private SetOperations setOperations; + private ValueOperations valueOperations; private String testId = "test"; @Test public void hasPingedItem_ItemPinged_ShouldReturnTrue() { - Set members = new HashSet(); - members.add(testId); - expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); - expect(setOperations.members(testId)).andReturn(members); - replay(stringRedisTemplate, setOperations); + expect(stringRedisTemplate.opsForValue()).andReturn(valueOperations); + expect(valueOperations.size(testId)).andReturn(1L); + replay(stringRedisTemplate, valueOperations); assertTrue(pingEndpointServiceImpl.hasPingedItem(testId)); verify(stringRedisTemplate); - verify(setOperations); + verify(valueOperations); } - + @Test public void hasPingedItem_ItemNotPinged_ShouldReturnFalse() { - Set members = new HashSet(); - expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); - expect(setOperations.members(testId)).andReturn(members); - replay(stringRedisTemplate, setOperations); + expect(stringRedisTemplate.opsForValue()).andReturn(valueOperations); + expect(valueOperations.size(testId)).andReturn(0L); + replay(stringRedisTemplate, valueOperations); assertFalse(pingEndpointServiceImpl.hasPingedItem(testId)); verify(stringRedisTemplate); - verify(setOperations); + verify(valueOperations); } - @Test public void cachePingedItem_ShouldCacheAndExpireItemId() { - expect(stringRedisTemplate.opsForSet()).andReturn(setOperations); + expect(stringRedisTemplate.opsForValue()).andReturn(valueOperations); expect(stringRedisTemplate.expire(testId, Duration.ofSeconds(1))).andReturn(null); - expect(setOperations.add(testId, "pinged")).andReturn(null); - replay(stringRedisTemplate, setOperations); + expect(valueOperations.setIfAbsent(testId, "pinged")).andReturn(null); + replay(stringRedisTemplate, valueOperations); pingEndpointServiceImpl.cachePingedItem(testId, 1); - verify(stringRedisTemplate, setOperations); + verify(stringRedisTemplate, valueOperations); } -} \ No newline at end of file +} From b04179f947607c349a46cbcad2b985c91b0d7aa6 Mon Sep 17 00:00:00 2001 From: Hiroki Terashima Date: Wed, 28 May 2025 16:29:49 -0700 Subject: [PATCH 8/8] Rename pingEndpointService to cRaterPingService --- .../org/wise/vle/web/CRaterController.java | 8 +++---- .../ping/impl/CRaterPingServiceImplTest.java | 8 +++---- .../wise/vle/web/CRaterControllerTest.java | 22 +++++++++---------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 941a4bd4f..075a095ac 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -42,9 +42,9 @@ public class CRaterController { @Autowired private CRaterService cRaterService; - + @Autowired - private CRaterPingService pingEndpointService; + private CRaterPingService cRaterPingService; @GetMapping("/verify") String verifyItemId(CRaterVerificationRequest request) throws JSONException { @@ -59,8 +59,8 @@ String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException @PostMapping("/ping") public String pingItem(@RequestBody CRaterPingRequest ping) throws JSONException { String itemId = ping.getItemId(); - if (!this.pingEndpointService.hasPingedItem(itemId)) { - this.pingEndpointService.cachePingedItem(itemId, 280); + if (!this.cRaterPingService.hasPingedItem(itemId)) { + this.cRaterPingService.cachePingedItem(itemId, 280); return this.cRaterService.getCRaterResponse(ping); } return ""; diff --git a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java index 0fdcf09b8..c4c545a98 100644 --- a/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java +++ b/src/test/java/org/wise/portal/service/ping/impl/CRaterPingServiceImplTest.java @@ -18,7 +18,7 @@ @ExtendWith(EasyMockExtension.class) public class CRaterPingServiceImplTest { @TestSubject - private CRaterPingServiceImpl pingEndpointServiceImpl = new CRaterPingServiceImpl(); + private CRaterPingServiceImpl cRaterPingServiceImpl = new CRaterPingServiceImpl(); @Mock private StringRedisTemplate stringRedisTemplate; @@ -33,7 +33,7 @@ public void hasPingedItem_ItemPinged_ShouldReturnTrue() { expect(stringRedisTemplate.opsForValue()).andReturn(valueOperations); expect(valueOperations.size(testId)).andReturn(1L); replay(stringRedisTemplate, valueOperations); - assertTrue(pingEndpointServiceImpl.hasPingedItem(testId)); + assertTrue(cRaterPingServiceImpl.hasPingedItem(testId)); verify(stringRedisTemplate); verify(valueOperations); } @@ -43,7 +43,7 @@ public void hasPingedItem_ItemNotPinged_ShouldReturnFalse() { expect(stringRedisTemplate.opsForValue()).andReturn(valueOperations); expect(valueOperations.size(testId)).andReturn(0L); replay(stringRedisTemplate, valueOperations); - assertFalse(pingEndpointServiceImpl.hasPingedItem(testId)); + assertFalse(cRaterPingServiceImpl.hasPingedItem(testId)); verify(stringRedisTemplate); verify(valueOperations); @@ -55,7 +55,7 @@ public void cachePingedItem_ShouldCacheAndExpireItemId() { expect(stringRedisTemplate.expire(testId, Duration.ofSeconds(1))).andReturn(null); expect(valueOperations.setIfAbsent(testId, "pinged")).andReturn(null); replay(stringRedisTemplate, valueOperations); - pingEndpointServiceImpl.cachePingedItem(testId, 1); + cRaterPingServiceImpl.cachePingedItem(testId, 1); verify(stringRedisTemplate, valueOperations); } } diff --git a/src/test/java/org/wise/vle/web/CRaterControllerTest.java b/src/test/java/org/wise/vle/web/CRaterControllerTest.java index 7c65c50ac..d739d7887 100644 --- a/src/test/java/org/wise/vle/web/CRaterControllerTest.java +++ b/src/test/java/org/wise/vle/web/CRaterControllerTest.java @@ -27,7 +27,7 @@ public class CRaterControllerTest { private CRaterService cRaterService; @Mock - private CRaterPingService pingEndpointService; + private CRaterPingService cRaterPingService; private String clientId = "wise-test"; private String itemId = "test-item-id"; @@ -94,12 +94,11 @@ public void pingItem_ItemAlreadyPinged_ShouldReturnEmpty() { CRaterPingRequest request = new CRaterPingRequest(); request.setItemId(berkeleyItemId); try { - expect(pingEndpointService.hasPingedItem(berkeleyItemId)) - .andReturn(true); - replay(cRaterService, pingEndpointService); + expect(cRaterPingService.hasPingedItem(berkeleyItemId)).andReturn(true); + replay(cRaterService, cRaterPingService); String response = controller.pingItem(request); assertEquals(response, ""); - verify(cRaterService, pingEndpointService); + verify(cRaterService, cRaterPingService); } catch (JSONException exception) { } @@ -111,20 +110,19 @@ public void pingItem_ItemNotPinged_ShouldReturnString() { request.setItemId(berkeleyItemId); try { expect(cRaterService.getCRaterResponse(request)) - .andReturn(createPingResponseString(berkeleyItemId, trackingId, clientId)); - expect(pingEndpointService.hasPingedItem(berkeleyItemId)) - .andReturn(false); - pingEndpointService.cachePingedItem(berkeleyItemId, 280); + .andReturn(createPingResponseString(berkeleyItemId, trackingId, clientId)); + expect(cRaterPingService.hasPingedItem(berkeleyItemId)).andReturn(false); + cRaterPingService.cachePingedItem(berkeleyItemId, 280); expectLastCall(); - replay(cRaterService, pingEndpointService); + replay(cRaterService, cRaterPingService); String response = controller.pingItem(request); assertNotNull(response); assertNotEquals(response, ""); - verify(cRaterService, pingEndpointService); + verify(cRaterService, cRaterPingService); } catch (JSONException exception) { } - + } private String createPingResponseString(String itemId, Long trackingId, String clientId) {