/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
/**
*
* @author carcassi
*/
public class ServiceMethodTest {
public ServiceMethodTest() {
}
@Test
public void execute1() {
ServiceMethod method = MathService.createMathService().getServiceMethods().get("add");
Map<String, Object> parameters = new HashMap<>();
parameters.put("arg1", 1);
parameters.put("arg2", 2);
Map<String, Object> result = method.executeSync(parameters);
assertThat(result.get("result"), equalTo((Object) 3.0));
}
@Test(expected = IllegalArgumentException.class)
public void execute2() {
ServiceMethod method = MathService.createMathService().getServiceMethods().get("add");
Map<String, Object> parameters = new HashMap<>();
parameters.put("arg1", 1);
parameters.put("arg2", "test");
method.executeSync(parameters);
}
@Test
public void execute3() {
ServiceMethod method = MathService.createMathService().getServiceMethods().get("multiply");
Map<String, Object> parameters = new HashMap<>();
parameters.put("arg1", 1);
parameters.put("arg2", 2);
Map<String, Object> result = method.executeSync(parameters);
assertThat(result.get("result"), equalTo((Object) 2.0));
}
@Test
public void toString1() {
ServiceMethod method = MathService.createMathService().getServiceMethods().get("multiply");
assertThat(method.toString(), equalTo("multiply(Number arg1, Number arg2): Number result"));
}
@Test
public void toString2() {
ServiceMethod method = MathService.createMathService().getServiceMethods().get("add");
assertThat(method.toString(), equalTo("add(Number arg1, Number arg2): Number result"));
}
@Test
public void executeAsyncVsSync(){
ServiceMethod method = TimerWaitServiceMethod.createTimerService().getServiceMethods().get("wait");
// Time measurement
long startTimeSync, endTimeSync;
long startTimeAsync, endTimeAsync, postLatchTimeAsync;
// ASYNC setup
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<Map<String, Object>> result = new AtomicReference<>();
Consumer<Map<String, Object>> callback = (Map<String, Object> newValue) -> {
result.set(newValue);
latch.countDown();
};
Consumer<Exception> errorCallback = (Exception ex) -> {
fail("Unexpected async exception");
};
// ASYNC execution
startTimeAsync = System.currentTimeMillis();
method.executeAsync(new HashMap<>(), callback, errorCallback);
endTimeAsync = System.currentTimeMillis();
// await latch
try {
latch.await(60, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
fail("Unable to finish async execution");
}
postLatchTimeAsync = System.currentTimeMillis();
// SYNC execution
startTimeSync = System.currentTimeMillis();
method.executeSync(new HashMap<>());
endTimeSync = System.currentTimeMillis();
// Test
assertTrue(endTimeAsync - startTimeAsync < 1000);
assertTrue(postLatchTimeAsync - startTimeAsync >= 1000);
assertTrue(endTimeSync - startTimeSync >= 1000);
}
}