use of com.sun.xml.ws.api.pipe.EngineTest.TestTube in project metro-jax-ws by eclipse-ee4j.
the class FiberTest method testNextActionAbortResponse.
public void testNextActionAbortResponse() {
TestTube tubeC = new TestTube() {
@Override
@NotNull
public NextAction processRequest(@NotNull Packet request) {
super.processRequest(request);
NextAction na = new NextAction();
na.abortResponse(request);
return na;
}
};
FilterTestTube tubeB = new FilterTestTube(tubeC);
FilterTestTube tubeA = new FilterTestTube(tubeB);
Packet request = new Packet();
SimpleCompletionCallback callback = new SimpleCompletionCallback();
Fiber fiber = engine.createFiber();
assertNotNull(fiber);
fiber.start(tubeA, request, callback, true);
assertEquals(request, callback.response);
assertNull(callback.error);
List<TubeCall> calls = tubeA.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
TubeCall firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeB.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeC.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
}
use of com.sun.xml.ws.api.pipe.EngineTest.TestTube in project metro-jax-ws by eclipse-ee4j.
the class FiberTest method testStartTubePacketCompletionCallback.
public void testStartTubePacketCompletionCallback() {
final Holder<Boolean> isInExecutor = new Holder<Boolean>(Boolean.FALSE);
TestTube testTube = new TestTube() {
@Override
@NotNull
public NextAction processRequest(@NotNull Packet request) {
isInExecutor.value = executor.isInExecutor();
return super.processRequest(request);
}
};
Packet request = new Packet();
SimpleCompletionCallback callback = new SimpleCompletionCallback();
Fiber fiber = engine.createFiber();
assertNotNull(fiber);
fiber.start(testTube, request, callback);
assertEquals(request, callback.response);
assertNull(callback.error);
List<TubeCall> calls = testTube.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
TubeCall firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
assertTrue(isInExecutor.value);
}
use of com.sun.xml.ws.api.pipe.EngineTest.TestTube in project metro-jax-ws by eclipse-ee4j.
the class FiberTest method testStartTubePacketCompletionCallbackBoolean.
public void testStartTubePacketCompletionCallbackBoolean() {
final Holder<Boolean> isInExecutor = new Holder<Boolean>(Boolean.FALSE);
TestTube testTube = new TestTube() {
@Override
@NotNull
public NextAction processRequest(@NotNull Packet request) {
isInExecutor.value = executor.isInExecutor();
return super.processRequest(request);
}
};
Packet request = new Packet();
SimpleCompletionCallback callback = new SimpleCompletionCallback();
Fiber fiber = engine.createFiber();
assertNotNull(fiber);
fiber.start(testTube, request, callback, true);
assertEquals(request, callback.response);
assertNull(callback.error);
List<TubeCall> calls = testTube.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
TubeCall firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
assertFalse(isInExecutor.value);
}
use of com.sun.xml.ws.api.pipe.EngineTest.TestTube in project metro-jax-ws by eclipse-ee4j.
the class FiberTest method testSuspendNextRunnableResumeThrowablePacket.
public void testSuspendNextRunnableResumeThrowablePacket() throws InterruptedException {
final Semaphore atSuspend = new Semaphore(0);
final Semaphore checkCompleted = new Semaphore(0);
final Semaphore atEnd = new Semaphore(0);
final TestTube tubeC = new TestTube();
final FilterTestTube tubeB = new FilterTestTube(tubeC) {
@Override
@NotNull
public NextAction processRequest(@NotNull Packet request) {
super.processRequest(request);
return doSuspend(next, new Runnable() {
@Override
public void run() {
atSuspend.release();
try {
checkCompleted.acquire();
} catch (InterruptedException e) {
}
}
});
}
};
final FilterTestTube tubeA = new FilterTestTube(tubeB);
final Packet request = new Packet();
final SimpleCompletionCallback callback = new SimpleCompletionCallback() {
@Override
public void onCompletion(@NotNull Packet response) {
super.onCompletion(response);
atEnd.release();
}
@Override
public void onCompletion(@NotNull Throwable error) {
super.onCompletion(error);
atEnd.release();
}
};
final Fiber fiber = threadPoolEngine.createFiber();
assertNotNull(fiber);
fiber.start(tubeA, request, callback);
if (!atSuspend.tryAcquire(3, TimeUnit.MINUTES))
fail("timeout");
// ensure test thread really blocked
assertEquals(0, atEnd.availablePermits());
// thread is suspended
assertNull(callback.response);
assertNull(callback.error);
List<TubeCall> calls = tubeA.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
TubeCall firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeB.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeC.getCalls();
assertNotNull(calls);
assertEquals(0, calls.size());
checkCompleted.release();
Packet secondPacket = new Packet();
fiber.resume(new RuntimeException(), secondPacket);
if (!atEnd.tryAcquire(3, TimeUnit.MINUTES))
fail("timeout");
assertNull(callback.response);
assertTrue(callback.error instanceof RuntimeException);
calls = tubeA.getCalls();
assertNotNull(calls);
assertEquals(2, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
TubeCall secondCall = calls.get(1);
assertNotNull(secondCall);
assertEquals(TubeCallType.EXCEPTION, secondCall.callType);
assertEquals(testContainer, secondCall.container);
assertEquals(secondPacket, secondCall.packet);
calls = tubeB.getCalls();
assertNotNull(calls);
assertEquals(2, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
secondCall = calls.get(1);
assertNotNull(secondCall);
assertEquals(TubeCallType.EXCEPTION, secondCall.callType);
assertEquals(testContainer, secondCall.container);
calls = tubeC.getCalls();
assertNotNull(calls);
assertEquals(0, calls.size());
}
use of com.sun.xml.ws.api.pipe.EngineTest.TestTube in project metro-jax-ws by eclipse-ee4j.
the class FiberTest method testThreadLocalPropagationWithFiberContextSwitch.
public void testThreadLocalPropagationWithFiberContextSwitch() throws InterruptedException {
final Semaphore atSuspend = new Semaphore(0);
final Semaphore checkCompleted = new Semaphore(0);
final Semaphore atEnd = new Semaphore(0);
final TestTube tubeC = new TestTube();
final FilterTestTube tubeB = new FilterTestTube(tubeC) {
@Override
@NotNull
public NextAction processRequest(@NotNull Packet request) {
super.processRequest(request);
// Before suspend, make sure thread-local is available thanks to MyFiberContextSwitchInterceptor.execute
Integer threadLocalInteger = ThreadLocalHelper.get();
assertNotNull(threadLocalInteger);
assertEquals(retainMeInteger, threadLocalInteger);
return doSuspend(new Runnable() {
@Override
public void run() {
atSuspend.release();
try {
checkCompleted.acquire();
} catch (InterruptedException e) {
}
}
});
}
@Override
@NotNull
public NextAction processResponse(@NotNull Packet response) {
super.processResponse(response);
// After resume, make sure thread-local is available thanks to MyFiberContextSwitchInterceptor.execute
Integer threadLocalInteger = ThreadLocalHelper.get();
assertNotNull(threadLocalInteger);
assertEquals(retainMeInteger, threadLocalInteger);
return doReturnWith(response);
}
};
tubeB.setName("testThreadLocalPropagationWithFiberContextSwitch.tubeB");
final FilterTestTube tubeA = new FilterTestTube(tubeB);
tubeA.setName("testThreadLocalPropagationWithFiberContextSwitch.tubeA");
final Packet request = new Packet();
final MyCompletionCallback callback = new MyCompletionCallback() {
@Override
public void onCompletion(@NotNull Packet response) {
super.onCompletion(response);
if (super.fiberName != null)
fiberNameToThreadLocalValueMap.remove(super.fiberName);
atEnd.release();
}
@Override
public void onCompletion(@NotNull Throwable error) {
super.onCompletion(error);
if (super.fiberName != null)
fiberNameToThreadLocalValueMap.remove(super.fiberName);
atEnd.release();
}
};
final Fiber fiber = threadPoolEngine.createFiber();
assertNotNull(fiber);
// Put away some value (say, Transaction context gotten from the thread that is going to invoke fiber.start) before fiber.start
// Post fiber.start, processing thread comes from a thread pool, no guarantee of same thread in force
// This entry will be cleaned up when SimpleCompletionCallback callback method is called at last
fiberNameToThreadLocalValueMap.put(fiber.toString(), retainMeInteger);
// callback has to remember Fiber name so that it can remove the entry from fiberNameToThreadLocalValueMap having Fiber name as the key
callback.setFiberName(fiber.toString());
MyFiberContextSwitchInterceptor interceptor1 = new MyFiberContextSwitchInterceptor("testThreadLocalPropagationWithFiberContextSwitch.interceptor1");
fiber.addInterceptor(interceptor1);
fiber.start(tubeA, request, callback);
if (!atSuspend.tryAcquire(3, TimeUnit.MINUTES))
fail("timeout");
// ensure test thread really blocked
assertEquals(0, atEnd.availablePermits());
// thread is suspended
assertEquals(1, interceptor1.getCallCount());
assertNull(callback.response);
assertNull(callback.error);
List<TubeCall> calls = tubeA.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
TubeCall firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeB.getCalls();
assertNotNull(calls);
assertEquals(1, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
calls = tubeC.getCalls();
assertNotNull(calls);
assertEquals(0, calls.size());
checkCompleted.release();
fiber.resume(request);
if (!atEnd.tryAcquire(3, TimeUnit.MINUTES))
fail("timeout");
// Two context switches, 1) when fiber.start was done and 2) when fiber was suspended
assertEquals(2, interceptor1.getCallCount());
assertEquals(request, callback.response);
assertNull(callback.error);
calls = tubeA.getCalls();
assertNotNull(calls);
assertEquals(2, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
TubeCall secondCall = calls.get(1);
assertNotNull(secondCall);
assertEquals(TubeCallType.RESPONSE, secondCall.callType);
assertEquals(testContainer, secondCall.container);
calls = tubeB.getCalls();
assertNotNull(calls);
assertEquals(2, calls.size());
firstCall = calls.get(0);
assertNotNull(firstCall);
assertEquals(TubeCallType.REQUEST, firstCall.callType);
assertEquals(testContainer, firstCall.container);
secondCall = calls.get(1);
assertNotNull(secondCall);
assertEquals(TubeCallType.RESPONSE, secondCall.callType);
assertEquals(testContainer, secondCall.container);
calls = tubeC.getCalls();
assertNotNull(calls);
assertEquals(0, calls.size());
}
Aggregations