test/jdk/javax/management/remote/rest/RestAdapterTest.java
author hb
Thu, 04 Jan 2018 14:39:04 +0530
branchjmx-rest-api
changeset 56006 352a4f213fc6
parent 56003 4f7f76f6be2f
child 56026 bd531f08d7c7
permissions -rw-r--r--
1. URL decoding of URL 2. MBean info availble in MBeanCollection page 3. MBeanCollection post supports objectname filtering 4. Tests now use reflection instead of Methodhndles 3. couple of bug fixes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     1
import com.oracle.jmx.remote.rest.http.HttpResponse;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     2
import com.oracle.jmx.remote.rest.http.HttpUtil;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     3
import com.oracle.jmx.remote.rest.json.JSONArray;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     4
import com.oracle.jmx.remote.rest.json.JSONElement;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     5
import com.oracle.jmx.remote.rest.json.JSONObject;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     6
import com.oracle.jmx.remote.rest.json.JSONPrimitive;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     7
import com.oracle.jmx.remote.rest.json.parser.JSONParser;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     8
import com.oracle.jmx.remote.rest.mapper.JSONMapper;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
     9
import com.oracle.jmx.remote.rest.mapper.JSONMappingFactory;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    10
import org.testng.Assert;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    11
import org.testng.annotations.AfterClass;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    12
import org.testng.annotations.BeforeClass;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    13
import org.testng.annotations.DataProvider;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    14
import org.testng.annotations.Test;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    15
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    16
import javax.management.*;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    17
import javax.management.remote.*;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    18
import javax.management.remote.rest.PlatformRestAdapter;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    19
import java.io.*;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    20
import java.lang.management.ManagementFactory;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    21
import java.net.HttpURLConnection;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    22
import java.net.URL;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    23
import java.util.*;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    24
import java.util.stream.Collectors;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    25
import java.util.stream.Stream;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    26
56003
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    27
 /* @test
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    28
 * @summary Unit tests for Rest adapter
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    29
 * @library /test/lib
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    30
 * @modules java.management.rest/com.oracle.jmx.remote.rest.http
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    31
 *          java.management.rest/com.oracle.jmx.remote.rest.json
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    32
 *          java.management.rest/com.oracle.jmx.remote.rest.json.parser
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    33
 *          java.management.rest/com.oracle.jmx.remote.rest.mapper
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    34
 * @build RestAdapterTest
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    35
 * @run testng/othervm  RestAdapterTest
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    36
 */
