/*
* Copyright 2017 NAVER Corp.
*
* Licensed 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 com.navercorp.pinpoint.web.vo.timeline.inspector;
import com.navercorp.pinpoint.common.server.bo.AgentEventBo;
import com.navercorp.pinpoint.common.server.util.AgentEventType;
import com.navercorp.pinpoint.common.server.util.AgentLifeCycleState;
import com.navercorp.pinpoint.web.vo.AgentEvent;
import com.navercorp.pinpoint.web.vo.AgentStatus;
import com.navercorp.pinpoint.web.vo.Range;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author HyunGil Jeong
*/
public class AgentStatusTimelineTest {
@Test
public void nullAgentStatus() {
// Given
Range timelineRange = new Range(0, 100);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(0, 100, AgentState.UNKNOWN));
// When
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, null).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void nullAgentStatus_nullAgentEvents() {
// Given
Range timelineRange = new Range(0, 100);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(0, 100, AgentState.UNKNOWN));
// When
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, null).from(null).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void agentStatus() {
// Given
Range timelineRange = new Range(100, 200);
AgentLifeCycleState expectedState = AgentLifeCycleState.RUNNING;
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.fromAgentLifeCycleState(expectedState)));
// When
AgentStatus initialStatus = createAgentStatus(50, expectedState);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void agentStatus_nullAgentEvents() {
// Given
Range timelineRange = new Range(100, 200);
AgentLifeCycleState expectedState = AgentLifeCycleState.RUNNING;
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.fromAgentLifeCycleState(expectedState)));
// When
AgentStatus initialStatus = createAgentStatus(50, expectedState);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus).from(null).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void singleLifeCycle_startedBeforeTimelineStartTimestamp() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.RUNNING));
// When
long agentA = 0;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 140, AgentEventType.AGENT_PING),
createAgentEvent(agentA, 190, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void singleLifeCycle_startedAfterTimelineStartTimestamp_initialStateRunning() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 150, AgentState.RUNNING),
createSegment(150, 200, AgentState.RUNNING));
// When
long agentA = 150;
AgentStatus initialStatus = createAgentStatus(50, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 150, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
@Test
public void singleLifeCycle_startedAfterTimelineStartTimestamp_initialStateShutdown() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 150, AgentState.SHUTDOWN),
createSegment(150, 200, AgentState.RUNNING));
// When
long agentA = 150;
AgentStatus initialStatus = createAgentStatus(50, AgentLifeCycleState.SHUTDOWN);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 150, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void singleLifeCycle_endedBeforeTimelineEndTimestamp() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 180, AgentState.RUNNING),
createSegment(180, 200, AgentState.SHUTDOWN));
// When
long agentA = 0;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 120, AgentEventType.AGENT_PING),
createAgentEvent(agentA, 150, AgentEventType.AGENT_PING),
createAgentEvent(agentA, 180, AgentEventType.AGENT_SHUTDOWN)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void singleLifeCycle_disconnected() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.RUNNING));
// When
long agentA = 0;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 150, AgentEventType.AGENT_CLOSED_BY_SERVER),
createAgentEvent(agentA, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_disconnected() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 150, AgentState.RUNNING),
createSegment(150, 160, AgentState.UNKNOWN),
createSegment(160, 200, AgentState.RUNNING));
// When
long agentA = 0;
long agentB = 160;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 150, AgentEventType.AGENT_CLOSED_BY_SERVER),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_noOverlap() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 140, AgentState.RUNNING),
createSegment(140, 160, AgentState.SHUTDOWN),
createSegment(160, 200, AgentState.RUNNING));
// When
long agentA = 0;
long agentB = 160;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 140, AgentEventType.AGENT_UNEXPECTED_SHUTDOWN),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_noOverlap2() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 159, AgentState.RUNNING),
createSegment(159, 160, AgentState.SHUTDOWN),
createSegment(160, 200, AgentState.RUNNING));
// When
long agentA = 0;
long agentB = 160;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 159, AgentEventType.AGENT_UNEXPECTED_SHUTDOWN),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_noOverlap3() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 120, AgentState.SHUTDOWN),
createSegment(120, 140, AgentState.RUNNING),
createSegment(140, 160, AgentState.SHUTDOWN),
createSegment(160, 180, AgentState.RUNNING),
createSegment(180, 200, AgentState.SHUTDOWN));
// When
long agentA = 120;
long agentB = 160;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.SHUTDOWN);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 120, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 140, AgentEventType.AGENT_UNEXPECTED_SHUTDOWN),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 180, AgentEventType.AGENT_SHUTDOWN)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertFalse(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_overlap() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 180, AgentState.RUNNING),
createSegment(180, 200, AgentState.SHUTDOWN));
// When
long agentA = 0;
long agentB = 120;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentB, 120, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 140, AgentEventType.AGENT_PING),
createAgentEvent(agentB, 160, AgentEventType.AGENT_UNEXPECTED_SHUTDOWN),
createAgentEvent(agentA, 180, AgentEventType.AGENT_SHUTDOWN)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_overlap2() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.RUNNING));
// When
long agentA = 0;
long agentB = 160;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 160, AgentEventType.AGENT_UNEXPECTED_SHUTDOWN),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 180, AgentEventType.AGENT_PING)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_overlap3() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.RUNNING));
// When
long agentA = 80;
long agentB = 90;
long agentC = 110;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 120, AgentEventType.AGENT_PING),
createAgentEvent(agentB, 130, AgentEventType.AGENT_PING),
createAgentEvent(agentC, 140, AgentEventType.AGENT_PING),
createAgentEvent(agentA, 150, AgentEventType.AGENT_PING),
createAgentEvent(agentB, 170, AgentEventType.AGENT_SHUTDOWN),
createAgentEvent(agentA, 180, AgentEventType.AGENT_PING),
createAgentEvent(agentC, 190, AgentEventType.AGENT_SHUTDOWN)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_overlap4() {
// Given
Range timelineRange = new Range(100, 200);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Collections.singletonList(
createSegment(100, 200, AgentState.RUNNING));
// When
long agentA = 90;
long agentB = 130;
long agentC = 160;
long agentD = 180;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 120, AgentEventType.AGENT_PING),
createAgentEvent(agentB, 130, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentA, 150, AgentEventType.AGENT_SHUTDOWN),
createAgentEvent(agentC, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 170, AgentEventType.AGENT_SHUTDOWN),
createAgentEvent(agentD, 180, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentC, 190, AgentEventType.AGENT_SHUTDOWN)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
@Test
public void multipleLifeCycles_mixed() {
// Given
Range timelineRange = new Range(100, 300);
List<AgentStatusTimelineSegment> expectedTimelineSegments = Arrays.asList(
createSegment(100, 150, AgentState.RUNNING),
createSegment(150, 160, AgentState.UNKNOWN),
createSegment(160, 250, AgentState.RUNNING),
createSegment(250, 260, AgentState.SHUTDOWN),
createSegment(260, 290, AgentState.RUNNING),
createSegment(290, 300, AgentState.UNKNOWN));
// When
long agentA = 90;
long agentB = 160;
long agentC = 220;
long agentD = 260;
AgentStatus initialStatus = createAgentStatus(90, AgentLifeCycleState.RUNNING);
AgentStatusTimeline timeline = new AgentStatusTimelineBuilder(timelineRange, initialStatus)
.from(Arrays.asList(
createAgentEvent(agentA, 120, AgentEventType.AGENT_PING),
createAgentEvent(agentA, 150, AgentEventType.AGENT_UNEXPECTED_CLOSE_BY_SERVER),
createAgentEvent(agentB, 160, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 200, AgentEventType.AGENT_PING),
createAgentEvent(agentC, 220, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentB, 220, AgentEventType.AGENT_CLOSED_BY_SERVER),
createAgentEvent(agentC, 250, AgentEventType.AGENT_SHUTDOWN),
createAgentEvent(agentD, 260, AgentEventType.AGENT_CONNECTED),
createAgentEvent(agentD, 290, AgentEventType.AGENT_CLOSED_BY_SERVER)
)).build();
// Then
Assert.assertEquals(expectedTimelineSegments, timeline.getTimelineSegments());
Assert.assertTrue(timeline.isIncludeWarning());
}
private AgentStatus createAgentStatus(long timestamp, AgentLifeCycleState state) {
AgentStatus agentStatus = new AgentStatus("testAgent");
agentStatus.setEventTimestamp(timestamp);
agentStatus.setState(state);
return agentStatus;
}
private AgentEvent createAgentEvent(long agentStartTimestamp, long timestamp, AgentEventType agentEventType) {
return new AgentEvent(new AgentEventBo("testAgentId", agentStartTimestamp, timestamp, agentEventType));
}
private AgentStatusTimelineSegment createSegment(long startTimestamp, long endTimestamp, AgentState state) {
AgentStatusTimelineSegment segment = new AgentStatusTimelineSegment();
segment.setStartTimestamp(startTimestamp);
segment.setEndTimestamp(endTimestamp);
segment.setValue(state);
return segment;
}
}