/*
* Copyright 2014 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;
import static com.navercorp.pinpoint.common.trace.ServiceTypeProperty.*;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.List;
import com.navercorp.pinpoint.common.service.*;
import com.navercorp.pinpoint.common.trace.AnnotationKey;
import com.navercorp.pinpoint.common.trace.AnnotationKeyFactory;
import com.navercorp.pinpoint.common.trace.ServiceType;
import com.navercorp.pinpoint.common.trace.ServiceTypeFactory;
import com.navercorp.pinpoint.common.trace.TraceMetadataLoader;
import com.navercorp.pinpoint.common.trace.TraceMetadataProvider;
import com.navercorp.pinpoint.common.trace.TraceMetadataSetupContext;
import com.navercorp.pinpoint.common.util.logger.CommonLoggerFactory;
import com.navercorp.pinpoint.common.util.StaticFieldLookUp;
import com.navercorp.pinpoint.common.util.logger.StdoutCommonLoggerFactory;
import org.junit.Test;
/**
* @author Jongho Moon <jongho.moon@navercorp.com>
*
*/
public class ServiceTypeInitializerTest {
private CommonLoggerFactory loggerFactory = StdoutCommonLoggerFactory.INSTANCE;
private static final ServiceType[] TEST_TYPES = {
ServiceTypeFactory.of(1209, "FOR_UNIT_TEST", "UNDEFINED", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION_ID)
};
private static final AnnotationKey[] TEST_KEYS = {
AnnotationKeyFactory.of(1209, "Duplicate-API")
};
private static final ServiceType[] DUPLICATED_CODE_WITH_DEFAULT_TYPE = {
ServiceTypeFactory.of(ServiceType.USER.getCode(), "FOR_UNIT_TEST", "UNDEFINED", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION_ID)
};
private static final ServiceType[] DUPLICATED_NAME_WITH_DEFAULT_TYPE = {
ServiceTypeFactory.of(1209, ServiceType.USER.getName(), "UNDEFINED", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION_ID)
};
private static final AnnotationKey[] DUPLICATED_CODE_WITH_DEFAULT_KEY = {
AnnotationKeyFactory.of(AnnotationKey.ARGS0.getCode(), "API")
};
private void verifyAnnotationKeys(List<AnnotationKey> annotationKeys, AnnotationKeyRegistryService annotationKeyRegistryService) {
for (AnnotationKey key : annotationKeys) {
assertSame(key, annotationKeyRegistryService.findAnnotationKey(key.getCode()));
}
}
@Test
public void testWithPlugins() {
List<TraceMetadataProvider> typeProviders = Arrays.<TraceMetadataProvider>asList(new TestProvider(TEST_TYPES, TEST_KEYS));
TraceMetadataLoaderService typeLoaderService = new DefaultTraceMetadataLoaderService(typeProviders, loggerFactory);
AnnotationKeyRegistryService annotationKeyRegistryService = new DefaultAnnotationKeyRegistryService(typeLoaderService, loggerFactory);
StaticFieldLookUp<AnnotationKey> lookUp = new StaticFieldLookUp<AnnotationKey>(AnnotationKey.class, AnnotationKey.class);
verifyAnnotationKeys(lookUp.lookup(), annotationKeyRegistryService);
verifyAnnotationKeys(Arrays.asList(TEST_KEYS), annotationKeyRegistryService);
}
@Test(expected=RuntimeException.class)
public void testDuplicated() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(TEST_TYPES, TEST_KEYS),
new TestProvider(new ServiceType[0], TEST_KEYS)
);
TraceMetadataLoader loader = new TraceMetadataLoader();
loader.load(providers);
}
@Test(expected=RuntimeException.class)
public void testDuplicated2() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(TEST_TYPES, TEST_KEYS),
new TestProvider(TEST_TYPES, new AnnotationKey[0])
);
TraceMetadataLoader loader = new TraceMetadataLoader();
loader.load(providers);
}
@Test(expected=RuntimeException.class)
public void testDuplicated3() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(TEST_TYPES, TEST_KEYS),
new TestProvider(TEST_TYPES, new AnnotationKey[0])
);
TraceMetadataLoader loader = new TraceMetadataLoader();
loader.load(providers);
}
@Test(expected=RuntimeException.class)
public void testDuplicatedWithDefault() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(DUPLICATED_CODE_WITH_DEFAULT_TYPE, TEST_KEYS)
);
TraceMetadataLoaderService loaderService = new DefaultTraceMetadataLoaderService(providers, loggerFactory);
ServiceTypeRegistryService serviceTypeRegistryService = new DefaultServiceTypeRegistryService(loaderService, loggerFactory);
}
@Test(expected=RuntimeException.class)
public void testDuplicatedWithDefault2() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(DUPLICATED_NAME_WITH_DEFAULT_TYPE, TEST_KEYS)
);
TraceMetadataLoaderService loaderService = new DefaultTraceMetadataLoaderService(providers, loggerFactory);
ServiceTypeRegistryService serviceTypeRegistryService = new DefaultServiceTypeRegistryService(loaderService, loggerFactory);
}
@Test(expected=RuntimeException.class)
public void testDuplicatedWithDefault3() {
List<TraceMetadataProvider> providers = Arrays.<TraceMetadataProvider>asList(
new TestProvider(TEST_TYPES, DUPLICATED_CODE_WITH_DEFAULT_KEY)
);
TraceMetadataLoaderService loaderService = new DefaultTraceMetadataLoaderService(providers, loggerFactory);
AnnotationKeyRegistryService annotationKeyRegistryService = new DefaultAnnotationKeyRegistryService(loaderService, loggerFactory);
}
private static class TestProvider implements TraceMetadataProvider {
private final ServiceType[] serviceTypes;
private final AnnotationKey[] annotationKeys;
public TestProvider(ServiceType[] serviceTypes, AnnotationKey[] annotationKeys) {
this.serviceTypes = serviceTypes;
this.annotationKeys = annotationKeys;
}
@Override
public void setup(TraceMetadataSetupContext context) {
for (ServiceType type : serviceTypes) {
context.addServiceType(type);
}
for (AnnotationKey key : annotationKeys) {
context.addAnnotationKey(key);
}
}
}
}