/*
* Copyright 2014 Effektif GmbH.
*
* 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.effektif.server.test;
import static org.junit.Assert.*;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.effektif.mongo.MongoConfiguration;
import com.effektif.server.EffektifJsonProvider;
import com.effektif.server.WorkflowServer;
import com.effektif.workflow.api.Configuration;
import com.effektif.workflow.api.activities.EndEvent;
import com.effektif.workflow.api.activities.NoneTask;
import com.effektif.workflow.api.activities.ReceiveTask;
import com.effektif.workflow.api.activities.StartEvent;
import com.effektif.workflow.api.model.Deployment;
import com.effektif.workflow.api.model.Message;
import com.effektif.workflow.api.model.TriggerInstance;
import com.effektif.workflow.api.model.WorkflowInstanceId;
import com.effektif.workflow.api.workflow.ExecutableWorkflow;
import com.effektif.workflow.api.workflowinstance.WorkflowInstance;
import com.effektif.workflow.impl.json.JsonStreamMapper;
/**
* @author Tom Baeyens
*/
public class ServerTest extends JerseyTest {
// static {
// try {
// final InputStream inputStream = ServerTest.class.getResourceAsStream("/logging.properties");
// LogManager.getLogManager().readConfiguration(inputStream);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public static final Logger log = LoggerFactory.getLogger(ServerTest.class);
static Configuration configuration = null;
@Override
protected Application configure() {
return WorkflowServer.buildRestApplication(getConfiguration());
}
protected Configuration getConfiguration() {
if (configuration!=null) {
return configuration;
}
configuration = new MongoConfiguration()
.server("localhost", 27017);
configuration.start();
return configuration;
}
@Override
protected void configureClient(ClientConfig clientConfig) {
JsonStreamMapper jsonMapper = getConfiguration().get(JsonStreamMapper.class);
clientConfig.register(new EffektifJsonProvider(jsonMapper));
}
@Test
public void test() {
// Create a workflow
ExecutableWorkflow workflow = new ExecutableWorkflow()
.sourceWorkflowId("Server test workflow")
.activity("One", new StartEvent()
.transitionToNext())
.activity("Two", new NoneTask()
.transitionToNext())
.activity("Three", new ReceiveTask()
.transitionToNext())
.activity("Four", new NoneTask()
.transitionToNext())
.activity("Five", new EndEvent());
// String str = getConfiguration().get(JsonService.class).objectToJsonString(workflow);
Deployment deployment = target("deploy").request()
.post(Entity.entity(workflow, MediaType.APPLICATION_JSON))
.readEntity(Deployment.class);
assertFalse(deployment.getIssueReport(), deployment.hasIssues());
runProcessInstance();
// for (int i=0; i<20; i++) {
// runProcessInstance(workflowId);
// }
// long start = System.currentTimeMillis();
// for (int i=20; i<1000; i++) {
// log.info("starting "+i);
// runProcessInstance(workflowId);
// }
// long end = System.currentTimeMillis();
// log.info("1000 process instances in "+((end-start)/1000f)+ " seconds");
// log.info("1000 process instances in "+(1000000f/(end-start))+ " per second");
}
protected void runProcessInstance() {
TriggerInstance start = new TriggerInstance()
.sourceWorkflowId("Server test workflow");
WorkflowInstance workflowInstance = target("start").request()
.post(Entity.entity(start, MediaType.APPLICATION_JSON))
.readEntity(WorkflowInstance.class);
WorkflowInstanceId workflowInstanceId = workflowInstance.getId();
String subTaskInstanceId = workflowInstance.findOpenActivityInstance("Three").getId();
Message message = new Message()
.workflowInstanceId(workflowInstanceId)
.activityInstanceId(subTaskInstanceId);
workflowInstance = target("message").request()
.post(Entity.entity(message, MediaType.APPLICATION_JSON))
.readEntity(WorkflowInstance.class);
assertTrue(workflowInstance.isEnded());
}
}