[Improve] add CollectDispatcher & NettyDataQueue unit test (#2336)

Signed-off-by: yuluo-yx <yuluo08290126@gmail.com>
Signed-off-by: YuLuo <yuluo08290126@gmail.com>
Co-authored-by: tomsun28 <tomsun28@outlook.com>
This commit is contained in:
YuLuo
2024-07-24 00:04:38 +08:00
committed by GitHub
co-authored by tomsun28
parent 8a88607be9
commit 357068cc8f
3 changed files with 177 additions and 4 deletions
@@ -368,10 +368,13 @@ public class CommonDispatcher implements MetricsTaskDispatch, CollectDataDispatc
}
return mapList;
}
/**
* Metrics times.
*/
@Data
@AllArgsConstructor
private static class MetricsTime {
protected static class MetricsTime {
private long startTime;
private Metrics metrics;
private Timeout timeout;
@@ -17,23 +17,132 @@
package org.apache.hertzbeat.collector.dispatch;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.hertzbeat.common.entity.job.Job;
import org.apache.hertzbeat.collector.dispatch.entrance.internal.CollectJobService;
import org.apache.hertzbeat.collector.dispatch.timer.Timeout;
import org.apache.hertzbeat.collector.dispatch.timer.TimerDispatch;
import org.apache.hertzbeat.collector.dispatch.timer.WheelTimerTask;
import org.apache.hertzbeat.common.entity.job.Metrics;
import org.apache.hertzbeat.common.entity.message.CollectRep;
import org.apache.hertzbeat.common.queue.CommonDataQueue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test case for {@link CommonDispatcher}
*/
class CommonDispatcherTest {
@Mock
private MetricsCollectorQueue jobRequestQueue;
@Mock
private TimerDispatch timerDispatch;
@Mock
private CommonDataQueue commonDataQueue;
@Mock
private WorkerPool workerPool;
@InjectMocks
private CommonDispatcher commonDispatcher;
@Mock
private CollectJobService collectJobService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
ExecutorService executorService = Executors.newFixedThreadPool(2);
doAnswer(invocation -> {
Runnable task = invocation.getArgument(0);
executorService.submit(task);
return null;
}).when(workerPool).executeJob(any(Runnable.class));
}
@Test
void dispatchMetricsTask() {
void testDispatchMetricsTask() {
Timeout timeout = mock(Timeout.class);
WheelTimerTask timerTask = mock(WheelTimerTask.class);
Job job = mock(Job.class);
Set<Metrics> metricsSet = mock(Set.class);
when(timeout.task()).thenReturn(timerTask);
when(timerTask.getJob()).thenReturn(job);
when(job.getNextCollectMetrics(null, true)).thenReturn(metricsSet);
commonDispatcher.dispatchMetricsTask(timeout);
verify(job, times(1)).getNextCollectMetrics(null, true);
}
@Test
void dispatchCollectData() {
public void testDispatchCollectDataTimeoutMetricsCollectRepMetricsData() {
Timeout timeout = mock(Timeout.class);
Metrics metrics = mock(Metrics.class);
WheelTimerTask timerTask = mock(WheelTimerTask.class);
Job job = mock(Job.class);
CollectRep.MetricsData metricsData = CollectRep.MetricsData.newBuilder().setMetrics("metrics").build();
when(timeout.task()).thenReturn(timerTask);
when(timerTask.getJob()).thenReturn(job);
when(job.getNextCollectMetrics(metrics, false)).thenReturn(null);
when(timeout.task()).thenReturn(timerTask);
when(timerTask.getJob()).thenReturn(job);
when(job.getNextCollectMetrics(metrics, false)).thenReturn(null);
when(metrics.isHasSubTask()).thenReturn(false);
commonDispatcher.dispatchCollectData(timeout, metrics, metricsData);
verify(commonDataQueue, times(0)).sendMetricsData(metricsData);
}
@Test
void testDispatchCollectDataTimeoutMetricsListOfCollectRepMetricsData() {
Timeout timeout = mock(Timeout.class);
Metrics metrics = mock(Metrics.class);
CollectRep.MetricsData metricsData1 = CollectRep.MetricsData.newBuilder().build();
CollectRep.MetricsData metricsData2 = CollectRep.MetricsData.newBuilder().build();
List<CollectRep.MetricsData> metricsDataList = List.of(metricsData1, metricsData2);
WheelTimerTask timerTask = mock(WheelTimerTask.class);
Job job = mock(Job.class);
when(timeout.task()).thenReturn(timerTask);
when(timerTask.getJob()).thenReturn(job);
when(job.isCyclic()).thenReturn(true);
commonDispatcher.dispatchCollectData(timeout, metrics, metricsDataList);
verify(commonDataQueue, times(2)).sendMetricsData(any(CollectRep.MetricsData.class));
}
@Test
void testStart() {
commonDispatcher.start();
verify(workerPool, times(2)).executeJob(any(Runnable.class));
}
}
@@ -0,0 +1,61 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hertzbeat.collector.dispatch.export;
import org.apache.hertzbeat.collector.dispatch.entrance.internal.CollectJobService;
import org.apache.hertzbeat.common.entity.message.CollectRep;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
/**
* test for {@link NettyDataQueue}
*/
class NettyDataQueueTest {
@Mock
private CollectJobService collectJobService;
@InjectMocks
private NettyDataQueue nettyDataQueue;
@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void testSendMetricsData() {
CollectRep.MetricsData metricsData = CollectRep.MetricsData
.newBuilder()
.setMetrics("test")
.build();
nettyDataQueue.sendMetricsData(metricsData);
verify(collectJobService, times(1)).sendAsyncCollectData(metricsData);
}
}