Skip to content

Commit 55e9878

Browse files
committed
fixing grid launching with node role and including -browser
JCommander Converters need to be in their own class file, since when running tests inside the IDE java will think they have a declared constructor even though they don't, simply because they are an inner class. created a new e2e test that mimics the real world example that everyone does Fixes #2355
1 parent e6b5507 commit 55e9878

File tree

16 files changed

+224
-46
lines changed

16 files changed

+224
-46
lines changed

.idea/libraries/jetty.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/libraries/jetty_util_9_2_13_v20150730.xml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/libraries/websocket_9_2_15_v20160210.xml

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/client/client.iml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
<orderEntry type="library" name="mockito-core-1.9.5-srcs" level="project" />
4646
<orderEntry type="library" name="objenesis-1.0" level="project" />
4747
<orderEntry type="library" name="commons-httpclient" level="project" />
48+
<orderEntry type="library" scope="TEST" name="websocket-9.2.15.v20160210" level="project" />
49+
<orderEntry type="library" scope="TEST" name="jetty-util-9.2.13.v20150730" level="project" />
4850
</component>
4951
<component name="sonarModuleSettings">
5052
<option name="alternativeWorkingDirPath" value="" />
@@ -53,4 +55,4 @@
5355
<option name="useAlternativeWorkingDir" value="false" />
5456
<option name="workingDirSelection" value="&lt;PROJECT&gt;" />
5557
</component>
56-
</module>
58+
</module>

java/server/server.iml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,12 @@
1111
<orderEntry type="inheritedJdk" />
1212
<orderEntry type="sourceFolder" forTests="false" />
1313
<orderEntry type="module" module-name="client" exported="" />
14-
<orderEntry type="library" name="bouncycastle" level="project" />
1514
<orderEntry type="library" name="commons-io" level="project" />
1615
<orderEntry type="library" name="commons-logging" level="project" />
1716
<orderEntry type="library" name="jcip-annotations" level="project" />
1817
<orderEntry type="library" name="jcommander" level="project" />
1918
<orderEntry type="library" name="jetty" level="project" />
20-
<orderEntry type="library" name="jetty-for-rc" level="project" />
2119
<orderEntry type="library" name="junit" level="project" />
22-
<orderEntry type="library" name="mx4j" level="project" />
2320
<orderEntry type="library" name="servlet-api" level="project" />
2421
<orderEntry type="library" name="snakeyaml" level="project" />
2522
<orderEntry type="library" scope="TEST" name="hamcrest" level="project" />

