Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ private static void correctCapabilities(Collection<MutableCapabilities> capabili
for(MutableCapabilities caps : capabilities) {
Object maxInstances = caps.getCapability(RegistrationRequest.MAX_INSTANCES);
caps.setCapability(RegistrationRequest.MAX_INSTANCES, "1");
caps.setCapability(VideoOnCapabilityMatcher.KEY, "true");
if(maxInstances != null && !"1".equals(maxInstances)) {
log.warning("Reducing " + RegistrationRequest.MAX_INSTANCES + " for browser " + caps.getBrowserName() +
" to 1: Video node does not support concurrent sessions");
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/com/aimmac23/hub/proxy/VideoOnCapabilityMatcher.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.aimmac23.hub.proxy;

import java.util.Map;

import org.openqa.grid.internal.utils.DefaultCapabilityMatcher;

/**
* extend DefaultCapabilityMatcher and support select video node
* and make videoOn=false work(switch video off)
*
*/
public class VideoOnCapabilityMatcher extends DefaultCapabilityMatcher {

public static final String KEY="videoOn";

public static final String VIDEO_OFF_KEY ="_videoOff";

public VideoOnCapabilityMatcher() {
super();
this.addToConsider(KEY);
}

/**
* if requestedCapability( videoOn=false ) , then remove videoOn and add _videoOff=true
*/
@Override
public boolean matches(Map<String, Object> nodeCapability, Map<String, Object> requestedCapability) {
Object o = requestedCapability.get(KEY);
if( o != null && ( "false".equals(o)
|| ( o instanceof Boolean && !Boolean.TRUE.equals(o) ) ) ){
requestedCapability.remove(KEY);
requestedCapability.put(VIDEO_OFF_KEY, "true");
}
return super.matches(nodeCapability, requestedCapability);
}

}
41 changes: 34 additions & 7 deletions src/main/java/com/aimmac23/hub/proxy/VideoProxy.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.aimmac23.hub.proxy;

import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
Expand All @@ -19,24 +22,25 @@
import org.openqa.grid.web.servlet.handler.RequestType;
import org.openqa.grid.web.servlet.handler.SeleniumBasedRequest;
import org.openqa.selenium.remote.internal.HttpClientFactory;
import org.openqa.selenium.remote.server.jmx.ManagedService;

import com.aimmac23.hub.HubVideoRegistry;

@ManagedService(description = "Selenium Grid Hub Video-Capable TestSlot")
public class VideoProxy extends DefaultRemoteProxy {

private static final Logger log = Logger.getLogger(VideoProxy.class.getName());

private String serviceUrl;
boolean isCurrentlyRecording = false;
private HttpClient client;

private HttpHost remoteHost;

public VideoProxy(RegistrationRequest request, GridRegistry registry) {
super(RegistrationRequestCorrector.correctRegistrationRequest(request), registry);

serviceUrl = getRemoteHost() + "/extra/VideoRecordingControlServlet";

remoteHost = new HttpHost(getRemoteHost().getHost(),
getRemoteHost().getPort());
HttpClientFactory httpClientFactory = new HttpClientFactory();
client = httpClientFactory.getHttpClient();

Expand Down Expand Up @@ -68,11 +72,14 @@ public VideoProxy(RegistrationRequest request, GridRegistry registry) {
@Override
public void beforeSession(TestSession arg0) {
super.beforeSession(arg0);

final boolean disabled = isVideoOff(arg0);
if(disabled){
return;
}
HttpPost r = new HttpPost(serviceUrl + "?command=start");

try {
HttpResponse response = client.execute(r);
HttpResponse response = client.execute(remoteHost, r);
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
log.warning("Could not start video reporting: " + EntityUtils.toString(response.getEntity()));
return;
Expand All @@ -91,11 +98,28 @@ public void beforeSession(TestSession arg0) {
r.releaseConnection();
}
}

private boolean isVideoOff(TestSession testSession) {
Map<String, Object> requestedCapabilities = testSession.getRequestedCapabilities();
final Object videoDisabled = requestedCapabilities.get("_videoOff");
boolean disabled ;
if( videoDisabled == null || StringUtils.isBlank(videoDisabled.toString())){
disabled = Boolean.getBoolean("seleniumVideoDefaultOff");
}else{
disabled = videoDisabled instanceof Boolean ? Boolean.TRUE.equals(videoDisabled)
: "true".equals(videoDisabled.toString());
}
return disabled;
}

@Override
public void beforeCommand(TestSession session, HttpServletRequest request,
HttpServletResponse response) {
super.beforeCommand(session, request, response);
final boolean disabled = isVideoOff(session);
if(disabled){
return;
}

SeleniumBasedRequest seleniumRequest = SeleniumBasedRequest.createFromRequest(request, getRegistry());

Expand All @@ -115,7 +139,10 @@ public void beforeCommand(TestSession session, HttpServletRequest request,
public void afterCommand(TestSession session, HttpServletRequest request,
HttpServletResponse response) {
super.afterCommand(session, request, response);

final boolean disabled = isVideoOff(session);
if(disabled){
return;
}
// its a shame we have to extract this again
SeleniumBasedRequest seleniumRequest = SeleniumBasedRequest.createFromRequest(request, getRegistry());

Expand Down Expand Up @@ -149,7 +176,7 @@ void stopRecording(TestSession session) {
HttpPost r = new HttpPost(serviceUrl + "?command=stop");

try {
HttpResponse response = client.execute(r);
HttpResponse response = client.execute(remoteHost, r);
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
log.warning("Could not stop video reporting: " + EntityUtils.toString(response.getEntity()));
}
Expand Down