Skip to content

Commit 68dcfac

Browse files
committed
Add more unit tests
1 parent 3303c41 commit 68dcfac

File tree

7 files changed

+173
-15
lines changed

7 files changed

+173
-15
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,8 @@ upgrade-protocol-definition: build-cdtp-definition-builder clean-previous-protoc
4343

4444
update-protocol-definition: upgrade-protocol-definition compile-cdtp-java-client
4545
# Updated protocol definition on cdtp-java-client
46+
47+
sonar-analysis:
48+
# Running sonar analysis
49+
cd $(DEFINITION_BUILDER_DIR)/ && make sonar-analysis
50+
cd $(JAVA_CLIENT_DIR)/ && make sonar-analysis

cdtp-definition-builder/Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
MVN=mvn
3+
4+
SONAR_HOST=http://localhost:9999
5+
6+
sonar-analysis:
7+
# Running sonar analysis
8+
$(MVN) clean test && $(MVN) sonar:sonar -Dsonar.host.url=$(SONAR_HOST) \
9+
-Dsonar.tests="src/test"

cdtp-java-client/src/main/java/com/github/kklisura/cdtp/services/ChromeDevToolsService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ public interface ChromeDevToolsService extends ChromeDevTools, AutoCloseable {
3535
* @param domainName Domain.
3636
* @param eventName Event.
3737
* @param eventHandler Event handler.
38+
* @param eventType Event type.
3839
* @return Event listener.
3940
*/
40-
EventListener addEventListener(String domainName, String eventName, EventHandler eventHandler);
41+
EventListener addEventListener(String domainName, String eventName, EventHandler eventHandler, Class<?> eventType);
4142

4243
/**
4344
* Removes an event listener.

cdtp-java-client/src/main/java/com/github/kklisura/cdtp/services/impl/ChromeDevToolsServiceImpl.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.github.kklisura.cdtp.services.types.MethodInvocation;
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
17-
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
1817

1918
import java.io.IOException;
2019
import java.lang.reflect.InvocationHandler;
@@ -159,12 +158,11 @@ public void close() {
159158
}
160159

161160
@Override
162-
public EventListener addEventListener(String domainName, String eventName, EventHandler eventHandler) {
161+
public EventListener addEventListener(String domainName, String eventName, EventHandler eventHandler,
162+
Class<?> eventType) {
163163
String name = domainName + "." + eventName;
164164

165-
Class<?> eventHandlerType = getEventHandlerType(eventHandler);
166-
167-
EventListenerImpl eventListener = new EventListenerImpl(name, eventHandler, eventHandlerType, this);
165+
EventListenerImpl eventListener = new EventListenerImpl(name, eventHandler, eventType, this);
168166
eventNameToHandlersMap.computeIfAbsent(name, this::createEventHandlerSet).add(eventListener);
169167

170168
return eventListener;
@@ -267,11 +265,6 @@ private Set<EventListenerImpl> createEventHandlerSet(String unused) {
267265
return Collections.synchronizedSet(new HashSet<>());
268266
}
269267

270-
private static Class<?> getEventHandlerType(EventHandler<?> eventHandler) {
271-
return (Class<?>) ((ParameterizedTypeImpl) eventHandler.getClass().getGenericInterfaces()[0])
272-
.getActualTypeArguments()[0];
273-
}
274-
275268
/**
276269
* Error object returned from dev tools.
277270
*/

cdtp-java-client/src/main/java/com/github/kklisura/cdtp/services/invocation/CommandInvocationHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.lang.reflect.InvocationHandler;
1212
import java.lang.reflect.Method;
1313
import java.lang.reflect.Parameter;
14+
import java.lang.reflect.ParameterizedType;
1415
import java.util.HashMap;
1516
import java.util.Map;
1617
import java.util.concurrent.atomic.AtomicLong;
@@ -42,7 +43,9 @@ public Object invoke(Object unused, Method method, Object[] args) throws Throwab
4243
String domainName = method.getDeclaringClass().getSimpleName();
4344
String eventName = getEventName(method);
4445

45-
return chromeDevToolsService.addEventListener(domainName, eventName, (EventHandler) args[0]);
46+
Class<?> eventHandlerType = getEventHandlerType(method);
47+
return chromeDevToolsService.addEventListener(domainName, eventName, (EventHandler) args[0],
48+
eventHandlerType);
4649
}
4750