java/server/src/org/openqa/grid/common/RegistrationRequest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public JsonObject getAssociatedJSON() {
106106
res.addProperty("id", configuration.id);
107107
res.addProperty("name", name);
108108
res.addProperty("description", description);
109-
res.add("configuration", new Gson().toJsonTree(configuration));
109+
res.add("configuration", configuration.toJson());
110110
JsonArray caps = new JsonArray();
111111
for (DesiredCapabilities c : capabilities) {
112112
caps.add(new Gson().toJsonTree(c.asMap()));
@@ -137,9 +137,7 @@ public static RegistrationRequest getNewInstance(String json) throws JsonSyntaxE
137137
}
138138

139139
JsonObject config = o.get("configuration").getAsJsonObject();
140-
GridNodeConfiguration
141-
configuration =
142-
new Gson().fromJson(config, GridNodeConfiguration.class);
140+
GridNodeConfiguration configuration = GridNodeConfiguration.loadFromJSON(config);
143141
request.setConfiguration(configuration);
144142

145143
if (o.has("id")) {
@@ -185,6 +183,10 @@ public static RegistrationRequest build(GridNodeConfiguration configuration) {
185183
res.role = GridRole.get(configuration.role);
186184
res.addPlatformInfoToCapabilities();
187185

186+
if (configuration.browser.size() > 0) {
187+
res.capabilities = configuration.browser;
188+
}
189+
188190
for (DesiredCapabilities cap : res.capabilities) {
189191
if (cap.getCapability(SELENIUM_PROTOCOL) == null) {
190192
cap.setCapability(SELENIUM_PROTOCOL, SeleniumProtocol.WebDriver.toString());

java/server/src/org/openqa/grid/internal/utils/configuration/GridConfiguration.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.beust.jcommander.IStringConverter;
2121
import com.beust.jcommander.Parameter;
2222

23+
import org.openqa.grid.internal.utils.configuration.converters.CustomConverter;
24+
2325
import java.util.HashMap;
2426
import java.util.List;
2527
import java.util.Map;
@@ -56,19 +58,6 @@ public class GridConfiguration extends StandaloneConfiguration {
5658
description = "<String> : list of extra servlets this hub will display. Allows to present custom view of the hub for monitoring and management purposes. Specify multiple on the command line: -servlet tld.company.ServletA -servlet tld.company.ServletB. The servlet must exist in the path: /grid/admin/ServletA /grid/admin/ServletB"
5759
)
5860
public List<String> servlets;
59-
60-
private class CustomConverter implements IStringConverter<Map<String,String>> {
61-
@Override
62-
public Map<String,String> convert(String value) {
63-
Map<String,String> custom = new HashMap<>();
64-
for (String pair : value.split(",")) {
65-
String[] pieces = pair.split("=");
66-
custom.put(pieces[0], pieces[1]);
67-
}
68-
return custom;
69-
}
70-
}
71-
7261
/**
7362
* replaces this instance of configuration value with the 'other' value if it's set.
7463
* @param other

java/server/src/org/openqa/grid/internal/utils/configuration/GridNodeConfiguration.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,45 @@
1717

1818
package org.openqa.grid.internal.utils.configuration;
1919

20-
import com.beust.jcommander.IStringConverter;
20+
import com.google.gson.Gson;
21+
import com.google.gson.GsonBuilder;
22+
import com.google.gson.JsonObject;
23+
import com.google.gson.TypeAdapter;
24+
import com.google.gson.stream.JsonReader;
25+
import com.google.gson.stream.JsonWriter;
26+
2127
import com.beust.jcommander.Parameter;
2228

29+
import org.openqa.grid.common.exception.GridConfigurationException;
30+
import org.openqa.grid.internal.utils.configuration.converters.BrowserDesiredCapabilityConverter;
31+
import org.openqa.grid.internal.utils.configuration.converters.NoOpParameterSplitter;
32+
import org.openqa.selenium.remote.BeanToJsonConverter;
2333
import org.openqa.selenium.remote.DesiredCapabilities;
2434

35+
import java.io.IOException;
2536
import java.net.MalformedURLException;
2637
import java.net.URL;
38+
import java.util.HashMap;
2739
import java.util.List;
40+
import java.util.Map;
2841

2942
public class GridNodeConfiguration extends GridConfiguration {
3043

44+
// remoteHost is a generated value based on host / port specified, or read from JSON.
45+
String remoteHost;
46+
3147
@Parameter(
3248
names = "-id",
3349
description = "<String> : unique identifier for the node. Not required--by default, grid will use the url of the remoteHost"
3450
)
3551
public String id;
3652

37-
// remoteHost is a generated value based on host / port specified, or read from JSON.
38-
String remoteHost;
39-
4053
@Parameter(
4154
names = "-browser",
4255
description = "<String> : comma separated Capability values. Example: -browser browserName=firefox,platform=linux -browser browserName=chrome,platform=linux",
43-
converter = DesiredCapabilityConverter.class
56+
listConverter = BrowserDesiredCapabilityConverter.class,
57+
converter = BrowserDesiredCapabilityConverter.class,
58+
splitter = NoOpParameterSplitter.class
4459
)
4560
public List<DesiredCapabilities> browser;
4661

@@ -153,18 +168,6 @@ private void parseHubUrl() {
153168
}
154169
}
155170

156-
private class DesiredCapabilityConverter implements IStringConverter<DesiredCapabilities> {
157-
@Override
158-
public DesiredCapabilities convert(String value) {
159-
DesiredCapabilities capabilities = new DesiredCapabilities();
160-
for (String cap : value.split(",")) {
161-
String[] pieces = cap.split("=");
162-
capabilities.setCapability(pieces[0], pieces[1]);
163-
}
164-
return capabilities;
165-
}
166-
}
167-
168171
public void merge(GridNodeConfiguration other) {
169172
super.merge(other);
170173
if (other.browser != null) {
@@ -228,4 +231,44 @@ public String toString(String format) {
228231
sb.append(toString(format, "unregisterIfStillDownAfter", unregisterIfStillDownAfter));
229232
return sb.toString();
230233
}
234+
235+
/**
236+
* @param json JsonObject to load configuration from
237+
*/
238+
public static GridNodeConfiguration loadFromJSON(JsonObject json) {
239+
240+
try {
241+
GsonBuilder builder = new GsonBuilder();
242+
GridNodeConfiguration.staticAddJsonTypeAdapter(builder);
243+
return builder.create().fromJson(json, GridNodeConfiguration.class);
244+
} catch (Throwable e) {
245+
throw new GridConfigurationException("Error with the JSON of the config : " + e.getMessage(),
246+
e);
247+
}
248+
}
249+
250+
@Override
251+
protected void addJsonTypeAdapter(GsonBuilder builder) {
252+
super.addJsonTypeAdapter(builder);
253+
GridNodeConfiguration.staticAddJsonTypeAdapter(builder);
254+
}
255+
protected static void staticAddJsonTypeAdapter(GsonBuilder builder) {
256+
builder.registerTypeAdapter(DesiredCapabilities.class, new DesiredCapabilitiesAdapter().nullSafe());
257+
}
258+
259+
protected static class DesiredCapabilitiesAdapter<T> extends TypeAdapter<DesiredCapabilities> {
260+
261+
@Override
262+
public void write(JsonWriter jsonWriter, DesiredCapabilities t) throws IOException {
263+
jsonWriter.value(String.format("{\"capabilities\":%s}", new BeanToJsonConverter().convert(t.asMap())));
264+
}
265+
266+
@Override
267+
public DesiredCapabilities read(JsonReader jsonReader) throws IOException {
268+
Gson gson = new GsonBuilder().create();
269+
Map<String, Map<String, Object>> capability = new HashMap<>();
270+
capability = gson.fromJson(jsonReader.nextString(), capability.getClass());
271+
return new DesiredCapabilities(capability.get("capabilities"));
272+
}
273+
}
231274
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.openqa.grid.internal.utils.configuration.converters;
2+
3+
import com.beust.jcommander.IStringConverter;
4+
5+
import org.openqa.selenium.remote.DesiredCapabilities;
6+
7+
public class BrowserDesiredCapabilityConverter implements IStringConverter<DesiredCapabilities> {
8+
@Override
9+
public DesiredCapabilities convert(String value) {
10+
DesiredCapabilities capabilities = new DesiredCapabilities();
11+
for (String cap : value.split(",")) {
12+
String[] pieces = cap.split("=");
13+
if (pieces[0].equals("maxInstances")) {
14+
capabilities.setCapability(pieces[0], Integer.parseInt(pieces[1], 10));
15+
} else {
16+
capabilities.setCapability(pieces[0], pieces[1]);
17+
}
18+
}
19+
return capabilities;
20+
}
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openqa.grid.internal.utils.configuration.converters;
2+
3+
import com.beust.jcommander.IStringConverter;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
public class CustomConverter implements IStringConverter<Map<String,String>> {
9+
@Override
10+
public Map<String,String> convert(String value) {
11+
Map<String,String> custom = new HashMap<>();
12+
for (String pair : value.split(",")) {
13+
String[] pieces = pair.split("=");
14+
custom.put(pieces[0], pieces[1]);
15+
}
16+
return custom;
17+
}
18+
}

0 commit comments

Comments
 (0)