/*
*
* Copyright (C) 2012-2014 R T Huitema. All Rights Reserved.
* Web: www.42.co.nz
* Email: robert@42.co.nz
* Author: R T Huitema
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* 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.
*
*/
package nz.co.fortytwo.signalk.server;
import static nz.co.fortytwo.signalk.util.SignalKConstants.SIGNALK_API;
import static nz.co.fortytwo.signalk.util.SignalKConstants.SIGNALK_AUTH;
import static nz.co.fortytwo.signalk.util.SignalKConstants.nav;
import static nz.co.fortytwo.signalk.util.SignalKConstants.vessels;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import mjson.Json;
import nz.co.fortytwo.signalk.util.SignalKConstants;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
import org.junit.Test;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.Response;
public class RestApiTest extends SignalKCamelTestSupport {
private static Logger logger = LogManager.getLogger(RestApiTest.class);
String jsonDiff = null;
String jsonDiff2 = null;
@Produce(uri = "direct:input")
protected ProducerTemplate template;
public RestApiTest(){
try {
jsonDiff = FileUtils.readFileToString(new File("src/test/resources/samples/testUpdate.json"));
jsonDiff=jsonDiff.replaceAll("self", SignalKConstants.self);
jsonDiff2 = FileUtils.readFileToString(new File("src/test/resources/samples/testUpdate2.json"));
jsonDiff2=jsonDiff2.replaceAll("self", SignalKConstants.self);
} catch (IOException e) {
logger.error(e);
fail();
}
}
//TODO - test for empty context + path, eg /resources/...
@Test
public void shouldGetJsonResponse() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AsyncHttpClient c = new AsyncHttpClient();
template.sendBody(RouteManager.SEDA_INPUT,jsonDiff);
latch.await(2,TimeUnit.SECONDS);
//get a sessionid
Response r1 = c.prepareGet("http://localhost:"+restPort+SIGNALK_AUTH+"/demo/pass").execute().get();
//latch2.await(3, TimeUnit.SECONDS);
assertEquals(200, r1.getStatusCode());
Response reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/vessels/"+SignalKConstants.self).setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
Json resp = Json.read(reponse.getResponseBody());
assertEquals(3.0176 , resp.at(nav).at("courseOverGroundTrue").at("value").asFloat(),0.001);
reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/vessels/"+SignalKConstants.self+"/navigation").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
//{\"updates\":[{\"values\":[{\"value\":3.0176,\"path\":\"navigation.courseOverGroundTrue\"}],\"source\":{\"timestamp\":\"2014-08-15T16:00:00.081Z\",\"source\":\"/dev/actisense-N2K-115-128267\"}}],\"context\":\"vessels.self\"}
resp = Json.read(reponse.getResponseBody());
assertEquals(3.0176 , resp.at("courseOverGroundTrue").at("value").asFloat(),0.001);
c.close();
}
@Test
public void shouldGetBadRequest() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AsyncHttpClient c = new AsyncHttpClient();
template.sendBody(RouteManager.SEDA_INPUT,jsonDiff);
latch.await(2,TimeUnit.SECONDS);
//get a sessionid
Response r1 = c.prepareGet("http://localhost:"+restPort+SIGNALK_AUTH+"/demo/pass").execute().get();
//latch2.await(3, TimeUnit.SECONDS);
assertEquals(200, r1.getStatusCode());
Response reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/vessels/*/navigation").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(400, reponse.getStatusCode());
assertEquals("Bad Request" , reponse.getResponseBody());
c.close();
}
@Test
public void shouldGetEmptyResponse() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AsyncHttpClient c = new AsyncHttpClient();
template.sendBody(RouteManager.SEDA_INPUT,jsonDiff);
latch.await(2,TimeUnit.SECONDS);
//get a sessionid
Response r1 = c.prepareGet("http://localhost:"+restPort+SIGNALK_AUTH+"/demo/pass").execute().get();
//latch2.await(3, TimeUnit.SECONDS);
assertEquals(200, r1.getStatusCode());
Response reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/vessels/self/navigation/nothing").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
assertEquals("{}" , reponse.getResponseBody());
c.close();
}
@Test
public void shouldGetValidResponse() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AsyncHttpClient c = new AsyncHttpClient();
template.sendBody(RouteManager.SEDA_INPUT,jsonDiff2);
latch.await(2,TimeUnit.SECONDS);
//get a sessionid
Response r1 = c.prepareGet("http://localhost:"+restPort+SIGNALK_AUTH+"/demo/pass").execute().get();
//latch2.await(3, TimeUnit.SECONDS);
assertEquals(200, r1.getStatusCode());
Response reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/vessels/self/navigation/course*").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
Json resp = Json.read(reponse.getResponseBody());
assertEquals(3.0176 , resp.at("courseOverGroundTrue").at("value").asFloat(),0.001);
assertEquals(1.6231 , resp.at("courseOverGroundMagnetic").at("value").asFloat(),0.001);
c.close();
}
@Test
public void shouldGetListResponse() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
final AsyncHttpClient c = new AsyncHttpClient();
template.sendBody(RouteManager.SEDA_INPUT,jsonDiff);
latch.await(2,TimeUnit.SECONDS);
//get a sessionid
Response r1 = c.prepareGet("http://localhost:"+restPort+SIGNALK_AUTH+"/demo/pass").execute().get();
//latch2.await(3, TimeUnit.SECONDS);
assertEquals(200, r1.getStatusCode());
Response reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/list/vessels/"+SignalKConstants.self+"/*").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
Json resp = Json.read(reponse.getResponseBody());
Json list = resp.at(SignalKConstants.PATHLIST);
assertTrue(list.isArray());
assertTrue(list.asJsonList().get(0).asString().startsWith("vessels."+SignalKConstants.self));
reponse = c.prepareGet("http://localhost:"+restPort+SIGNALK_API+"/list/vessels/*/navigation/*").setCookies(r1.getCookies()).execute().get();
//latch.await(3, TimeUnit.SECONDS);
logger.debug(reponse.getResponseBody());
assertEquals(200, reponse.getStatusCode());
//{\"updates\":[{\"values\":[{\"value\":3.0176,\"path\":\"navigation.courseOverGroundTrue\"}],\"source\":{\"timestamp\":\"2014-08-15T16:00:00.081Z\",\"source\":\"/dev/actisense-N2K-115-128267\"}}],\"context\":\"vessels.self\"}
resp = Json.read(reponse.getResponseBody());
list = resp.at(SignalKConstants.PATHLIST);
assertTrue(list.isArray());
assertTrue(list.asJsonList().get(0).asString().startsWith("vessels.*.navigation"));
c.close();
}
@Override
public void configureRouteBuilder(RouteBuilder routeBuilder) {
// TODO Auto-generated method stub
try {
((RouteManager)routeBuilder).configure0();
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error(e);
fail();
}
}
}