/* * Copyright 2016 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.common.server.bo.serializer.stat; import com.navercorp.pinpoint.common.server.bo.serializer.HbaseSerializer; import com.navercorp.pinpoint.common.server.bo.stat.AgentStatDataPoint; import com.navercorp.pinpoint.common.server.bo.stat.AgentStatType; import org.apache.hadoop.hbase.client.Put; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.TreeSet; import static com.navercorp.pinpoint.common.hbase.HBaseTables.AGENT_STAT_TIMESPAN_MS; import static org.junit.Assert.assertEquals; /** * @author HyunGil Jeong */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext-test.xml") public class AgentStatHbaseOperationFactoryTest { protected static final String TEST_AGENT_ID = "testAgentId"; private static final AgentStatType TEST_AGENT_STAT_TYPE = AgentStatType.JVM_GC; protected static final long TEST_COLLECTION_INTERVAL = 5000L; @Mock private HbaseSerializer<List<AgentStatDataPoint>, Put> mockSerializer; @Autowired private AgentStatHbaseOperationFactory agentStatHbaseOperationFactory; @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void create_should_return_empty_list_for_null_dataPoints() { List<AgentStatDataPoint> dataPoints = null; List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, dataPoints, this.mockSerializer); assertEquals(Collections.<Put>emptyList(), puts); } @Test public void create_should_return_empty_list_for_empty_dataPoints() { List<AgentStatDataPoint> dataPoints = Collections.emptyList(); List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, dataPoints, this.mockSerializer); assertEquals(Collections.<Put>emptyList(), puts); } @Test public void create_should_create_one_put_if_there_is_only_one_dataPoint() { // Given final int numDataPoints = 1; final long initialTimestamp = AGENT_STAT_TIMESPAN_MS + 1L; final long expectedBaseTimestamp = AgentStatUtils.getBaseTimestamp(initialTimestamp); final List<AgentStatDataPoint> testDataPoints = createTestDataPoints(initialTimestamp, TEST_COLLECTION_INTERVAL, numDataPoints); // When List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, testDataPoints, this.mockSerializer); // Then assertEquals(1, puts.size()); Put put = puts.get(0); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(put.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(put.getRow())); assertEquals(expectedBaseTimestamp, this.agentStatHbaseOperationFactory.getBaseTimestamp(put.getRow())); } @Test public void create_should_create_one_put_if_dataPoints_fit_into_a_single_slot() { // Given final int numDataPoints = 6; final long initialTimestamp = AGENT_STAT_TIMESPAN_MS; final long expectedBaseTimestamp = AgentStatUtils.getBaseTimestamp(initialTimestamp); final List<AgentStatDataPoint> testDataPoints = createTestDataPoints(initialTimestamp, TEST_COLLECTION_INTERVAL, numDataPoints); // When List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, testDataPoints, this.mockSerializer); // Then assertEquals(1, puts.size()); Put put = puts.get(0); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(put.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(put.getRow())); assertEquals(expectedBaseTimestamp, this.agentStatHbaseOperationFactory.getBaseTimestamp(put.getRow())); } @Test public void create_should_create_two_puts_if_dataPoints_span_over_a_timespan() { // Given final int numDataPoints = 6; final long initialTimestamp = AGENT_STAT_TIMESPAN_MS - TEST_COLLECTION_INTERVAL; final long expectedBaseTimestamp1 = AgentStatUtils.getBaseTimestamp(initialTimestamp); final long expectedBaseTimestamp2 = AgentStatUtils.getBaseTimestamp(expectedBaseTimestamp1 + AGENT_STAT_TIMESPAN_MS); final List<AgentStatDataPoint> testDataPoints = createTestDataPoints(initialTimestamp, TEST_COLLECTION_INTERVAL, numDataPoints); // When List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, testDataPoints, this.mockSerializer); // Then assertEquals(2, puts.size()); Put firstPut = puts.get(0); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(firstPut.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(firstPut.getRow())); assertEquals(expectedBaseTimestamp1, this.agentStatHbaseOperationFactory.getBaseTimestamp(firstPut.getRow())); Put secondPut = puts.get(1); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(secondPut.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(secondPut.getRow())); assertEquals(expectedBaseTimestamp2, this.agentStatHbaseOperationFactory.getBaseTimestamp(secondPut.getRow())); } @Test public void create_should_create_the_same_number_of_puts_as_dataPoints_if_collectionInterval_equals_timespan() { // Given final int numDataPoints = 100; final long initialTimestamp = AGENT_STAT_TIMESPAN_MS - 1L; final long expectedInitialBaseTimestamp = AgentStatUtils.getBaseTimestamp(initialTimestamp); final List<AgentStatDataPoint> testDataPoints = createTestDataPoints(initialTimestamp, AGENT_STAT_TIMESPAN_MS, numDataPoints); // When List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, testDataPoints, this.mockSerializer); // Then assertEquals(numDataPoints, puts.size()); for (int i = 0; i < puts.size(); ++i) { Put put = puts.get(i); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(put.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(put.getRow())); long expectedBaseTimestamp = expectedInitialBaseTimestamp + (i * AGENT_STAT_TIMESPAN_MS); assertEquals(expectedBaseTimestamp, this.agentStatHbaseOperationFactory.getBaseTimestamp(put.getRow())); } } @Test public void test_using_current_timestamp() { // Given final int numDataPoints = 6; final long initialTimestamp = System.currentTimeMillis() - (TEST_COLLECTION_INTERVAL * numDataPoints); final List<AgentStatDataPoint> testDataPoints = createTestDataPoints(initialTimestamp, TEST_COLLECTION_INTERVAL, numDataPoints); final Set<Long> uniqueTimeslots = new TreeSet<Long>(); for (AgentStatDataPoint testDataPoint : testDataPoints) { uniqueTimeslots.add(AgentStatUtils.getBaseTimestamp(testDataPoint.getTimestamp())); } // When List<Put> puts = this.agentStatHbaseOperationFactory.createPuts(TEST_AGENT_ID, TEST_AGENT_STAT_TYPE, testDataPoints, this.mockSerializer); // Then assertEquals(uniqueTimeslots.size(), puts.size()); int i = 0; for (Long timeslot : uniqueTimeslots) { long expectedBaseTimestamp = timeslot; Put put = puts.get(i++); assertEquals(TEST_AGENT_ID, this.agentStatHbaseOperationFactory.getAgentId(put.getRow())); assertEquals(TEST_AGENT_STAT_TYPE, this.agentStatHbaseOperationFactory.getAgentStatType(put.getRow())); assertEquals(expectedBaseTimestamp, this.agentStatHbaseOperationFactory.getBaseTimestamp(put.getRow())); } } private List<AgentStatDataPoint> createTestDataPoints(long initialTimestamp, long interval, int count) { List<AgentStatDataPoint> dataPoints = new ArrayList<AgentStatDataPoint>(count); long timestamp = initialTimestamp; for (int i = 0; i < count; ++i) { AgentStatDataPoint dataPoint = createTestDataPoint(timestamp); dataPoints.add(dataPoint); timestamp += interval; } return dataPoints; } private AgentStatDataPoint createTestDataPoint(final long testTimestamp) { final String testAgentId = "testAgentId"; final long testStartTimestamp = 0L; return new AgentStatDataPoint() { private String agentId = testAgentId; private long startTimestamp = testStartTimestamp; private long timestamp = testTimestamp; @Override public String getAgentId() { return this.agentId; } @Override public void setAgentId(String agentId) { this.agentId = agentId; } @Override public long getStartTimestamp() { return startTimestamp; } @Override public void setStartTimestamp(long startTimestamp) { this.startTimestamp = startTimestamp; } @Override public long getTimestamp() { return this.timestamp; } @Override public void setTimestamp(long timestamp) { this.timestamp = timestamp; } @Override public AgentStatType getAgentStatType() { return AgentStatType.UNKNOWN; } }; } }