/*
FPLUGControllerTest.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.fplug.fplug;
import android.bluetooth.BluetoothDevice;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
/**
* Test class for FPLUGController.
* <p>
* NOTICE: This test is enable only when Bluetooth is available.
* </p>
*/
@RunWith(AndroidJUnit4.class)
public class FPLUGControllerTest {
private final static String TAG = FPLUGControllerTest.class.getSimpleName();
@Before
public void waitForDisconnect() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void testFPLUGController() {
BluetoothDevice fplug = getSampleFPLUG();
FPLUGController controller = new FPLUGController(fplug);
assertNotNull("unknown error", controller);
}
@Test(expected = IllegalArgumentException.class)
public void testFPLUGController_DeviceIsNull() {
new FPLUGController(null);
}
@Test
public void testFPLUGController_Connect() {
FPLUGController controller = getConnectedController();
controller.disconnect();
}
// @Test (Danger. If you want to do this test, you should manual run.)
public void testFPLUGController_RequestInitPlug() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestInitPlug(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
latch.countDown();
}
});
waitAndClose(latch, controller);
}
// @Test (Danger. If you want to do this test, you should manual run.)
public void testFPLUGController_RequestCancelPairing() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestCancelPairing(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestWattHour() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestWattHour(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
List<WattHour> wattHourList = response.getWattHourList();
assertNotNull(wattHourList);
assertTrue(wattHourList.size() == 24);
for (WattHour wh : wattHourList) {
int watt = wh.getWatt();
int hoursAgo = wh.getHoursAgo();
assertTrue("watt under limit", watt > -3276);
assertTrue("watt over limit", watt < 3276);
assertTrue("hours age over range", hoursAgo > 0 && hoursAgo < 25);
Log.d(TAG, "hour:" + hoursAgo + " watt:" + watt + " reliable:" + wh.isReliable());
}
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestTemperature() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestTemperature(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
double temperature = response.getTemperature();
assertTrue("temperature under limit", temperature > -273.3);
assertTrue("temperature over limit", temperature < 3276.7);
Log.d(TAG, "temperature:" + temperature);
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestHumidity() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestHumidity(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
int humidity = response.getHumidity();
assertTrue("humidity under limit", humidity > -1);
assertTrue("humidity over limit", humidity < 101);
Log.d(TAG, "humidity:" + humidity);
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestIlluminance() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestIlluminance(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
int illuminance = response.getIlluminance();
assertTrue("illuminance under limit", illuminance > -1);
assertTrue("illuminance over limit", illuminance < 65534);
Log.d(TAG, "illuminance:" + illuminance);
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestRealtimeWatt() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestRealtimeWatt(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
double watt = response.getRealtimeWatt();
assertTrue("watt under limit", watt > -3276.8);
assertTrue("watt over limit", watt < 3276.7);
Log.d(TAG, "watt:" + watt);
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestPastWattHour() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestPastWattHour(Calendar.getInstance(), new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
List<WattHour> wattHourList = response.getWattHourList();
assertNotNull(wattHourList);
assertTrue(wattHourList.size() == 24);
for (WattHour wh : wattHourList) {
assertTrue("watt under limit", wh.getWatt() > -3276);
assertTrue("watt over limit", wh.getWatt() < 3277);
assertTrue("hours age out of range", wh.getHoursAgo() > 0 && wh.getHoursAgo() < 25);
Log.d(TAG, "hour:" + wh.getHoursAgo() + " watt:" + wh.getWatt() + " reliable:" + wh.isReliable());
}
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestPastValues() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestPastValues(Calendar.getInstance(), new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
List<PastValues> pastValuesList = response.getPastValuesList();
assertNotNull(pastValuesList);
assertTrue(pastValuesList.size() == 24);
for (PastValues pv : pastValuesList) {
double temperature = pv.getTemperature();
int humidity = pv.getHumidity();
int illuminance = pv.getIlluminance();
int hoursAgo = pv.getHoursAgo();
assertTrue("temperature out of range", temperature > -273.3 && temperature < 3276.7);
assertTrue("humidity out of range", humidity > -1 && humidity < 65534);
assertTrue("illuminance out of limit", illuminance > -1 && illuminance < 65534);
assertTrue("hours age out of range", hoursAgo > 0 && hoursAgo < 25);
Log.d(TAG, "hour:" + hoursAgo + " temperature:" + temperature + " humidity:" + humidity + " illuminance:" + illuminance);
}
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestSetDate() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestSetDate(Calendar.getInstance(), new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestLEDControlON() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestLEDControl(true, new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_RequestLEDControlOFF() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestLEDControl(false, new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
latch.countDown();
}
});
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_ManyRequest() {
final int REQUEST_COUNT = 10;
final CountDownLatch latch = new CountDownLatch(REQUEST_COUNT);
final FPLUGController controller = getConnectedController();
FPLUGRequestCallback callback = new FPLUGRequestCallback() {
@Override
public void onSuccess(FPLUGResponse response) {
double watt = response.getRealtimeWatt();
Log.d(TAG, "watt:" + watt);
latch.countDown();
}
@Override
public void onError(String message) {
Log.e(TAG, "onError:" + message);
latch.countDown();
}
@Override
public void onTimeout() {
controller.disconnect();
fail();
}
};
for (int i = 0; i < REQUEST_COUNT; i++) {
controller.requestRealtimeWatt(callback);
}
waitAndClose(latch, controller);
}
@Test
public void testFPLUGController_CalculateDiscomfortIndex() {
final CountDownLatch latch = new CountDownLatch(1);
final FPLUGController controller = getConnectedController();
controller.requestTemperature(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
final double temperature = response.getTemperature();
controller.requestHumidity(new RequestCallback(controller) {
@Override
public void onSuccess(FPLUGResponse response) {
super.onSuccess(response);
int humidity = response.getHumidity();
double discomfortIndex = (0.81 * temperature) + (0.01 * humidity) * ((0.99 * temperature) - 14.3) + 46.3;
Log.d(TAG, "discomfortIndex:" + discomfortIndex + " temperature:" + temperature + " humidity:" + humidity);
latch.countDown();
//discomfort index
//〜55 cold
//55〜60 little cold
//60〜65 no feel
//65〜70 comfort
//70〜75 not hot
//75〜80 little hot
//80〜85 hot
//85〜 very hot
}
});
}
});
waitAndClose(latch, controller);
}
private BluetoothDevice getSampleFPLUG() {
List<BluetoothDevice> devices = FPLUGDiscover.getAll();
assertNotNull("Bluetooth OFF or BLE not supported", devices);
assertTrue("FPLUG not found", devices.size() > 0);
return devices.get(0);
}
private FPLUGController getConnectedController() {
final CountDownLatch waitForConnect = new CountDownLatch(1);
BluetoothDevice fplug = getSampleFPLUG();
FPLUGController controller = new FPLUGController(fplug);
controller.connect(new FPLUGController.FPLUGConnectionListener() {
@Override
public void onConnected(String address) {
waitForConnect.countDown();
}
@Override
public void onDisconnected(String address) {
}
@Override
public void onConnectionError(String address, String message) {
fail();
}
});
boolean isPassed = false;
try {
isPassed = waitForConnect.await(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
fail("InterruptedException occurred");
}
if (!isPassed) {
fail("Timeout occurred");
}
return controller;
}
private void waitAndClose(CountDownLatch latch, FPLUGController controller) {
boolean isPassed = false;
try {
isPassed = latch.await(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
controller.disconnect();
fail("InterruptedException occurred");
}
if (!isPassed) {
controller.disconnect();
fail("Timeout occurred");
}
controller.disconnect();
}
private class RequestCallback implements FPLUGRequestCallback {
FPLUGController mController;
public RequestCallback(FPLUGController controller) {
mController = controller;
}
@Override
public void onSuccess(FPLUGResponse response) {
assertNotNull(response);
}
@Override
public void onError(String message) {
mController.disconnect();
fail();
}
@Override
public void onTimeout() {
mController.disconnect();
fail();
}
}
}