Skip to content

Commit b3db1d6

Browse files
authored
Implement getAttributes() method of MBean, and update Number-based MBean attributes to return Number objects instead of Strings (#14153)
1 parent e4d3db3 commit b3db1d6

File tree

2 files changed

+86
-27
lines changed

2 files changed

+86
-27
lines changed

java/src/org/openqa/selenium/grid/jmx/MBean.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ public Object getAttribute(String attribute) {
221221
return ((Map<?, ?>) res)
222222
.entrySet().stream()
223223
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString()));
224+
} else if (res instanceof Number) {
225+
return res;
224226
} else {
225227
return res.toString();
226228
}
@@ -241,7 +243,17 @@ public void setAttribute(Attribute attribute) {
241243

242244
@Override
243245
public AttributeList getAttributes(String[] attributes) {
244-
return null;
246+
AttributeList resultList = new AttributeList();
247+
248+
// if attributeNames is empty, return an empty result list
249+
if (attributes == null || attributes.length == 0) return resultList;
250+
251+
for (int i = 0; i < attributes.length; i++) {
252+
Object value = getAttribute(attributes[i]);
253+
resultList.add(new Attribute(attributes[i], value));
254+
}
255+
256+
return resultList;
245257
}
246258

247259
@Override

java/test/org/openqa/selenium/grid/router/JmxTest.java

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.time.Duration;
2828
import java.time.Instant;
2929
import java.util.logging.Logger;
30+
import javax.management.AttributeList;
3031
import javax.management.AttributeNotFoundException;
3132
import javax.management.InstanceNotFoundException;
3233
import javax.management.IntrospectionException;
@@ -85,6 +86,9 @@ void shouldBeAbleToRegisterBaseServerConfig() {
8586
MBeanAttributeInfo[] attributeInfoArray = info.getAttributes();
8687
assertThat(attributeInfoArray).hasSize(3);
8788

89+
AttributeList attributeList = getAttributeList(name, attributeInfoArray);
90+
assertThat(attributeList).isNotNull().hasSize(3);
91+
8892
String uriValue = (String) beanServer.getAttribute(name, "Uri");
8993
assertThat(uriValue).isEqualTo(baseServerOptions.getExternalUri().toString());
9094

@@ -130,23 +134,26 @@ id, nodeUri, new ImmutableCapabilities(), caps, Instant.now())))
130134
MBeanAttributeInfo[] attributeInfo = info.getAttributes();
131135
assertThat(attributeInfo).hasSize(9);
132136

133-
String currentSessions = (String) beanServer.getAttribute(name, "CurrentSessions");
134-
assertThat(Integer.parseInt(currentSessions)).isZero();
137+
AttributeList attributeList = getAttributeList(name, attributeInfo);
138+
assertThat(attributeList).isNotNull().hasSize(9);
139+
140+
Object currentSessions = beanServer.getAttribute(name, "CurrentSessions");
141+
assertNumberAttribute(currentSessions, 0);
135142

136-
String maxSessions = (String) beanServer.getAttribute(name, "MaxSessions");
137-
assertThat(Integer.parseInt(maxSessions)).isEqualTo(1);
143+
Object maxSessions = beanServer.getAttribute(name, "MaxSessions");
144+
assertNumberAttribute(maxSessions, 1);
138145

139146
String status = (String) beanServer.getAttribute(name, "Status");
140147
assertThat(status).isEqualTo("UP");
141148

142-
String totalSlots = (String) beanServer.getAttribute(name, "TotalSlots");
143-
assertThat(Integer.parseInt(totalSlots)).isEqualTo(1);
149+
Object totalSlots = beanServer.getAttribute(name, "TotalSlots");
150+
assertNumberAttribute(totalSlots, 1);
144151

145-
String usedSlots = (String) beanServer.getAttribute(name, "UsedSlots");
146-
assertThat(Integer.parseInt(usedSlots)).isZero();
152+
Object usedSlots = beanServer.getAttribute(name, "UsedSlots");
153+
assertNumberAttribute(usedSlots, 0);
147154

148-
String load = (String) beanServer.getAttribute(name, "Load");
149-
assertThat(Float.parseFloat(load)).isEqualTo(0.0f);
155+
Object load = beanServer.getAttribute(name, "Load");
156+
assertNumberAttribute(load, 0.0f);
150157