4851
Class<?> returnType = method.getReturnType();
@@ -106,6 +109,10 @@ private static String getEventName(Method method) {
106109
return method.getAnnotation(EventName.class).value();
107110
}
108111

112+
private static Class<?> getEventHandlerType(Method method) {
113+
return (Class<?>) ((ParameterizedType) method.getGenericParameterTypes()[0]).getActualTypeArguments()[0];
114+
}
115+
109116
/**
110117
* Checks if given method has signature of event subscription.
111118
*

cdtp-java-client/src/test/java/com/github/kklisura/cdtp/services/impl/ChromeDevToolsServiceImplTest.java

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.github.kklisura.cdtp.services.impl;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.github.kklisura.cdtp.protocol.support.types.EventHandler;
5+
import com.github.kklisura.cdtp.protocol.support.types.EventListener;
46
import com.github.kklisura.cdtp.services.WebSocketService;
57
import com.github.kklisura.cdtp.services.exceptions.ChromeDevToolsInvocationException;
68
import com.github.kklisura.cdtp.services.exceptions.WebSocketServiceException;
79
import com.github.kklisura.cdtp.services.types.ChromeTab;
10+
import com.github.kklisura.cdtp.services.types.EventListenerImpl;
811
import com.github.kklisura.cdtp.services.types.MethodInvocation;
912
import com.github.kklisura.cdtp.services.utils.ProxyUtils;
1013
import org.easymock.Capture;
@@ -352,6 +355,123 @@ public void testClose() {
352355
verify(chromeService);
353356
}
354357

358+
@Test
359+
public void testAddEventListener() {
360+
EventHandler<String> eventHandler = event -> {};
361+
362+
EventListener eventListener = service.addEventListener("domain", "event", eventHandler,
363+
String.class);
364+
assertNotNull(eventListener);
365+
366+
assertEquals(eventHandler, ((EventListenerImpl) eventListener).getHandler());
367+
assertEquals("domain.event", ((EventListenerImpl) eventListener).getKey());
368+
assertEquals(String.class, ((EventListenerImpl) eventListener).getParamType());
369+
370+
service.removeEventListener(eventListener);
371+
}
372+
373+
@Test
374+
public void testEventReceivedWithOff() throws InterruptedException {
375+
// Non existing event handler
376+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
377+
378+
Capture<TestMessage> testMessageCapture = Capture.newInstance();
379+
380+
EventHandler<TestMessage> eventHandler = testMessageCapture::setValue;
381+
382+
EventListener eventListener = service.addEventListener("Domain", "name", eventHandler, TestMessage.class);
383+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
384+
385+
assertNotNull(testMessageCapture.getValue());
386+
assertEquals("testValue", testMessageCapture.getValue().getTestProperty());
387+
388+
testMessageCapture.reset();
389+
390+
eventListener.off();
391+
392+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
393+
394+
assertFalse(testMessageCapture.hasCaptured());
395+
}
396+
397+
@Test
398+
public void testEventReceivedWithUnsubscribe() throws InterruptedException {
399+
// Non existing event handler
400+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
401+
402+
Capture<TestMessage> testMessageCapture = Capture.newInstance();
403+
404+
EventHandler<TestMessage> eventHandler = testMessageCapture::setValue;
405+
406+
EventListener eventListener = service.addEventListener("Domain", "name", eventHandler, TestMessage.class);
407+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
408+
409+
assertNotNull(testMessageCapture.getValue());
410+
assertEquals("testValue", testMessageCapture.getValue().getTestProperty());
411+
412+
testMessageCapture.reset();
413+
414+
eventListener.unsubscribe();
415+
416+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
417+
418+
assertFalse(testMessageCapture.hasCaptured());
419+
}
420+
421+
@Test
422+
public void testEventReceivedWithUnsubscribeOnService() throws InterruptedException {
423+
// Non existing event handler
424+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
425+
426+
Capture<TestMessage> testMessageCapture = Capture.newInstance();
427+
428+
EventHandler<TestMessage> eventHandler = testMessageCapture::setValue;
429+
430+
EventListener eventListener = service.addEventListener("Domain", "name", eventHandler, TestMessage.class);
431+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
432+
433+
assertNotNull(testMessageCapture.getValue());
434+
assertEquals("testValue", testMessageCapture.getValue().getTestProperty());
435+
436+
service.removeEventListener(eventListener);
437+
438+
testMessageCapture.reset();
439+
440+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
441+
442+
assertFalse(testMessageCapture.hasCaptured());
443+
}
444+
445+
@Test
446+
public void testEventReceivedHandlerThrowsExeption() throws InterruptedException {
447+
// Non existing event handler
448+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
449+
450+
Capture<TestMessage> testMessageCapture = Capture.newInstance();
451+
452+
EventHandler<TestMessage> eventHandlerThrowsException = event -> {
453+
throw new RuntimeException("test");
454+
};
455+
EventHandler<TestMessage> eventHandler = testMessageCapture::setValue;
456+
457+
EventListener eventListenerWithException = service.addEventListener("Domain", "name", eventHandlerThrowsException, TestMessage.class);
458+
EventListener eventListener = service.addEventListener("Domain", "name", eventHandler, TestMessage.class);
459+
460+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
461+
462+
assertNotNull(testMessageCapture.getValue());
463+
assertEquals("testValue", testMessageCapture.getValue().getTestProperty());
464+
465+
service.removeEventListener(eventListenerWithException);
466+
467+
testMessageCapture.reset();
468+
469+
service.accept("{\"method\":\"Domain.name\",\"params\":{\"testProperty\":\"testValue\"}}");
470+
471+
assertNotNull(testMessageCapture.getValue());
472+
assertEquals("testValue", testMessageCapture.getValue().getTestProperty());
473+
}
474+
355475
private void resolveMessage(String message) {
356476
new Thread(() -> {
357477
try {

cdtp-java-client/src/test/java/com/github/kklisura/cdtp/services/invocation/CommandInvocationHandlerTest.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.kklisura.cdtp.services.invocation;
22

3+
import com.github.kklisura.cdtp.protocol.support.annotations.EventName;
34
import com.github.kklisura.cdtp.protocol.support.annotations.ParamName;
45
import com.github.kklisura.cdtp.protocol.support.annotations.Returns;
56
import com.github.kklisura.cdtp.protocol.support.types.EventHandler;
@@ -129,7 +130,25 @@ public void testIsEventSubscription() {
129130
assertFalse(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod")));
130131
assertFalse(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod1")));
131132
assertFalse(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod2")));
132-
assertTrue(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod3")));
133+
assertFalse(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod3")));
134+
assertTrue(CommandInvocationHandler.isEventSubscription(getMethodByName("onEventListenerTestMethod4")));
135+
}
136+
137+
@Test
138+
public void testInvokeWithEvent() throws Throwable {
139+
EventHandler<String> eventHandler = event -> {};
140+
EventListener eventListener = mock(EventListener.class);
141+
142+
expect(chromeDevToolsService.addEventListener("CommandInvocationHandlerTest",
143+
"someEventName", eventHandler, String.class))
144+
.andReturn(eventListener);
145+
146+
replayAll();
147+
148+
assertEquals(eventListener, invocationHandler.invoke(null,
149+
getMethodByName("onEventListenerTestMethod4"), new Object[] { eventHandler }));
150+
151+
verifyAll();
133152
}
134153

135154
private Method getMethodByName(String name) {
@@ -150,11 +169,15 @@ private EventListener onEventListenerTestMethod1() {
150169
return null;
151170
}
152171

153-
private EventListener onEventListenerTestMethod2(String param, String param2) {
172+
173+
private void onEventListenerTestMethod2(String param, String param2) {}
174+
175+
private EventListener onEventListenerTestMethod3(String param, String param2) {
154176
return null;
155177
}
156178

157-
private EventListener onEventListenerTestMethod3(EventHandler<String> handler) {
179+
@EventName("someEventName")
180+
private EventListener onEventListenerTestMethod4(EventHandler<String> handler) {
158181
return null;
159182
}
160183

0 commit comments

Comments
 (0)