/*
NormalEventProfileTestCase.java
Copyright (c) 2017 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.profile.restful.test;
import android.support.test.runner.AndroidJUnit4;
import org.deviceconnect.message.DConnectEventMessage;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.DConnectResponseMessage;
import org.deviceconnect.message.DConnectSDK;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.net.URLEncoder;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
/**
* Eventプロファイルの正常系テスト.
* @author NTT DOCOMO, INC.
*/
@RunWith(AndroidJUnit4.class)
public class NormalEventProfileTestCase extends RESTfulDConnectTestCase {
/**
* テスト用デバイスプラグインにイベントを登録して、イベントが取得するテスト.
* <pre>
* 【HTTP通信】
* Method: PUT
* Path: /deviceOrientation/onDeviceOrientation
* </pre>
* <pre>
* 【期待する動作】
* ・WebSocketが接続されること。
* ・イベント登録にresultが0で返されること。
* ・イベントにメッセージが送られてくること。
* </pre>
*/
@Test
public void testEvent() throws Exception {
String uri = "http://localhost:4035/gotapi/deviceOrientation/onDeviceOrientation";
uri += "?serviceId=" + URLEncoder.encode(getServiceId(), "UTF-8");
uri += "&accessToken=" + URLEncoder.encode(getAccessToken(), "UTF-8");
final CountDownLatch latch = new CountDownLatch(1);
final CountDownLatch eventLatch = new CountDownLatch(1);
final AtomicReference<DConnectEventMessage> event = new AtomicReference<>();
final AtomicReference<Boolean> connect = new AtomicReference<>();
try {
mDConnectSDK.connectWebSocket(new DConnectSDK.OnWebSocketListener() {
@Override
public void onOpen() {
connect.set(true);
latch.countDown();
}
@Override
public void onClose() {
connect.set(false);
latch.countDown();
}
@Override
public void onError(Exception e) {
connect.set(false);
latch.countDown();
}
});
latch.await(10, TimeUnit.SECONDS);
assertThat(connect.get(), is(true));
mDConnectSDK.addEventListener(uri, new DConnectSDK.OnEventListener() {
@Override
public void onMessage(DConnectEventMessage message) {
event.set(message);
eventLatch.countDown();
}
@Override
public void onResponse(DConnectResponseMessage response) {
if (response.getResult() != DConnectMessage.RESULT_OK) {
eventLatch.countDown();
}
}
});
eventLatch.await(10, TimeUnit.SECONDS);
DConnectEventMessage e = event.get();
assertThat(e, is(notNullValue()));
assertThat(e.getString("serviceId"), is(getServiceId()));
assertThat(e.getString("profile"), is(equalToIgnoringCase("deviceOrientation")));
assertThat(e.getString("attribute"), is(equalToIgnoringCase("onDeviceOrientation")));
} finally {
mDConnectSDK.removeEventListener(uri);
mDConnectSDK.disconnectWebSocket();
}
}
}