/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.tck.config; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mule.runtime.core.api.config.MuleProperties.OBJECT_SCHEDULER_BASE_CONFIG; import static org.mule.runtime.core.api.scheduler.SchedulerConfig.config; import org.mule.runtime.api.el.DefaultExpressionLanguageFactoryService; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.scheduler.Scheduler; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.registry.MuleRegistry; import org.mule.runtime.core.config.builders.AbstractConfigurationBuilder; import org.mule.service.http.api.HttpService; import org.mule.tck.SimpleUnitTestSupportSchedulerService; import java.util.List; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.mule.weave.v2.el.WeaveDefaultExpressionLanguageFactoryService; /** * Registers services instances into the {@link MuleRegistry} of a {@link MuleContext}. * <p> * This is to be used only in tests that do not leverage the service injection mechanism. * * @since 4.0 */ public class TestServicesConfigurationBuilder extends AbstractConfigurationBuilder implements TestRule { private static final String MOCK_HTTP_SERVICE = "mockHttpService"; private static final String MOCK_EXPR_EXECUTOR = "mockExpressionExecutor"; private final SimpleUnitTestSupportSchedulerService schedulerService = new SimpleUnitTestSupportSchedulerService(); private boolean mockHttpService; private boolean mockExpressionExecutor; public TestServicesConfigurationBuilder() { this(true, true); } public TestServicesConfigurationBuilder(boolean mockHttpService, boolean mockExpressionExecutor) { this.mockHttpService = mockHttpService; this.mockExpressionExecutor = mockExpressionExecutor; } @Override public void doConfigure(MuleContext muleContext) throws Exception { MuleRegistry registry = muleContext.getRegistry(); registry.registerObject(schedulerService.getName(), spy(schedulerService)); registry.registerObject(OBJECT_SCHEDULER_BASE_CONFIG, config()); if (mockExpressionExecutor) { DefaultExpressionLanguageFactoryService expressionExecutor = mock(DefaultExpressionLanguageFactoryService.class, RETURNS_DEEP_STUBS); registry.registerObject(MOCK_EXPR_EXECUTOR, expressionExecutor); } else { final DefaultExpressionLanguageFactoryService exprExecutor = new WeaveDefaultExpressionLanguageFactoryService(); registry.registerObject(exprExecutor.getName(), exprExecutor); } if (mockHttpService) { registry.registerObject(MOCK_HTTP_SERVICE, mock(HttpService.class)); } } public void stopServices() throws MuleException { final List<Scheduler> schedulers = schedulerService.getSchedulers(); try { assertThat(schedulers, empty()); } finally { schedulerService.stop(); } } @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { try { base.evaluate(); } finally { stopServices(); } } }; } }