blob: 8e93f0bef9f130e34a9f656660b0b2faee7f9484 [file] [log] [blame]
/*
* 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.servicecomb.foundation.metrics;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Test;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.netflix.spectator.api.Measurement;
import com.netflix.spectator.api.Meter;
import com.netflix.spectator.api.Registry;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mocked;
import org.junit.jupiter.api.Assertions;
public class TestMetricsBootstrap {
MetricsBootstrap bootstrap = new MetricsBootstrap();
GlobalRegistry globalRegistry = new GlobalRegistry();
EventBus eventBus = new EventBus();
@Test
public void loadMetricsInitializers() {
List<MetricsInitializer> initList = new ArrayList<>();
MetricsInitializer metricsInitializer = new MetricsInitializer() {
@Override
public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
initList.add(this);
}
};
new Expectations(SPIServiceUtils.class) {
{
SPIServiceUtils.getSortedService(MetricsInitializer.class);
result = Arrays.asList(metricsInitializer, metricsInitializer);
}
};
bootstrap.start(globalRegistry, eventBus);
bootstrap.shutdown();
MatcherAssert.assertThat(initList, Matchers.contains(metricsInitializer, metricsInitializer));
}
@Test
public void pollMeters(@Mocked Registry registry, @Mocked Meter meter, @Mocked Measurement measurement,
@Mocked ScheduledExecutorService executor) {
List<Meter> meters = Arrays.asList(meter);
globalRegistry.add(registry);
new Expectations(Executors.class) {
{
Executors.newScheduledThreadPool(1, (ThreadFactory) any);
result = executor;
registry.iterator();
result = meters.iterator();
meter.measure();
result = Arrays.asList(measurement);
}
};
bootstrap.start(globalRegistry, eventBus);
PolledEvent result = new PolledEvent(null, null);
eventBus.register(new Object() {
@Subscribe
public void onEvent(PolledEvent event) {
result.setMeters(event.getMeters());
result.setMeasurements(event.getMeasurements());
}
});
bootstrap.pollMeters();
bootstrap.shutdown();
Assertions.assertEquals(meters, result.getMeters());
MatcherAssert.assertThat(result.getMeasurements(), Matchers.contains(measurement));
}
@Test
public void shutdown(@Mocked ScheduledExecutorService scheduledExecutorService) {
List<MetricsInitializer> destroyList = new ArrayList<>();
MetricsInitializer initializer1 = new MetricsInitializer() {
@Override
public int getOrder() {
return 1;
}
@Override
public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
}
@Override
public void destroy() {
destroyList.add(this);
}
};
MetricsInitializer initializer2 = new MetricsInitializer() {
@Override
public int getOrder() {
return 2;
}
@Override
public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
}
@Override
public void destroy() {
destroyList.add(this);
}
};
new Expectations(SPIServiceUtils.class) {
{
SPIServiceUtils.getSortedService(MetricsInitializer.class);
result = Arrays.asList(initializer1, initializer2);
}
};
Deencapsulation.setField(bootstrap, "executorService", scheduledExecutorService);
bootstrap.shutdown();
MatcherAssert.assertThat(destroyList, Matchers.contains(initializer2, initializer1));
}
@Test
public void shutdown_notStart() {
Assertions.assertNull(Deencapsulation.getField(bootstrap, "executorService"));
// should not throw exception
bootstrap.shutdown();
}
}