/*
* 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.runtime.core.source.polling;
import static java.util.Collections.singletonMap;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mule.runtime.api.meta.AbstractAnnotatedObject.LOCATION_KEY;
import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.disposeIfNeeded;
import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.stopIfNeeded;
import static org.mule.tck.MuleTestUtils.getTestFlow;
import static org.slf4j.LoggerFactory.getLogger;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.scheduler.Scheduler;
import org.mule.runtime.core.source.scheduler.DefaultSchedulerMessageSource;
import org.mule.runtime.core.source.scheduler.schedule.FixedFrequencyScheduler;
import org.mule.tck.SensingNullMessageProcessor;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.probe.PollingProber;
import org.mule.tck.probe.Probe;
import java.util.List;
import org.junit.After;
import org.junit.Test;
import org.slf4j.Logger;
public class DefaultSchedulerMessageSourceTestCase extends AbstractMuleContextTestCase {
private static final Logger LOGGER = getLogger(DefaultSchedulerMessageSourceTestCase.class);
@Test
public void simplePoll() throws Exception {
DefaultSchedulerMessageSource schedulerMessageSource = createMessageSource();
SensingNullMessageProcessor flow = getSensingNullMessageProcessor();
schedulerMessageSource.setListener(flow);
schedulerMessageSource.setAnnotations(singletonMap(LOCATION_KEY, TEST_CONNECTOR_LOCATION));
schedulerMessageSource.trigger();
new PollingProber(RECEIVE_TIMEOUT, 100).check(new Probe() {
@Override
public boolean isSatisfied() {
return flow.event != null;
}
@Override
public String describeFailure() {
return "flow event never set by the source flow";
}
});
}
@Test
public void disposeScheduler() throws Exception {
reset(muleContext.getSchedulerService());
DefaultSchedulerMessageSource schedulerMessageSource = createMessageSource();
verify(muleContext.getSchedulerService()).cpuLightScheduler();
List<Scheduler> createdSchedulers = muleContext.getSchedulerService().getSchedulers();
schedulerMessageSource.start();
Scheduler pollScheduler = createdSchedulers.get(createdSchedulers.size() - 1);
verify(pollScheduler).scheduleAtFixedRate(any(), anyLong(), anyLong(), any());
schedulerMessageSource.stop();
schedulerMessageSource.dispose();
verify(pollScheduler).stop();
}
private DefaultSchedulerMessageSource schedulerMessageSource;
@After
public void after() throws MuleException {
stopIfNeeded(schedulerMessageSource);
disposeIfNeeded(schedulerMessageSource, LOGGER);
}
private DefaultSchedulerMessageSource createMessageSource() throws Exception {
schedulerMessageSource =
new DefaultSchedulerMessageSource(muleContext, scheduler());
schedulerMessageSource.setFlowConstruct(getTestFlow(muleContext));
schedulerMessageSource.initialise();
return schedulerMessageSource;
}
private FixedFrequencyScheduler scheduler() {
FixedFrequencyScheduler factory = new FixedFrequencyScheduler();
factory.setFrequency(1000);
return factory;
}
}