4f7f76f6be2f * Start Rest adapter via command line arguments
hb
parents: 56002
diff changeset
    37
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    38
@Test
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    39
public class RestAdapterTest {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    40
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    41
    private JMXConnectorServer cs;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    42
    private String restUrl = "";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    43
    JMXConnector connector;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    44
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    45
    @BeforeClass
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    46
    public void setupServers() throws IOException {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    47
        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    48
        JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    49
        cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, platformMBeanServer);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    50
        cs.start();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    51
        JMXServiceURL addr = cs.getAddress();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    52
        connector = JMXConnectorFactory.connect(addr, null);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    53
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    54
        String testSrcRoot = System.getProperty("test.src") + File.separator;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    55
        String configFile = testSrcRoot + "mgmt.properties";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    56
        File f = new File(configFile);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    57
        Properties properties = null;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    58
        if (f.exists()) {
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    59
            properties = new Properties();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    60
            properties.load(new FileInputStream(f));
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    61
        }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    62
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    63
        PlatformRestAdapter.init(properties);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    64
        restUrl = PlatformRestAdapter.getBaseURL();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    65
    }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    66
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    67
    @AfterClass
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    68
    public void tearDownServers() throws IOException {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    69
        connector.close();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    70
        cs.stop();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    71
        PlatformRestAdapter.stop();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    72
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    73
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    74
    private Set<String> rmiGetAllMBeans() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    75
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    76
            MBeanServerConnection mBeanServer = connector.getMBeanServerConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    77
            Set<ObjectInstance> objectInstances = mBeanServer.queryMBeans(null, null);
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
    78
            return objectInstances.stream().map(a -> a.getObjectName().getCanonicalName()).collect(Collectors.toSet());
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    79
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    80
            throw new RuntimeException(ex);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    81
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    82
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    83
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    84
    private Map<String, Object> rmiGetAttributes(String name) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    85
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    86
            MBeanServerConnection mBeanServer = connector.getMBeanServerConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    87
            ObjectName objectName = new ObjectName(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    88
            MBeanInfo mInfo = mBeanServer.getMBeanInfo(objectName);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    89
            String[] attrs = Stream.of(mInfo.getAttributes())
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    90
                    .map(MBeanAttributeInfo::getName)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    91
                    .toArray(String[]::new);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    92
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    93
            Map<String, Object> result = new LinkedHashMap<>();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    94
            AttributeList attrVals = mBeanServer.getAttributes(objectName, attrs);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    95
            List<String> missingAttrs = new ArrayList<>(Arrays.asList(attrs));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    96
            attrVals.asList().forEach(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    97
                missingAttrs.remove(a.getName());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    98
                result.put(a.getName(), a.getValue());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
    99
            });
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   100
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   101
            for (String attr : missingAttrs) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   102
                try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   103
                    mBeanServer.getAttribute(objectName, attr);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   104
                    result.put(attr, "< Error: No such attribute >");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   105
                } catch (RuntimeException ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   106
                    if (ex.getCause() instanceof UnsupportedOperationException) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   107
                        result.put(attr, "< Attribute not supported >");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   108
                    } else if (ex.getCause() instanceof IllegalArgumentException) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   109
                        result.put(attr, "< Invalid attributes >");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   110
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   111
                } catch (AttributeNotFoundException e) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   112
                    result.put(attr, "< Attribute not found >");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   113
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   114
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   115
            return result;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   116
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   117
            throw new RuntimeException(ex);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   118
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   119
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   120
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   121
    private Set<String> rmiGetOperations(String name) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   122
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   123
            MBeanServerConnection mBeanServer = connector.getMBeanServerConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   124
            ObjectName objectName = new ObjectName(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   125
            MBeanOperationInfo[] operationInfos = mBeanServer.getMBeanInfo(objectName).getOperations();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   126
            Set<String> rmiOps = Stream.of(operationInfos)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   127
                    .map(MBeanFeatureInfo::getName).collect(Collectors.toSet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   128
            return rmiOps;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   129
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   130
            throw new RuntimeException(ex);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   131
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   132
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   133
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   134
    private Set<String> restGetAllMBeans() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   135
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   136
            String url = restUrl + "/platform/mbeans";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   137
            Set<String> mbeanNames = new HashSet<>();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   138
            do {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   139
                HttpResponse httpResponse = executeHttpRequest(url);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   140
                if (httpResponse.getCode() != 200)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   141
                    throw new RuntimeException(httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   142
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   143
                String firstPage = httpResponse.getBody();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   144
                JSONParser parser = new JSONParser(firstPage);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   145
                JSONObject root = (JSONObject) parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   146
                JSONArray mbeansNode = (JSONArray) root.get("mbeans");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   147
                for (JSONElement je : mbeansNode) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   148
                    JSONObject jobj = (JSONObject) je;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   149
                    JSONPrimitive jp = (JSONPrimitive) jobj.get("name");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   150
                    String name = (String) jp.getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   151
                    mbeanNames.add(name);
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   152
                    JSONPrimitive jhref = (JSONPrimitive) jobj.get("href");
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   153
                    String href = (String) jhref.getValue();
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   154
                    verifyHttpResponse(executeHttpRequest(href));
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   155
                    JSONPrimitive jinfo = (JSONPrimitive) jobj.get("info");
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   156
                    String info = (String) jinfo.getValue();
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   157
                    verifyHttpResponse(executeHttpRequest(info));
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   158
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   159
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   160
                JSONObject linkObj = (JSONObject) root.get("_links");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   161
                if (linkObj == null) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   162
                    break;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   163
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   164
                if (linkObj.get("next") == null)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   165
                    break;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   166
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   167
                JSONPrimitive element = (JSONPrimitive) linkObj.get("next");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   168
                String nextUrl = (String) element.getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   169
                if (nextUrl.equalsIgnoreCase(url)) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   170
                    break;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   171
                } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   172
                    url = nextUrl;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   173
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   174
            } while (true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   175
            return mbeanNames;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   176
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   177
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   178
        }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   179
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   180
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   181
    private JSONObject restGetAttributes(String name) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   182
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   183
            String url = "/platform/mbeans/" + name;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   184
            HttpResponse httpResponse = executeHttpRequest(url);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   185
            if (httpResponse.getCode() == 200) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   186
                JSONParser parser = new JSONParser(httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   187
                JSONElement root = parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   188
                JSONElement element = ((JSONObject) root).get("attributes");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   189
                if (element != null && element instanceof JSONObject)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   190
                    return (JSONObject) element;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   191
                else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   192
                    return new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   193
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   194
            } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   195
                throw new RuntimeException("HTTP GET for [" + url + "] failed, response = " + httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   196
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   197
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   198
            throw new RuntimeException(ex);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   199
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   200
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   201
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   202
    private JSONArray restGetOperations(String name) {
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   203
        try {
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   204
            String url = "/platform/mbeans/" + name;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   205
            HttpResponse httpResponse = executeHttpRequest(url);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   206
            if (httpResponse.getCode() == 200) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   207
                JSONParser parser = new JSONParser(httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   208
                JSONElement root = parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   209
                JSONElement element = ((JSONObject) root).get("operations");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   210
                if (element != null && element instanceof JSONArray)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   211
                    return (JSONArray) element;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   212
                else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   213
                    return new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   214
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   215
            } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   216
                throw new RuntimeException("HTTP GET for [" + url + "] failed, response = " + httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   217
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   218
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   219
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   220
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   221
    }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   222
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   223
    private HttpResponse executeHttpRequest(String inputUrl) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   224
        return executeHttpRequest(inputUrl, "", false);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   225
    }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   226
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   227
    private HttpResponse executeHttpRequest(String inputUrl, String body, boolean isPost) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   228
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   229
            if (inputUrl != null && !inputUrl.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   230
                URL url;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   231
                if (!inputUrl.startsWith("http")) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   232
                    url = new URL(HttpUtil.escapeUrl(restUrl + inputUrl));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   233
                } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   234
                    url = new URL(inputUrl);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   235
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   236
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   237
                con.setRequestProperty("Content-Type", "application/json;");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   238
                String userCredentials = "username1:password1";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   239
                String basicAuth = "Basic " + Base64.getEncoder().encodeToString(userCredentials.getBytes());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   240
                con.setRequestProperty("Authorization", basicAuth);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   241
                if (isPost) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   242
                    con.setDoOutput(true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   243
                    con.setRequestMethod("POST");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   244
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   245
                    try (OutputStreamWriter out = new OutputStreamWriter(
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   246
                            con.getOutputStream())) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   247
                        out.write(body);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   248
                        out.flush();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   249
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   250
                } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   251
                    con.setDoOutput(false);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   252
                }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   253
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   254
                try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   255
                    int status = con.getResponseCode();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   256
                    StringBuilder sbuf;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   257
                    if (status == 200) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   258
                        try (BufferedReader br = new BufferedReader(
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   259
                                new InputStreamReader(con.getInputStream()))) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   260
                            sbuf = new StringBuilder();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   261
                            String input;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   262
                            while ((input = br.readLine()) != null) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   263
                                sbuf.append(input);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   264
                            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   265
                        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   266
                    } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   267
                        try (BufferedReader br = new BufferedReader(
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   268
                                new InputStreamReader(con.getErrorStream()))) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   269
                            sbuf = new StringBuilder();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   270
                            String input;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   271
                            while ((input = br.readLine()) != null) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   272
                                sbuf.append(input);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   273
                            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   274
                        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   275
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   276
                    return new HttpResponse(status, sbuf.toString());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   277
                } catch (IOException e) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   278
                    e.printStackTrace();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   279
                }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   280
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   281
        } catch (Exception ex) {
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   282
            throw new RuntimeException(ex);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   283
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   284
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   285
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   286
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   287
    private void verifyHttpResponse(HttpResponse httpResponse) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   288
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   289
            Assert.assertEquals(httpResponse.getCode(), 200);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   290
            JSONParser parser = new JSONParser(httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   291
            parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   292
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   293
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   294
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   295
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   296
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   297
    private JSONObject restGetMBeanOperationsBulkOp(String name) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   298
        JSONArray jsonArray = restGetOperations(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   299
        JSONArray ops = jsonArray.stream()
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   300
                .filter(a -> ((JSONObject) a).get("arguments") == null)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   301
                .map((JSONElement a) -> ((JSONObject) a).get("name"))
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   302
                .collect(Collectors.toCollection(JSONArray::new));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   303
        JSONObject result = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   304
        if (ops != null && !ops.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   305
            result.put("operations", ops);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   306
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   307
        return result;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   308
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   309
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   310
    private JSONObject restGetMBeanAttributeBulkOp(String name) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   311
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   312
            MBeanServerConnection mBeanServer = connector.getMBeanServerConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   313
            ObjectName objectName = new ObjectName(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   314
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   315
            MBeanAttributeInfo[] attrInfos = mBeanServer.getMBeanInfo(objectName).getAttributes();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   316
            Set<String> writableAttrs = Stream.of(attrInfos)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   317
                    .filter(MBeanAttributeInfo::isWritable)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   318
                    .map(MBeanFeatureInfo::getName).collect(Collectors.toSet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   319
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   320
            JSONObject writeAttrMap = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   321
            List<String> invalidAttrs = Arrays.asList("< Attribute not supported >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   322
                    "< Invalid attributes >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   323
                    "< Attribute not found >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   324
                    "< Error: No such attribute >");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   325
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   326
            JSONObject attrMap = restGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   327
            writableAttrs.stream().filter(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   328
                JSONElement element = attrMap.get(a);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   329
                if (element instanceof JSONPrimitive
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   330
                        && ((JSONPrimitive) element).getValue() instanceof String) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   331
                    String attrVal = (String) ((JSONPrimitive) element).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   332
                    if (invalidAttrs.contains(attrVal))
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   333
                        return false;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   334
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   335
                return true;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   336
            }).forEach(a -> writeAttrMap.put(a, attrMap.get(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   337
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   338
            JSONObject jsonObject = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   339
            JSONArray attrs = new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   340
            attrMap.keySet().forEach(a -> attrs.add(new JSONPrimitive(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   341
            if (attrs != null && !attrs.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   342
                jsonObject.put("get", attrs);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   343
            }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   344
            if (writeAttrMap != null && !writeAttrMap.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   345
                jsonObject.put("set", writeAttrMap);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   346
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   347
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   348
            JSONObject result = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   349
            if (jsonObject != null && !jsonObject.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   350
                result.put("attributes", jsonObject);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   351
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   352
            return result;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   353
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   354
            ex.getCause().printStackTrace();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   355
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   356
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   357
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   358
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   359
    @DataProvider(name = "allMBeans")
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   360
    private Object[][] allMBeans() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   361
        Set<String> names = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   362
        Object[] objects = names.stream().toArray(Object[]::new);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   363
        Object[][] result = new Object[objects.length][1];
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   364
        for (int i = 0; i < objects.length; i++) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   365
            result[i][0] = objects[i];
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   366
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   367
        return result;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   368
    }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   369
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   370
    @Test
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   371
    public void testAllMBeanServers() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   372
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   373
            HttpResponse httpResponse = executeHttpRequest(restUrl);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   374
            Assert.assertEquals(httpResponse.getCode(), 200);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   375
            JSONParser parser = new JSONParser(httpResponse.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   376
            JSONObject parse = (JSONObject) parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   377
            JSONArray links = (JSONArray) parse.get("mBeanServers");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   378
            for(JSONElement elem : links) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   379
                JSONObject jobj = (JSONObject) elem;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   380
                String link = (String) ((JSONPrimitive)jobj.get("href")).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   381
                HttpResponse hr = executeHttpRequest(link);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   382
                Assert.assertEquals(httpResponse.getCode(), 200);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   383
                JSONParser parser1 = new JSONParser(hr.getBody());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   384
                JSONObject parse1 = (JSONObject) parser1.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   385
                JSONObject links1 = (JSONObject) parse1.get("_links");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   386
                String link3 = (String) ((JSONPrimitive)links1.get("mbeans")).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   387
                verifyHttpResponse(executeHttpRequest(link3));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   388
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   389
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   390
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   391
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   392
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   393
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   394
    @Test
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   395
    public void testAllMBeans() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   396
        Set<String> restMbeans = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   397
        Set<String> rmiMbeans = rmiGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   398
        long count = restMbeans.stream().filter(mbeanName -> !rmiMbeans.contains(mbeanName)).count();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   399
        Assert.assertEquals(count, 0);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   400
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   401
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   402
    public void testMBeanFiltering() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   403
        String url = restUrl + "/platform/mbeans?";
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   404
        List<String> filtersOk = Arrays.asList("objectname=*:type=DiagnosticCommand,*",
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   405
        "objectname=java.lang:*&page=2",
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   406
        "objectname=java.lang:*&page=1",
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   407
        "objectname=*:type=Diag*");
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   408
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   409
        List<String> filtersKo = Arrays.asList("","*:type=DiagnosticCommand,*","objectname=java.lang:*&page=1&invalid=4");
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   410
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   411
        for(String filter : filtersOk) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   412
            HttpResponse httpResponse = executeHttpRequest(url + filter);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   413
            Assert.assertEquals(httpResponse.getCode(),200);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   414
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   415
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   416
        for(String filter : filtersKo) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   417
            HttpResponse httpResponse = executeHttpRequest(url + filter);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   418
            Assert.assertEquals(httpResponse.getCode(),HttpURLConnection.HTTP_BAD_REQUEST);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   419
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   420
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   421
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   422
    @Test
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   423
    public void testAllMBeanInfo() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   424
        Set<String> names = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   425
        for (String name : names) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   426
            String url = "/platform/mbeans/" + name + "/info";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   427
            HttpResponse httpResponse = executeHttpRequest(url);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   428
            verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   429
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   430
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   431
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   432
    @Test(priority = 3)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   433
    public void testMbeanNoArgOperations() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   434
        Set<String> mbeans = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   435
        for (String name : mbeans) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   436
            JSONArray restoperations = restGetOperations(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   437
            Set<String> rmiOps = rmiGetOperations(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   438
            Set<String> restOps = restoperations.stream().map((JSONElement a) -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   439
                JSONElement elem = ((JSONObject) a).get("name");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   440
                if (elem instanceof JSONPrimitive
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   441
                        && (((JSONPrimitive) elem).getValue() instanceof String)) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   442
                    return (String) ((JSONPrimitive) elem).getValue();
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   443
                } else {
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   444
                    return null;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   445
                }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   446
            }).collect(Collectors.toSet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   447
            Assert.assertEquals(rmiOps, restOps);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   448
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   449
            for (JSONElement jsonElement : restoperations) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   450
                JSONObject jsonObject = (JSONObject) jsonElement;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   451
                String opUrl = (String) ((JSONPrimitive) jsonObject.get("href")).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   452
                if (jsonObject.get("arguments") == null) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   453
                    HttpResponse httpResponse = executeHttpRequest(opUrl, "", true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   454
                    verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   455
                }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   456
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   457
        }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   458
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   459
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   460
    @Test(priority = 2)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   461
    public void testMBeanSetAttributes() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   462
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   463
            Set<String> mbeans = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   464
            MBeanServerConnection mBeanServer = connector.getMBeanServerConnection();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   465
            for (String name : mbeans) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   466
                ObjectName objectName = new ObjectName(name);
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   467
                String url = "/platform/mbeans/" + objectName.getCanonicalName();
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   468
                JSONObject attrMap = restGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   469
                MBeanAttributeInfo[] attrInfos = mBeanServer.getMBeanInfo(objectName).getAttributes();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   470
                Set<String> writableAttrs = Stream.of(attrInfos)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   471
                        .filter(MBeanAttributeInfo::isWritable)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   472
                        .map(MBeanFeatureInfo::getName).collect(Collectors.toSet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   473
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   474
                if (writableAttrs.isEmpty())
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   475
                    continue;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   476
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   477
                JSONObject writeAttrMap = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   478
                List<String> invalidAttrs = Arrays.asList(new String[]{"< Attribute not supported >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   479
                        "< Invalid attributes >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   480
                        "< Attribute not found >",
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   481
                        "< Error: No such attribute >"});
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   482
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   483
                writableAttrs.stream().filter(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   484
                    JSONElement element = attrMap.get(a);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   485
                    if (element instanceof JSONPrimitive
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   486
                            && ((JSONPrimitive) element).getValue() instanceof String) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   487
                        String attrVal = (String) ((JSONPrimitive) element).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   488
                        if (invalidAttrs.contains(attrVal))
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   489
                            return false;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   490
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   491
                    return true;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   492
                }).forEach(a -> writeAttrMap.put(a, attrMap.get(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   493
                HttpResponse httpResponse = executeHttpRequest(url, writeAttrMap.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   494
                if (httpResponse.getCode() == 200) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   495
                    String body = httpResponse.getBody();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   496
                    JSONParser parser = new JSONParser(body);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   497
                    JSONObject jsonObject = (JSONObject) parser.parse();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   498
                    Assert.assertEquals(jsonObject.size(), writeAttrMap.size());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   499
                    Assert.assertEquals(jsonObject.keySet(), writeAttrMap.keySet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   500
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   501
                    for (JSONElement elem : jsonObject.values()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   502
                        String output = (String) ((JSONPrimitive) elem).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   503
                        Assert.assertEquals(output.equalsIgnoreCase("success"), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   504
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   505
                }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   506
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   507
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   508
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   509
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   510
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   511
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   512
    @Test(priority = 1)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   513
    public void testMBeanGetAttributes() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   514
        try {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   515
            Set<String> mbeans = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   516
            for (String name : mbeans) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   517
                Map<String, Object> rmiAttrs = rmiGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   518
                JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(rmiAttrs);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   519
                JSONObject rmiJson = (JSONObject) typeMapper.toJsonValue(rmiAttrs);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   520
                JSONObject restJson = restGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   521
                Assert.assertEquals(restJson.size(), rmiJson.size());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   522
                Assert.assertEquals(rmiJson.keySet(), restJson.keySet());
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   523
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   524
        } catch (Exception ex) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   525
            throw new RuntimeException(ex);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   526
        }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   527
    }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   528
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   529
    @Test(priority = 4)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   530
    public void testThreadMXBeanBulkRequest() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   531
        String name = "java.lang:type=Threading";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   532
        String url = "/platform/mbeans/java.lang:type=Threading";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   533
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   534
        JSONObject jsonObject = restGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   535
        JSONArray jarr = (JSONArray) jsonObject.get("AllThreadIds");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   536
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   537
        Long[] threadIds = jarr.stream().map(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   538
            if (a instanceof JSONPrimitive && ((JSONPrimitive) a).getValue() instanceof Long) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   539
                return (Long) ((JSONPrimitive) a).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   540
            } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   541
                return -1;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   542
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   543
        }).toArray(Long[]::new);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   544
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   545
        JSONObject args = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   546
        JSONArray array = new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   547
        Stream.of(threadIds).forEach(a -> array.add(new JSONPrimitive(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   548
        args.put("p0", array);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   549
        args.put("p1", new JSONPrimitive(true));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   550
        args.put("p2", new JSONPrimitive(true));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   551
        JSONObject jobj1 = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   552
        jobj1.put("getThreadInfo", args);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   553
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   554
        JSONObject jobj2 = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   555
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   556
        jobj2.putAll(restGetMBeanAttributeBulkOp(name));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   557
        jobj2.put("operations", jobj1);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   558
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   559
        HttpResponse httpResponse = executeHttpRequest(url, jobj2.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   560
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   561
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   562
        JSONArray arr = new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   563
        arr.add(new JSONPrimitive("findMonitorDeadlockedThreads"));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   564
        arr.add(new JSONPrimitive("resetPeakThreadCount"));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   565
        arr.add(new JSONPrimitive("findDeadlockedThreads"));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   566
        arr.add(jobj1);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   567
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   568
        jobj2.clear();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   569
        jobj2.putAll(restGetMBeanAttributeBulkOp(name));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   570
        jobj2.put("operations", arr);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   571
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   572
        httpResponse = executeHttpRequest(url, jobj2.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   573
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   574
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   575
        jobj2.clear();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   576
        jobj2.putAll(restGetMBeanAttributeBulkOp(name));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   577
        jobj2.put("operations", "resetPeakThreadCount");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   578
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   579
        httpResponse = executeHttpRequest(url, jobj2.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   580
        verifyHttpResponse(httpResponse);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   581
    }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   582
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   583
    @Test(priority = 5)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   584
    public void testThreadMXBeanThreadInfo() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   585
        String name = "java.lang:type=Threading";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   586
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   587
        JSONObject jsonObject = restGetAttributes(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   588
        JSONArray jarr = (JSONArray) jsonObject.get("AllThreadIds");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   589
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   590
        Long[] threadIds = jarr.stream().map(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   591
            if (a instanceof JSONPrimitive && ((JSONPrimitive) a).getValue() instanceof Long) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   592
                return (Long) ((JSONPrimitive) a).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   593
            } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   594
                return -1;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   595
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   596
        }).toArray(Long[]::new);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   597
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   598
        JSONArray operations = restGetOperations("java.lang:type=Threading");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   599
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   600
        JSONObject threadInfoRequest = (JSONObject) operations.stream()
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   601
                .filter(a -> {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   602
                    JSONObject jobj = (JSONObject) a;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   603
                    JSONElement elem = ((JSONObject) a).get("name");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   604
                    if (elem instanceof JSONPrimitive
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   605
                            && (((JSONPrimitive) elem).getValue() instanceof String)) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   606
                        return ((JSONPrimitive) elem).getValue().equals("getThreadInfo");
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   607
                    } else {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   608
                        return false;
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   609
                    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   610
                }).findFirst().get();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   611
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   612
        String postUrl1 = (String) ((JSONPrimitive) threadInfoRequest.get("href")).getValue();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   613
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   614
        // Build arguments
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   615
        // 1. getThreadInfo(long id)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   616
        JSONObject args = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   617
        args.put("p0", new JSONPrimitive(threadIds[0]));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   618
        HttpResponse httpResponse = executeHttpRequest(postUrl1, args.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   619
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   620
        args.clear();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   621
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   622
        // 2. getThreadInfo(long[] ids)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   623
        JSONArray array = new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   624
        Stream.of(threadIds).forEach(a -> array.add(new JSONPrimitive(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   625
        args.put("p0", array);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   626
        httpResponse = executeHttpRequest(postUrl1, args.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   627
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   628
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   629
        //3. getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   630
        args.put("p1", new JSONPrimitive(true));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   631
        args.put("p2", new JSONPrimitive(true));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   632
        httpResponse = executeHttpRequest(postUrl1, args.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   633
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   634
        args.clear();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   635
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   636
        //4. getThreadInfo(long id, int maxDepth)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   637
        args.put("p0", new JSONPrimitive(threadIds[0]));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   638
        args.put("p1", new JSONPrimitive(10));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   639
        httpResponse = executeHttpRequest(postUrl1, args.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   640
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   641
        args.clear();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   642
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   643
        //5. getThreadInfo(long[] ids, int maxDepth)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   644
        JSONArray jarr1 = new JSONArray();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   645
        Stream.of(threadIds).forEach(a -> jarr1.add(new JSONPrimitive(a)));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   646
        args.put("p0", jarr1);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   647
        args.put("p1", new JSONPrimitive(10));
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   648
        httpResponse = executeHttpRequest(postUrl1, args.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   649
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   650
    }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   651
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   652
    @Test(priority = 4)
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   653
    public void testAllMBeansBulkRequest() {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   654
        Set<String> allNames = restGetAllMBeans();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   655
        String url = restUrl + "/platform/mbeans";
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   656
        JSONObject result = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   657
        for (String name : allNames) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   658
            JSONObject attrNode = restGetMBeanAttributeBulkOp(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   659
            JSONObject opsNode = restGetMBeanOperationsBulkOp(name);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   660
            JSONObject jobj = new JSONObject();
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   661
            if (attrNode != null && !attrNode.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   662
                jobj.putAll(attrNode);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   663
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   664
            if (opsNode != null && !opsNode.isEmpty()) {
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   665
                jobj.putAll(opsNode);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   666
            }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   667
            result.put(name, jobj);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   668
        }
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   669
        HttpResponse httpResponse = executeHttpRequest(url, result.toJsonString(), true);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   670
        verifyHttpResponse(httpResponse);
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   671
    }
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   672
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   673
    @Test(priority = 6)
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   674
    public void testMbeansQueryBulkRequest() {
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   675
        String url = restUrl + "/platform/mbeans";
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   676
        String request = "{\"?*:type=MemoryPool,*\":{\"attributes\":{\"get\":[\"Name\",\"Usage\"]},\"operations\":\"resetPeakUsage\"},\"java.lang:name=Compressed Class Space,type=MemoryPool\":{\"attributes\":{\"get\":[\"MemoryManagerNames\"]}}}";
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   677
        HttpResponse httpResponse = executeHttpRequest(url, request, true);
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   678
        verifyHttpResponse(httpResponse);
352a4f213fc6 1. URL decoding of URL
hb
parents: 56003
diff changeset
   679
    }
56002
60ab3b595a8e Lot of bug fixes
hb
parents: 55994
diff changeset
   680
}