Skip to content

Commit 3eb0e24

Browse files
authored
feat: agent test and bugfix (#52)
* feat: template control front page (#49) dev: undo unused template test dev: test code for sse emitter dev: testing added and gradle setting fix: failed UserContext test dev: remove test randomized TestResult response test: dto serializer test chore: clarify specific import dev: add enum AgentStatus in TemplateResult model dev: add enum AgentStatus in TemplateResult model chore: edit table css dev: add template with json body indentation dev: front-page for template runner dev: random TestResult stubbing dev: template Information model add dev: add UNKNOWN status dev: temporary require false set * dev: setup gradle test logger * dev: change database name * dev: remove profile and unused import * fix: remove initClass & TestContainer parallel setup #50 * chore: remove unused test class * chore: change package path * dev: bearer prefix remove method set to public * dev: remove init class * fix: setup TestContainer with parallel #50 * dev: dynamically setup agent url * test: test code for agent dynamic url setup * dev: context reset with DirtiesContext * fix: fixed hikariCP size with 1 #50 * dev: test for sse manager Service * dev: exclude sse small coverage
1 parent b521bc0 commit 3eb0e24

File tree

19 files changed

+393
-105
lines changed

19 files changed

+393
-105
lines changed

bm-agent/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ version = '0.0.1-SNAPSHOT'
1212
def excludeJacocoTestCoverageReport = [
1313
// bmagent
1414
'org/benchmarker/bmagent/BmAgentApplication**',
15+
'org/benchmarker/bmagent/sse/**',
1516
// 'org/benchmarker/bmagent/**',
1617
]
1718

bm-agent/src/main/java/org/benchmarker/bmagent/sse/SseManageService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.benchmarker.bmagent.service.AbstractSseManageService;
1010
import org.benchmarker.bmagent.service.IScheduledTaskService;
1111
import org.benchmarker.bmcommon.dto.TemplateInfo;
12-
import org.benchmarker.bmcommon.dto.TestResult;
12+
import org.benchmarker.bmcommon.util.RandomUtils;
1313
import org.springframework.stereotype.Component;
1414
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
1515

@@ -47,7 +47,7 @@ public SseEmitter start(Long id, TemplateInfo templateInfo) {
4747

4848
// Save the SseEmitter to the map
4949
sseEmitterHashMap.put(id, emitter);
50-
resultManagerService.save(id, new TestResult());
50+
// resultManagerService.save(id, new TestResult());
5151

5252
/**
5353
* TODO:DEV Target Server 에 HTTP 요청 시작 메소드 작성

bm-agent/src/test/java/org/benchmarker/bmagent/sse/SseManageServiceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,21 @@ void startAndShutdown() throws InterruptedException {
6666
sseManageService.stop(id);
6767
}
6868

69+
@Test
70+
@DisplayName("stop 을 호출하기 전에 이미 종료된 emitter 를 stop 할 경우, 아무 동작도 하지 않는다")
71+
void stop_ShouldDoNothingIfEmitterAlreadyStopped() throws InterruptedException {
72+
// given
73+
Long id = 1L;
74+
TestResult resultStub = RandomUtils.generateRandomTestResult();
75+
resultManagerService.save(id, resultStub);
76+
sseManageService.start(id, new TemplateInfo());
77+
sseManageService.stop(id);
78+
79+
// when
80+
sseManageService.stop(id);
81+
82+
// then
83+
assertThat(scheduledTaskService.getStatus().get(id)).isNull();
84+
}
85+
6986
}

bm-controller/build.gradle

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ plugins {
22
id "org.asciidoctor.jvm.convert" version "3.3.2"
33
id 'jacoco-report-aggregation'
44
id 'java'
5+
id 'com.adarshr.test-logger' version '4.0.0'
56
// id 'jacoco'
67
id 'org.springframework.boot' version '3.2.3'
78
id 'io.spring.dependency-management' version '1.1.4'
@@ -10,6 +11,15 @@ plugins {
1011
group = 'org.benchmarker'
1112
version = rootProject.getVersion()
1213

14+
ext {
15+
resilience4jVersion = '2.2.0' // 사용할 버전을 여기에 기입하세요.
16+
}
17+
18+
testlogger {
19+
theme 'mocha' // project level
20+
slowThreshold 5000
21+
}
22+
1323
// define exclude classes for Jacoco test coverage report
1424
def excludeJacocoTestCoverageReport = [
1525
'org/benchmarker/bmcontroller/preftest/controller/PerftestController**',
@@ -65,8 +75,8 @@ dependencies {
6575
runtimeOnly "io.jsonwebtoken:jjwt-jackson:0.11.1"
6676
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
6777
implementation project(":bm-common")
68-
implementation project(":bm-agent")
6978
jacocoAggregation project(":bm-agent")
79+
// implementation "io.github.resilience4j:resilience4j-all:${resilience4jVersion}"
7080
implementation 'com.squareup.okhttp3:mockwebserver:4.9.1'
7181

7282

@@ -75,9 +85,9 @@ dependencies {
7585
asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor'
7686
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
7787

78-
testImplementation "org.testcontainers:testcontainers:1.19.3"
88+
testImplementation 'org.testcontainers:testcontainers:1.19.3'
89+
testImplementation 'org.testcontainers:postgresql:1.19.3'
7990
testImplementation "org.testcontainers:junit-jupiter:1.19.3"
80-
testImplementation "org.testcontainers:postgresql:1.19.3"
8191

8292
implementation 'org.postgresql:postgresql'
8393
compileOnly 'org.projectlombok:lombok'
@@ -95,6 +105,26 @@ test {
95105
outputs.dir snippetsDir
96106
useJUnitPlatform()
97107

108+
testlogger {
109+
theme 'standard'
110+
showExceptions true
111+
showStackTraces true
112+
showFullStackTraces false
113+
showCauses true
114+
slowThreshold 1000 // 1 초 이상 걸리는 테스트는 느린 테스트로 표시
115+
showSummary true
116+
showSimpleNames false
117+
showPassed true
118+
showSkipped true
119+
showFailed true
120+
showOnlySlow false
121+
showStandardStreams false
122+
showPassedStandardStreams true
123+
showSkippedStandardStreams true
124+
showFailedStandardStreams true
125+
logLevel 'lifecycle'
126+
}
127+
98128
jacoco {
99129
excludes = ["org/benchmarker/bmcontroller/home/HomeController.class",
100130
"org/benchmarker/bmcontroller/user/controller/UserController.class",
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.benchmarker.bmcontroller.agent;
2+
3+
import jakarta.servlet.http.HttpServletRequest;
4+
import lombok.RequiredArgsConstructor;
5+
import org.benchmarker.bmcontroller.common.error.ErrorCode;
6+
import org.benchmarker.bmcontroller.common.error.GlobalException;
7+
import org.benchmarker.bmcontroller.security.JwtTokenProvider;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
public class AgentListener {
15+
16+
private final JwtTokenProvider jwtTokenProvider;
17+
private final AgentServerManager agentServerManager;
18+
19+
/**
20+
* Agent will be added when they send requests with their information
21+
*
22+
* @return String
23+
*/
24+
@GetMapping("/api/endpoint")
25+
public ResponseEntity agent(HttpServletRequest request) {
26+
String authorization = request.getHeader("Authorization");
27+
if (authorization == null) {
28+
throw new GlobalException(ErrorCode.UNAUTHORIZED);
29+
}
30+
31+
String jwtToken = jwtTokenProvider.getJwtFromRequest(request);
32+
boolean isValid = jwtTokenProvider.validateToken(jwtToken);
33+
34+
if (!isValid) {
35+
throw new GlobalException(ErrorCode.UNAUTHORIZED);
36+
}
37+
38+
// Add agent server url and port to the list
39+
String url = agentServerManager.add(request.getRemoteAddr()+":"+request.getRemotePort());
40+
return ResponseEntity.ok(url + " is added successfully");
41+
}
42+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.benchmarker.bmcontroller.agent;
2+
3+
import java.util.concurrent.ConcurrentHashMap;
4+
import org.benchmarker.bmagent.AgentStatus;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class AgentServerManager {
9+
private final ConcurrentHashMap<String, AgentStatus> agentsUrl;
10+
11+
public AgentServerManager() {
12+
agentsUrl = new ConcurrentHashMap<>();
13+
}
14+
public String add(String url) {
15+
agentsUrl.put(url, AgentStatus.READY);
16+
return url;
17+
}
18+
19+
public void remove(String url) {
20+
agentsUrl.remove(url);
21+
}
22+
23+
public void updateStatus(String url, AgentStatus status) {
24+
agentsUrl.put(url, status);
25+
}
26+
27+
public AgentStatus getStatus(String url) {
28+
return agentsUrl.get(url);
29+
}
30+
31+
public ConcurrentHashMap<String, AgentStatus> getAllAgents() {
32+
return agentsUrl;
33+
}
34+
35+
public boolean isAgentExist(String url) {
36+
return agentsUrl.containsKey(url);
37+
}
38+
39+
}

bm-controller/src/main/java/org/benchmarker/bmcontroller/security/JwtTokenProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public String validateTokenAndGetUserId(HttpServletRequest request, String cooki
202202
return null;
203203
}
204204

205-
private String getJwtFromRequest(HttpServletRequest request) {
205+
public String getJwtFromRequest(HttpServletRequest request) {
206206
String bearerToken = request.getHeader("Authorization");
207207
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
208208
return bearerToken.substring(7);

bm-controller/src/test/java/org/util/initialize/MockServer.java renamed to bm-controller/src/test/java/org/benchmarker/bmcontroller/MockServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.util.initialize;
1+
package org.benchmarker.bmcontroller;
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.benchmarker.bmcontroller.agent;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
5+
6+
import org.benchmarker.bmcontroller.security.JwtTokenProvider;
7+
import org.benchmarker.bmcontroller.user.model.enums.Role;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.DisplayName;
10+
import org.junit.jupiter.api.Test;
11+
import org.mockito.MockitoAnnotations;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.test.context.SpringBootTest;
14+
import org.springframework.boot.test.mock.mockito.MockBean;
15+
import org.springframework.mock.web.MockHttpServletResponse;
16+
import org.springframework.test.web.servlet.MockMvc;
17+
import org.util.annotations.RestDocsTest;
18+
import org.util.random.RandomUtil;
19+
20+
@SpringBootTest
21+
@RestDocsTest
22+
class AgentListenerTest {
23+
24+
@MockBean
25+
private JwtTokenProvider jwtTokenProvider;
26+
27+
@BeforeEach
28+
public void setUp() {
29+
MockitoAnnotations.openMocks(this);
30+
31+
jwtTokenProvider = new JwtTokenProvider();
32+
jwtTokenProvider.setSecret(RandomUtil.generateRandomString(128));
33+
jwtTokenProvider.setExpirationTime("1000000");
34+
jwtTokenProvider.setRefreshExpirationTime("1000000");
35+
36+
}
37+
38+
@Autowired
39+
private AgentListener agentListener;
40+
@Autowired
41+
private AgentServerManager agentServerManager;
42+
43+
@Autowired
44+
private MockMvc mockMvc;
45+
46+
@Test
47+
@DisplayName("Agent listener 로컬 테스트")
48+
void test() throws Exception {
49+
String test = jwtTokenProvider.createAccessToken("test", Role.ROLE_USER);
50+
51+
mockMvc.perform(get("/api/endpoint")
52+
.header("Authorization", "Bearer " + test))
53+
.andDo(response ->{
54+
System.out.println(response.getResponse().getContentAsString());
55+
});
56+
}
57+
58+
@Test
59+
@DisplayName("Agent listener 잘못된 토큰 401 반환 테스트")
60+
void test2() throws Exception {
61+
mockMvc.perform(get("/api/endpoint")
62+
.header("Authorization", "Bearer " + "wrong token"))
63+
.andDo(response ->{
64+
MockHttpServletResponse resp = response.getResponse();
65+
assertThat(resp.getStatus()).isEqualTo(401);
66+
});
67+
}
68+
69+
@Test
70+
@DisplayName("Agent listener header 없을 때 401 반환 테스트")
71+
void test3() throws Exception {
72+
mockMvc.perform(get("/api/endpoint"))
73+
.andDo(response ->{
74+
MockHttpServletResponse resp = response.getResponse();
75+
assertThat(resp.getStatus()).isEqualTo(401);
76+
});
77+
}
78+
79+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.benchmarker.bmcontroller.agent;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.concurrent.ConcurrentHashMap;
6+
import org.benchmarker.bmagent.AgentStatus;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.boot.test.context.SpringBootTest;
11+
12+
@SpringBootTest
13+
class AgentServerManagerTest {
14+
15+
@Autowired
16+
private AgentServerManager agentServerManager;
17+
private String url = "http://localhost:8080";
18+
19+
@Test
20+
@DisplayName("AgentServerManager 테스트")
21+
void test() {
22+
assertThat(agentServerManager.getAllAgents()).isEmpty();
23+
24+
// Add agent
25+
agentServerManager.add(url);
26+
assertThat(agentServerManager.isAgentExist(url)).isTrue();
27+
assertThat(agentServerManager.getStatus(url)).isEqualTo(AgentStatus.READY);
28+
ConcurrentHashMap<String, AgentStatus> allAgents = agentServerManager.getAllAgents();
29+
assertThat(allAgents.size()).isEqualTo(1);
30+
assertThat(allAgents.containsKey(url)).isTrue();
31+
assertThat(allAgents.get(url)).isEqualTo(AgentStatus.READY);
32+
33+
// Update agent status
34+
agentServerManager.updateStatus(url, AgentStatus.TESTING);
35+
assertThat(agentServerManager.getStatus(url)).isEqualTo(AgentStatus.TESTING);
36+
37+
// Remove agent
38+
agentServerManager.remove(url);
39+
assertThat(agentServerManager.isAgentExist(url)).isFalse();
40+
assertThat(agentServerManager.getStatus(url)).isNull();
41+
42+
// Check getAllAgents
43+
allAgents = agentServerManager.getAllAgents();
44+
assertThat(allAgents.size()).isEqualTo(0);
45+
assertThat(allAgents.containsKey(url)).isFalse();
46+
assertThat(allAgents.get(url)).isNull();
47+
}
48+
49+
}

0 commit comments

Comments
 (0)