/* * 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.profiler.monitor.metric.datasource; import com.navercorp.pinpoint.bootstrap.plugin.monitor.DataSourceMonitor; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.profiler.context.monitor.DataSourceMonitorRegistryService; import com.navercorp.pinpoint.profiler.context.monitor.DefaultDataSourceMonitorRegistryService; import com.navercorp.pinpoint.profiler.context.monitor.JdbcUrlParsingService; import com.navercorp.pinpoint.thrift.dto.TDataSource; import com.navercorp.pinpoint.thrift.dto.TDataSourceList; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; /** * @author Taejin Koo */ @RunWith(MockitoJUnitRunner.class) public class DefaultDataSourceMetricTest { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Mock private JdbcUrlParsingService jdbcUrlParsingService; @Test public void collectTest() throws Exception { int createMockObjectSize = 10; DataSourceMonitorRegistryService dataSourceMonitorRegistryService = new DefaultDataSourceMonitorRegistryService(createMockObjectSize); MockDataSourceMonitor[] mockDataSourceMonitors = createMockDataSourceMonitor(dataSourceMonitorRegistryService, dataSourceMonitorRegistryService.getRemainingIdNumber()); logger.debug("JdbcUrlParsingService:{}", jdbcUrlParsingService); DataSourceMetric dataSourceMetric = new DefaultDataSourceMetric(dataSourceMonitorRegistryService, jdbcUrlParsingService); TDataSourceList collect = dataSourceMetric.dataSourceList(); assertIdIsUnique(collect.getDataSourceList()); for (MockDataSourceMonitor dataSourceMonitor : mockDataSourceMonitors) { assertContainsAndEquals(dataSourceMonitor, collect.getDataSourceList()); } } private MockDataSourceMonitor[] createMockDataSourceMonitor(DataSourceMonitorRegistryService dataSourceMonitorRegistry, int remainingCapacity) { MockDataSourceMonitor[] mockDataSourceMonitors = new MockDataSourceMonitor[remainingCapacity]; for (int i = 0; i < remainingCapacity; i++) { MockDataSourceMonitor mock = new MockDataSourceMonitor(i); boolean register = dataSourceMonitorRegistry.register(mock); Assert.assertTrue(register); mockDataSourceMonitors[i] = mock; } return mockDataSourceMonitors; } private void assertIdIsUnique(List<TDataSource> dataSourceList) { Set<Integer> idSet = new HashSet<Integer>(); for (TDataSource dataSource : dataSourceList) { idSet.add(dataSource.getId()); } Assert.assertEquals(dataSourceList.size(), idSet.size()); } private void assertContainsAndEquals(DataSourceMonitor dataSourceMonitor, List<TDataSource> dataSourceList) { for (TDataSource dataSource : dataSourceList) { String url = dataSourceMonitor.getUrl(); if (url.equals(dataSource.getUrl())) { Assert.assertEquals(dataSourceMonitor.getActiveConnectionSize(), dataSource.getActiveConnectionSize()); Assert.assertEquals(dataSourceMonitor.getMaxConnectionSize(), dataSource.getMaxConnectionSize()); Assert.assertEquals(dataSourceMonitor.getServiceType().getCode(), dataSource.getServiceTypeCode()); return; } } Assert.fail(); } private static class MockDataSourceMonitor implements DataSourceMonitor { private static final Random RANDOM = new Random(System.currentTimeMillis()); private static final int MIN_VALUE_OF_MAX_CONNECTION_SIZE = 20; private static final ServiceType[] SERVICE_TYPE_LIST = {ServiceType.UNKNOWN, ServiceType.UNDEFINED, ServiceType.TEST}; private final int id; private final ServiceType serviceType; private final int activeConnectionSize; private final int maxConnectionSize; private boolean closed = false; public MockDataSourceMonitor(int index) { this.id = index; this.serviceType = SERVICE_TYPE_LIST[RANDOM.nextInt(SERVICE_TYPE_LIST.length)]; this.maxConnectionSize = MIN_VALUE_OF_MAX_CONNECTION_SIZE + RANDOM.nextInt(MIN_VALUE_OF_MAX_CONNECTION_SIZE); this.activeConnectionSize = RANDOM.nextInt(maxConnectionSize); } @Override public String getUrl() { return "url" + id; } @Override public int getActiveConnectionSize() { return activeConnectionSize; } @Override public int getMaxConnectionSize() { return maxConnectionSize; } @Override public ServiceType getServiceType() { return serviceType; } @Override public boolean isDisabled() { return closed; } public void close() { closed = true; } } }