package org.jolokia.client;
/*
* Copyright 2009-2011 Roland Huss
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.*;
import javax.management.MalformedObjectNameException;
import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.message.BasicHeader;
import org.easymock.EasyMock;
import org.jolokia.client.exception.*;
import org.jolokia.client.request.*;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import org.testng.collections.Maps;
import static org.easymock.EasyMock.*;
import static org.testng.Assert.*;
/**
* @author roland
* @since 23.09.11
*/
public class J4pClientTest {
private static String MEMORY_RESPONSE =
"{\"timestamp\":1316801201,\"status\":200," +
"\"request\":{\"mbean\":\"java.lang:type=Memory\",\"attribute\":\"HeapMemoryUsage\",\"type\":\"read\"}," +
"\"value\":{\"max\":530186240,\"committed\":85000192,\"init\":0,\"used\":17962568}}";
private static String EMPTY_RESPONSE = "{}";
private static String ARRAY_RESPONSE = "[ " + MEMORY_RESPONSE + "]";
public static final String TEST_URL = "http://localhost:8080/jolokia";
private static final String ERROR_VALUE_RESPONSE = "{" +
"\"error_type\":\"errorType\"" +
"\"status\":500" +
"\"error_value\":{\"test\":\"ok\"}" +
"}";
public J4pReadRequest TEST_REQUEST,TEST_REQUEST_2;
@BeforeTest
public void setup() throws MalformedObjectNameException {
TEST_REQUEST = new J4pReadRequest("java.lang:type=Memory", "HeapMemoryUsage");
TEST_REQUEST_2 = new J4pReadRequest("java.lang:type=Memory", "NonHeapMemoryUsage");
}
@Test
public void simple() throws MalformedObjectNameException, J4pException, IOException {
HttpClient client = prepareMocks("utf-8",MEMORY_RESPONSE);
J4pClient j4p = new J4pClient(TEST_URL,client);
J4pReadResponse resp = j4p.execute(TEST_REQUEST);
assertEquals(((Map) resp.getValue()).get("max"), 530186240L);
}
@Test(expectedExceptions = J4pException.class,expectedExceptionsMessageRegExp = ".*JSONArray.*")
public void invalidArrayResponse() throws MalformedObjectNameException, J4pException, IOException {
HttpClient client = prepareMocks(null,ARRAY_RESPONSE);
J4pClient j4p = new J4pClient(TEST_URL,client);
Map<J4pQueryParameter,String> opts = new HashMap<J4pQueryParameter, String>();;
opts.put(J4pQueryParameter.IGNORE_ERRORS,"true");
j4p.execute(TEST_REQUEST, opts);
}
@Test(expectedExceptions = J4pTimeoutException.class,expectedExceptionsMessageRegExp = ".*timeout.*")
public void timeout() throws IOException, MalformedObjectNameException, J4pException {
throwException(false, new ConnectTimeoutException());
}
@Test(expectedExceptions = J4pException.class,expectedExceptionsMessageRegExp = ".*IO-Error.*")
public void ioException() throws IOException, MalformedObjectNameException, J4pException {
throwException(false,new IOException());
}
@Test(expectedExceptions = J4pTimeoutException.class,expectedExceptionsMessageRegExp = ".*timeout.*")
public void connectExceptionForBulkRequests() throws IOException, J4pException {
throwException(true,new ConnectTimeoutException());
}
@Test(expectedExceptions = J4pException.class,expectedExceptionsMessageRegExp = ".*IO-Error.*")
public void ioExceptionForBulkRequests() throws IOException, J4pException {
throwException(true,new IOException());
}
@Test(expectedExceptions = J4pException.class,expectedExceptionsMessageRegExp = ".*reading.*response.*")
public void throwIOExceptionWhenParsingAnswer() throws IOException, J4pException {
HttpClient client = createMock(HttpClient.class);
HttpResponse response = createMock(HttpResponse.class);
HttpEntity entity = createMock(HttpEntity.class);
expect(client.execute(EasyMock.<HttpUriRequest>anyObject())).andReturn(response);
expect(response.getEntity()).andReturn(entity);
expect(entity.getContentEncoding()).andReturn(null);
expect(entity.getContent()).andThrow(new IOException());
entity.consumeContent();
replay(client, entity, response);
J4pClient j4p = new J4pClient(TEST_URL,client);
j4p.execute(TEST_REQUEST);
}
@Test(expectedExceptions = J4pException.class,expectedExceptionsMessageRegExp = ".*Invalid.*bulk.*")
public void invalidBulkRequestResponse() throws IOException, J4pException {
HttpClient client = prepareMocks(null,MEMORY_RESPONSE);
J4pClient j4p = new J4pClient(TEST_URL,client);
j4p.execute(TEST_REQUEST,TEST_REQUEST_2);
}
@Test(expectedExceptions = J4pRemoteException.class,expectedExceptionsMessageRegExp = ".*Invalid.*")
public void noStatus() throws IOException, J4pException {
HttpClient client = prepareMocks(null,EMPTY_RESPONSE);
J4pClient j4p = new J4pClient(TEST_URL,client);
j4p.execute(TEST_REQUEST);
}
@Test(expectedExceptions = J4pRemoteException.class)
public void remoteExceptionErrorValue() throws IOException, J4pException {
HttpClient client = prepareMocks("utf-8", ERROR_VALUE_RESPONSE);
J4pClient j4p = new J4pClient(TEST_URL,client);
Map<J4pQueryParameter, String> options = Maps.newHashMap();
options.put(J4pQueryParameter.SERIALIZE_EXCEPTION, "true");
options.put(J4pQueryParameter.INCLUDE_STACKTRACE, "false");
try {
j4p.execute(TEST_REQUEST, options);
} catch (J4pRemoteException e) {
assertEquals(e.getErrorValue().toJSONString(), "{\"test\":\"ok\"}");
throw e;
}
fail("No exception was thrown");
}
private void throwException(boolean bulk,Exception exp) throws IOException, J4pException {
HttpClient client = createMock(HttpClient.class);
expect(client.execute(EasyMock.<HttpUriRequest>anyObject())).andThrow(exp);
replay(client);
J4pClient j4p = new J4pClient(TEST_URL,client);
if (bulk) {
j4p.execute(TEST_REQUEST, TEST_REQUEST_2);
} else {
j4p.execute(TEST_REQUEST);
}
}
private HttpClient prepareMocks(String encoding,String jsonResp) throws IOException {
HttpClient client = createMock(HttpClient.class);
HttpResponse response = createMock(HttpResponse.class);
HttpEntity entity = createMock(HttpEntity.class);
expect(client.execute(EasyMock.<HttpUriRequest>anyObject())).andReturn(response);
expect(response.getEntity()).andReturn(entity);
expect(entity.getContentEncoding()).andReturn(encoding != null ? new BasicHeader("Content-Encoding",encoding) : null);
final ByteArrayInputStream bis =
new ByteArrayInputStream(jsonResp.getBytes());
expect(entity.getContent()).andReturn(bis);
entity.consumeContent();
replay(client, response, entity);
return client;
}
}