151158
String remoteNodeUri = (String) beanServer.getAttribute(name, "RemoteNodeUri");
152159
assertThat(remoteNodeUri).isEqualTo(nodeUri.toString());
@@ -182,13 +189,14 @@ void shouldBeAbleToRegisterSessionQueueServerConfig() {
182189
MBeanAttributeInfo[] attributeInfoArray = info.getAttributes();
183190
assertThat(attributeInfoArray).hasSize(2);
184191

185-
String requestTimeout = (String) beanServer.getAttribute(name, "RequestTimeoutSeconds");
186-
assertThat(Long.parseLong(requestTimeout))
187-
.isEqualTo(newSessionQueueOptions.getRequestTimeoutSeconds());
192+
AttributeList attributeList = getAttributeList(name, attributeInfoArray);
193+
assertThat(attributeList).isNotNull().hasSize(2);
194+
195+
Object requestTimeout = beanServer.getAttribute(name, "RequestTimeoutSeconds");
196+
assertNumberAttribute(requestTimeout, newSessionQueueOptions.getRequestTimeoutSeconds());
188197

189-
String retryInterval = (String) beanServer.getAttribute(name, "RetryIntervalMilliseconds");
190-
assertThat(Long.parseLong(retryInterval))
191-
.isEqualTo(newSessionQueueOptions.getRetryIntervalMilliseconds());
198+
Object retryInterval = beanServer.getAttribute(name, "RetryIntervalMilliseconds");
199+
assertNumberAttribute(retryInterval, newSessionQueueOptions.getRetryIntervalMilliseconds());
192200
} catch (InstanceNotFoundException
193201
| IntrospectionException
194202
| ReflectionException
@@ -227,8 +235,11 @@ void shouldBeAbleToRegisterSessionQueue() {
227235
MBeanAttributeInfo[] attributeInfoArray = info.getAttributes();
228236
assertThat(attributeInfoArray).hasSize(1);
229237

230-
String size = (String) beanServer.getAttribute(name, "NewSessionQueueSize");
231-
assertThat(Integer.parseInt(size)).isZero();
238+
AttributeList attributeList = getAttributeList(name, attributeInfoArray);
239+
assertThat(attributeList).isNotNull().hasSize(1);
240+
241+
Object size = beanServer.getAttribute(name, "NewSessionQueueSize");
242+
assertNumberAttribute(size, 0);
232243
} catch (InstanceNotFoundException
233244
| IntrospectionException
234245
| ReflectionException
@@ -290,21 +301,57 @@ void shouldBeAbleToMonitorHub() throws Exception {
290301
MBeanInfo info = beanServer.getMBeanInfo(name);
291302
assertThat(info).isNotNull();
292303

293-
String nodeUpCount = (String) beanServer.getAttribute(name, "NodeUpCount");
304+
MBeanAttributeInfo[] attributeInfoArray = info.getAttributes();
305+
assertThat(attributeInfoArray).hasSize(4);
306+
307+
AttributeList attributeList = getAttributeList(name, attributeInfoArray);
308+
assertThat(attributeList).isNotNull().hasSize(4);
309+
310+
Object nodeUpCount = beanServer.getAttribute(name, "NodeUpCount");
294311
LOG.info("Node up count=" + nodeUpCount);
295-
assertThat(Integer.parseInt(nodeUpCount)).isEqualTo(1);
312+
assertNumberAttribute(nodeUpCount, 1);
296313

297-
String nodeDownCount = (String) beanServer.getAttribute(name, "NodeDownCount");
314+
Object nodeDownCount = beanServer.getAttribute(name, "NodeDownCount");
298315
LOG.info("Node down count=" + nodeDownCount);
299-
assertThat(Integer.parseInt(nodeDownCount)).isZero();
316+
assertNumberAttribute(nodeDownCount, 0);
300317

301-
String activeSlots = (String) beanServer.getAttribute(name, "ActiveSlots");
318+
Object activeSlots = beanServer.getAttribute(name, "ActiveSlots");
302319
LOG.info("Active slots count=" + activeSlots);
303-
assertThat(Integer.parseInt(activeSlots)).isZero();
320+
assertNumberAttribute(activeSlots, 0);
304321

305-
String idleSlots = (String) beanServer.getAttribute(name, "IdleSlots");
322+
Object idleSlots = beanServer.getAttribute(name, "IdleSlots");
306323
LOG.info("Idle slots count=" + idleSlots);
307-
assertThat(Integer.parseInt(idleSlots)).isEqualTo(1);
324+
assertNumberAttribute(idleSlots, 1);
325+
}
326+
}
327+
328+
private AttributeList getAttributeList(ObjectName name, MBeanAttributeInfo[] attributeInfoArray)
329+
throws InstanceNotFoundException, ReflectionException {
330+
String[] attributeNames = new String[attributeInfoArray.length];
331+
for (int i = 0; i < attributeInfoArray.length; i++) {
332+
attributeNames[i] = attributeInfoArray[i].getName();
308333
}
334+
335+
return beanServer.getAttributes(name, attributeNames);
336+
}
337+
338+
private void assertCommonNumberAttributes(Object attribute) {
339+
assertThat(attribute).isNotNull();
340+
assertThat(attribute).isInstanceOf(Number.class);
341+
}
342+
343+
private void assertNumberAttribute(Object attribute, int expectedValue) {
344+
assertCommonNumberAttributes(attribute);
345+
assertThat(Integer.parseInt(attribute.toString())).isEqualTo(expectedValue);
346+
}
347+
348+
private void assertNumberAttribute(Object attribute, long expectedValue) {
349+
assertCommonNumberAttributes(attribute);
350+
assertThat(Long.parseLong(attribute.toString())).isEqualTo(expectedValue);
351+
}
352+
353+
private void assertNumberAttribute(Object attribute, float expectedValue) {
354+
assertCommonNumberAttributes(attribute);
355+
assertThat(Float.parseFloat(attribute.toString())).isEqualTo(expectedValue);
309356
}
310357
}

0 commit comments

Comments
 (0)