/**
* Copyright (C) 2014 Stratio (http://stratio.com)
*
* 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.stratio.decision.service;
import com.stratio.decision.commons.constants.ColumnType;
import com.stratio.decision.commons.constants.StreamAction;
import com.stratio.decision.commons.messages.ColumnNameTypeValue;
import com.stratio.decision.configuration.ConfigurationContext;
import com.stratio.decision.dao.StreamStatusDao;
import com.stratio.decision.drools.DroolsConnectionContainer;
import com.stratio.decision.exception.ServiceException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.internal.verification.VerificationModeFactory;
import org.wso2.siddhi.core.SiddhiManager;
import org.wso2.siddhi.core.event.StreamEvent;
import org.wso2.siddhi.core.query.output.callback.QueryCallback;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class StreamOperationServiceTest {
private SiddhiManager sm;
private StreamOperationService streamOperationService;
private CallbackService callbackFactory;
private StreamStatusDao streamStatusDao;
private ConfigurationContext configurationContext;
private DroolsConnectionContainer droolsConnectionContainer;
private static final String STREAM_NAME_GOOD = "goodStreamName";
private static final String INFERRED_STREAM_GOOD = "goodInferredStreamName";
private static final String CLUSTER_ID = "default";
@Before
public void setUp() {
streamStatusDao = Mockito.mock(StreamStatusDao.class);
callbackFactory = Mockito.mock(CallbackService.class);
configurationContext = Mockito.mock(ConfigurationContext.class);
droolsConnectionContainer = Mockito.mock(DroolsConnectionContainer.class);
sm = new SiddhiManager();
streamOperationService = new StreamOperationService(sm, streamStatusDao, callbackFactory,
droolsConnectionContainer, configurationContext);
}
@Test
public void createStreamTest() {
createBaseStream();
Assert.assertEquals("Expected value not found", 1, sm.getStreamDefinitions().size());
Assert.assertEquals("Expected value not found", 6,
sm.getStreamDefinitions().get(0).getAttributeList().size());
}
@Test
public void enlargeStreamTest() throws ServiceException {
createBaseStream();
Assert.assertEquals("Expected value not found", 1, sm.getStreamDefinitions().size());
Assert.assertEquals("Expected value not found", 6,
sm.getStreamDefinitions().get(0).getAttributeList().size());
List<ColumnNameTypeValue> columns = new ArrayList<>();
columns.add(new ColumnNameTypeValue("col7", ColumnType.INTEGER, null));
streamOperationService.enlargeStream(STREAM_NAME_GOOD, columns);
Assert.assertEquals("Expected value not found", 1, sm.getStreamDefinitions().size());
Assert.assertEquals("Expected value not found", 7,
sm.getStreamDefinitions().get(0).getAttributeList().size());
}
@Test
public void addQueryTest() {
createBaseStream();
streamOperationService.addQuery(STREAM_NAME_GOOD, "from " + STREAM_NAME_GOOD + " select * insert into "
+ INFERRED_STREAM_GOOD + " for current-events");
Mockito.verify(streamStatusDao, VerificationModeFactory.times(2)).createInferredStream(Mockito.anyString(), Mockito.anyList());
Assert.assertEquals("Expected value not found", 2, sm.getStreamDefinitions().size());
}
@Test
public void addCallbackFunctionTest() throws ServiceException {
StreamAction streamAction = StreamAction.SAVE_TO_ELASTICSEARCH;
ArgumentCaptor<String> actionQueryIdArgumentCaptor = ArgumentCaptor.forClass(String.class);
QueryCallback callback = Mockito.mock(QueryCallback.class);
Mockito.when(callbackFactory.add(Mockito.anyString(), (Set<StreamAction>) Mockito.anyObject(), Mockito
.anyString() )).thenReturn(
callback);
Mockito.doNothing().when(streamStatusDao).enableAction(Mockito.eq(STREAM_NAME_GOOD), Mockito.eq(streamAction));
Mockito.doNothing().when(streamStatusDao)
.setActionQuery(Mockito.eq(STREAM_NAME_GOOD), actionQueryIdArgumentCaptor.capture());
Mockito.when(configurationContext.getGroupId()).thenReturn(
CLUSTER_ID);
createBaseStream();
streamOperationService.enableAction(STREAM_NAME_GOOD, streamAction);
List<ColumnNameTypeValue> columns = new ArrayList<>();
columns.add(new ColumnNameTypeValue("col1", ColumnType.INTEGER, 34));
columns.add(new ColumnNameTypeValue("col2", ColumnType.STRING, "text value"));
columns.add(new ColumnNameTypeValue("col3", ColumnType.BOOLEAN, true));
columns.add(new ColumnNameTypeValue("col4", ColumnType.DOUBLE, 1.2));
columns.add(new ColumnNameTypeValue("col5", ColumnType.FLOAT, 10f));
columns.add(new ColumnNameTypeValue("col6", ColumnType.LONG, 2L));
streamOperationService.send(STREAM_NAME_GOOD, columns);
Mockito.when(streamStatusDao.getActionQuery(STREAM_NAME_GOOD)).thenReturn(
actionQueryIdArgumentCaptor.getValue());
streamOperationService.disableAction(STREAM_NAME_GOOD, streamAction);
streamOperationService.send(STREAM_NAME_GOOD, columns);
Mockito.verify(callback, Mockito.times(1)).receiveStreamEvent(Mockito.anyLong(), (StreamEvent) Mockito.any(),
(StreamEvent) Mockito.any());
}
private void createBaseStream() {
List<ColumnNameTypeValue> columns = new ArrayList<>();
columns.add(new ColumnNameTypeValue("col1", ColumnType.INTEGER, 1));
columns.add(new ColumnNameTypeValue("col2", ColumnType.STRING, "test string"));
columns.add(new ColumnNameTypeValue("col3", ColumnType.BOOLEAN, true));
columns.add(new ColumnNameTypeValue("col4", ColumnType.DOUBLE, 1.3));
columns.add(new ColumnNameTypeValue("col5", ColumnType.FLOAT, 20f));
columns.add(new ColumnNameTypeValue("col6", ColumnType.LONG, 1L));
streamOperationService.createStream(STREAM_NAME_GOOD, columns);
}
}