Skip to content

Commit d5cf683

Browse files
starryCodertomsun28lynx009
authored
[bugfix] Fix imported monitor instance being empty due to host/instan… (#4142)
Co-authored-by: Tomsun28 <tomsun28@outlook.com> Co-authored-by: lynx009 <2030509072@qq.com>
1 parent 6959441 commit d5cf683

2 files changed

Lines changed: 89 additions & 2 deletions

File tree

hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/AbstractImExportServiceImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ private MonitorDto convert(ExportMonitorDTO exportMonitor) {
127127
if (exportMonitor.monitor != null) {
128128
// Add one more null check
129129
BeanUtils.copyProperties(exportMonitor.monitor, monitor);
130+
if (exportMonitor.params != null) {
131+
String host = exportMonitor.params.stream()
132+
.filter(p -> "host".equals(p.field)).findFirst()
133+
.map(p -> p.value).orElse(null);
134+
String port = exportMonitor.params.stream()
135+
.filter(p -> "port".equals(p.field)).findFirst()
136+
.map(p -> p.value).orElse(null);
137+
if (host != null) {
138+
monitor.setInstance(port != null ? host + ":" + port : host);
139+
}
140+
}
130141
}
131142
monitorDto.setMonitor(monitor);
132143
if (exportMonitor.getMonitor() != null) {

hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/JsonImExportServiceTest.java

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,47 @@
2121
import static org.junit.jupiter.api.Assertions.assertNotNull;
2222
import static org.junit.jupiter.api.Assertions.assertThrows;
2323
import static org.junit.jupiter.api.Assertions.assertTrue;
24+
import static org.mockito.Mockito.doNothing;
2425
import java.io.ByteArrayInputStream;
2526
import java.io.ByteArrayOutputStream;
27+
import java.lang.reflect.Field;
2628
import java.nio.charset.StandardCharsets;
2729
import java.util.List;
30+
import org.apache.hertzbeat.common.entity.manager.Monitor;
31+
import org.apache.hertzbeat.common.entity.manager.Param;
32+
import org.apache.hertzbeat.manager.config.ManagerSseManager;
2833
import org.apache.hertzbeat.manager.service.impl.AbstractImExportServiceImpl;
2934
import org.apache.hertzbeat.manager.service.impl.JsonImExportServiceImpl;
3035
import org.junit.jupiter.api.BeforeEach;
3136
import org.junit.jupiter.api.Test;
37+
import org.junit.jupiter.api.extension.ExtendWith;
38+
import org.mockito.ArgumentCaptor;
39+
import org.mockito.Mock;
40+
import org.mockito.junit.jupiter.MockitoExtension;
3241

3342
/**
3443
* Test case for {@link JsonImExportServiceImpl}
3544
*/
36-
45+
@ExtendWith(MockitoExtension.class)
3746
class JsonImExportServiceTest {
3847

3948
private JsonImExportServiceImpl jsonImExportService;
4049

50+
@Mock
51+
private MonitorService monitorService;
52+
53+
@Mock
54+
private ManagerSseManager managerSseManager;
55+
4156
@BeforeEach
42-
public void setUp() {
57+
public void setUp() throws Exception {
4358
jsonImExportService = new JsonImExportServiceImpl();
59+
Field monitorServiceField = jsonImExportService.getClass().getSuperclass().getDeclaredField("monitorService");
60+
monitorServiceField.setAccessible(true);
61+
monitorServiceField.set(jsonImExportService, monitorService);
62+
Field sseField = jsonImExportService.getClass().getSuperclass().getDeclaredField("managerSseManager");
63+
sseField.setAccessible(true);
64+
sseField.set(jsonImExportService, managerSseManager);
4465
}
4566

4667
@Test
@@ -89,4 +110,59 @@ void testType() {
89110
assertEquals("JSON", jsonImExportService.type());
90111
}
91112

113+
@Test
114+
void testImportConfig_shouldSetInstanceFromHostAndPortParams() {
115+
String json = "[{\"monitor\":{\"name\":\"test\",\"app\":\"windows\",\"intervals\":6000,\"status\":1},"
116+
+ "\"params\":[{\"field\":\"host\",\"type\":1,\"value\":\"localhost\"},"
117+
+ "{\"field\":\"port\",\"type\":0,\"value\":\"161\"}]}]";
118+
119+
ArgumentCaptor<Monitor> monitorCaptor = ArgumentCaptor.forClass(Monitor.class);
120+
ArgumentCaptor<List<Param>> paramsCaptor = ArgumentCaptor.forClass(List.class);
121+
doNothing().when(monitorService).addMonitor(monitorCaptor.capture(), paramsCaptor.capture(),
122+
org.mockito.Mockito.any(), org.mockito.Mockito.any());
123+
124+
ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
125+
jsonImExportService.importConfig("test.json", bis);
126+
127+
Monitor captured = monitorCaptor.getValue();
128+
assertEquals("localhost:161", captured.getInstance());
129+
assertEquals("test", captured.getName());
130+
assertEquals("windows", captured.getApp());
131+
132+
List<Param> capturedParams = paramsCaptor.getValue();
133+
assertNotNull(capturedParams);
134+
assertEquals(2, capturedParams.size());
135+
}
136+
137+
@Test
138+
void testImportConfig_shouldSetInstanceWithHostOnly() {
139+
String json = "[{\"monitor\":{\"name\":\"test\",\"app\":\"linux\",\"intervals\":6000,\"status\":1},"
140+
+ "\"params\":[{\"field\":\"host\",\"type\":1,\"value\":\"192.168.1.1\"}]}]";
141+
142+
ArgumentCaptor<Monitor> monitorCaptor = ArgumentCaptor.forClass(Monitor.class);
143+
doNothing().when(monitorService).addMonitor(monitorCaptor.capture(),
144+
org.mockito.Mockito.any(), org.mockito.Mockito.any(), org.mockito.Mockito.any());
145+
146+
ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
147+
jsonImExportService.importConfig("test.json", bis);
148+
149+
Monitor captured = monitorCaptor.getValue();
150+
assertEquals("192.168.1.1", captured.getInstance());
151+
}
152+
153+
@Test
154+
void testImportConfig_shouldHandleNoHostParam() {
155+
String json = "[{\"monitor\":{\"name\":\"test\",\"app\":\"website\",\"intervals\":6000,\"status\":1},"
156+
+ "\"params\":[{\"field\":\"url\",\"type\":1,\"value\":\"http://example.com\"}]}]";
157+
158+
ArgumentCaptor<Monitor> monitorCaptor = ArgumentCaptor.forClass(Monitor.class);
159+
doNothing().when(monitorService).addMonitor(monitorCaptor.capture(),
160+
org.mockito.Mockito.any(), org.mockito.Mockito.any(), org.mockito.Mockito.any());
161+
162+
ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
163+
jsonImExportService.importConfig("test.json", bis);
164+
165+
Monitor captured = monitorCaptor.getValue();
166+
assertEquals(null, captured.getInstance());
167+
}
92168
}

0 commit comments

Comments
 (0)