package io.evercam;
import org.junit.*;
import org.junit.rules.ExpectedException;
import java.util.ArrayList;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
public class CameraTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@BeforeClass
public static void setUpClass() {
API.URL = TestURL.URL;
}
@Test
public void testCreateAndDeleteCamera() throws EvercamException {
//TODO: Use the testing server / remove the commented code
//API.resetUrl();
RandomUser randomUser = new RandomUser();
Camera randomCamera = randomUser.addRandomCamera(true);
assertFalse(randomCamera.isOnline());
ApiKeyPair apiKeyPair = API.requestUserKeyPairFromEvercam(randomUser.getUsername(), randomUser.getPassword());
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
assertEquals(1, Camera.getAll(randomUser.getUsername(), false, false).size());
//TODO: Wait for the bug fix to re-enable this, currently can not delete camera
boolean deleteSuccess = Camera.delete(randomCamera.getId());
Assert.assertTrue(deleteSuccess);
assertEquals(0, Camera.getAll(randomUser.getUsername(), false, false).size());
/**
* Test create camera with location and online status
*/
Camera camera = randomUser.addFullCamera();
assertEquals(RandomUser.LOCATION_LNG, camera.getLocation().getLng(), 0);
assertEquals(RandomUser.LOCATION_LAT, camera.getLocation().getLat(), 0);
assertTrue(camera.isOnline());
assertEquals(RandomUser.CAMERA_NAME, camera.getName());
assertEquals(true, camera.isPublic());
assertEquals(RandomUser.CAMERA_INTERNAL_HOST, camera.getInternalHost());
assertEquals(RandomUser.CAMERA_INTERNAL_HTTP, camera.getInternalHttpPort());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP, camera.getInternalRtspPort());
assertEquals(RandomUser.CAMERA_EXTERNAL_HOST, camera.getExternalHost());
assertEquals(RandomUser.CAMERA_EXTERNAL_HTTP, camera.getExternalHttpPort());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP, camera.getExternalRtspPort());
assertEquals(RandomUser.CAMERA_USERNAME, camera.getUsername());
assertEquals(RandomUser.CAMERA_PASSWORD, camera.getPassword());
// assertEquals(RandomUser.CAMERA_JPG_URL, patchCamera.getJpgUrl());
// assertEquals(RandomUser.CAMERA_RTSP_URL, patchCamera.getRtspUrl());
assertEquals(RandomUser.CAMERA_TIMEZONE, camera.getTimezone());
assertEquals(RandomUser.CAMERA_VENDOR, camera.getVendorId());
assertEquals(RandomUser.CAMERA_VENDOR_NAME, camera.getVendorName());
assertEquals(RandomUser.CAMERA_MAC, camera.getMacAddress());
assertEquals(RandomUser.CAMERA_MODEL_NAME, camera.getModelName());
assertEquals(RandomUser.CAMERA_MODEL_ID, camera.getModelId());
assertTrue(camera.isDiscoverable());
assertEquals(RandomUser.LOCATION_LNG, camera.getLocation().getLng(), 0);
assertEquals(RandomUser.LOCATION_LAT, camera.getLocation().getLat(), 0);
assertNotNull(camera.getProxyUrl().getHls());
assertNotNull(camera.getProxyUrl().getRtmp());
assertEquals(RandomUser.CAMERA_INTERNAL_URL, camera.getInternalCameraEndpoint());
assertEquals(RandomUser.CAMERA_EXTERNAL_URL, camera.getExternalCameraEndpoint());
assertEquals(RandomUser.CAMERA_INTERNAL_JPG_URL, camera.getInternalJpgUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_JPG_URL, camera.getExternalJpgUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP_URL, camera.getInternalH264Url());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP_URL, camera.getExternalH264Url());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP_URL_WITH_AUTH, camera.getInternalH264UrlWithCredential());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP_URL_WITH_AUTH, camera.getExternalH264UrlWithCredential());
assertEquals(RandomUser.CAMERA_INTERNAL_MJPG_URL, camera.getInternalObject().getHttp().getMjpgUrl());
//assertEquals(RandomUser.CAMERA_EXTERNAL_MJPG_URL, camera.getExternalObject().getHttp().getMjpgUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_MPEG_URL, camera.getInternalObject().getRtsp().getMpegUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_MPEG_URL, camera.getExternalObject().getRtsp().getMpegUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_AUDIO_URL, camera.getInternalObject().getRtsp().getAudioUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_AUDIO_URL, camera.getExternalObject().getRtsp().getAudioUrl());
//Delete the user after testing
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
assertTrue(User.delete(randomUser.getUsername()));
API.setUserKeyPair(null, null);
//API.URL = TestURL.URL;
}
@Test
public void testGetAllCamerasWithCredentials() throws EvercamException {
//TODO: Use the testing server or remove the commented code
//API.resetUrl();
RandomUser randomUser = new RandomUser();
randomUser.addRandomCamera(true);
randomUser.addRandomCamera(false);
ApiKeyPair apiKeyPair = API.requestUserKeyPairFromEvercam(randomUser.getUsername(), randomUser.getPassword());
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
ArrayList<Camera> allCameras = Camera.getAll(randomUser.getUsername(), false, false);
assertEquals(2, allCameras.size());
ArrayList<Camera> allCamerasIncludingShared = Camera.getAll(randomUser.getUsername(), true, false);
assertEquals(3, allCamerasIncludingShared.size());
//Test camera thumbnail
Camera demoCamera = Camera.getById("evercam-remembrance-camera", true);
String thumbnailUrl = demoCamera.getThumbnailUrl();
assertEquals("https://media.evercam.io/v1/cameras/evercam-remembrance-camera/thumbnail?api_id=" +
apiKeyPair.getApiId() + "&api_key=" + apiKeyPair.getApiKey(), thumbnailUrl);
//Delete the user after testing
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
assertTrue(User.delete(randomUser.getUsername()));
API.setUserKeyPair(null, null);
//API.URL = TestURL.URL;
}
@Test
public void testGetCamerasWithoutUsername() throws EvercamException {
RandomUser randomUser = new RandomUser();
randomUser.addRandomCamera(true);
randomUser.addRandomCamera(false);
ApiKeyPair apiKeyPair = API.requestUserKeyPairFromEvercam(randomUser.getUsername(), randomUser.getPassword());
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
ArrayList<Camera> allCameras = Camera.getAll(null, false, false);
assertEquals(2, allCameras.size());
ArrayList<Camera> allCamerasIncludingShared = Camera.getAll(randomUser.getUsername(), true, false);
assertEquals(3, allCamerasIncludingShared.size());
API.setUserKeyPair(null, null);
}
@Test
public void testPatchCamera() throws EvercamException {
//TODO: Use the testing server / remove the commented code
//API.resetUrl();
final String PATCH_CAMERA_NAME = "Patch Camera";
RandomUser randomUser = new RandomUser();
Camera camera = randomUser.addBasicCamera();
ApiKeyPair apiKeyPair = API.requestUserKeyPairFromEvercam(randomUser.getUsername(), randomUser.getPassword());
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
assertFalse(camera.isOnline());
//FIXME: Patch camera only accept location data as string, not float
CameraDetail detail = new PatchCameraBuilder(camera.getId()).setInternalHost(RandomUser.CAMERA_INTERNAL_HOST).setInternalHttpPort(RandomUser.
CAMERA_INTERNAL_HTTP).setInternalRtspPort(RandomUser.CAMERA_INTERNAL_RTSP).setExternalHost(RandomUser.CAMERA_EXTERNAL_HOST)
.setExternalHttpPort(RandomUser.CAMERA_EXTERNAL_HTTP).setExternalRtspPort(RandomUser.CAMERA_EXTERNAL_RTSP)
.setCameraUsername(RandomUser.CAMERA_USERNAME).setCameraPassword(RandomUser.CAMERA_PASSWORD).setJpgUrl(RandomUser.CAMERA_JPG_URL)
.setH264Url(RandomUser.CAMERA_H264_URL).setMjpgUrl(RandomUser.CAMERA_MJPG_URL).setMpegUrl(RandomUser.CAMERA_MPEG_URL)
.setAudioUrl(RandomUser.CAMERA_AUDIO_URL).setTimeZone(RandomUser.CAMERA_TIMEZONE).setVendor(RandomUser.CAMERA_VENDOR)
.setModel(RandomUser.CAMERA_MODEL_ID).setMacAddress(RandomUser.CAMERA_MAC).setName(PATCH_CAMERA_NAME).setPublic(false)
.setOnline(true).setLocation(RandomUser.LOCATION_LAT_STRING, RandomUser.LOCATION_LNG_STRING)
.setDiscoverable(true)
.build();
Camera patchCamera = Camera.patch(detail);
assertEquals(PATCH_CAMERA_NAME, patchCamera.getName());
assertTrue(patchCamera.isOnline());
assertEquals(false, patchCamera.isPublic());
assertEquals(RandomUser.CAMERA_INTERNAL_HOST, patchCamera.getInternalHost());
assertEquals(RandomUser.CAMERA_INTERNAL_HTTP, patchCamera.getInternalHttpPort());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP, patchCamera.getInternalRtspPort());
assertEquals(RandomUser.CAMERA_EXTERNAL_HOST, patchCamera.getExternalHost());
assertEquals(RandomUser.CAMERA_EXTERNAL_HTTP, patchCamera.getExternalHttpPort());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP, patchCamera.getExternalRtspPort());
assertEquals(RandomUser.CAMERA_USERNAME, patchCamera.getUsername());
assertEquals(RandomUser.CAMERA_PASSWORD, patchCamera.getPassword());
// assertEquals(RandomUser.CAMERA_JPG_URL, patchCamera.getJpgUrl());
// assertEquals(RandomUser.CAMERA_RTSP_URL, patchCamera.getRtspUrl());
assertEquals(RandomUser.CAMERA_TIMEZONE, patchCamera.getTimezone());
assertEquals(RandomUser.CAMERA_VENDOR, patchCamera.getVendorId());
assertEquals(RandomUser.CAMERA_VENDOR_NAME, patchCamera.getVendorName());
assertEquals(RandomUser.CAMERA_MAC, patchCamera.getMacAddress());
assertEquals(RandomUser.CAMERA_MODEL_NAME, patchCamera.getModelName());
assertEquals(RandomUser.CAMERA_MODEL_ID, patchCamera.getModelId());
assertTrue(patchCamera.isDiscoverable());
assertEquals(RandomUser.LOCATION_LNG, patchCamera.getLocation().getLng(), 0);
assertEquals(RandomUser.LOCATION_LAT, patchCamera.getLocation().getLat(), 0);
assertNotNull(patchCamera.getProxyUrl().getHls());
assertNotNull(patchCamera.getProxyUrl().getRtmp());
// assertTrue(patchCamera.isOwned()); FIXME!
assertEquals(RandomUser.CAMERA_INTERNAL_URL, patchCamera.getInternalCameraEndpoint());
assertEquals(RandomUser.CAMERA_EXTERNAL_URL, patchCamera.getExternalCameraEndpoint());
assertEquals(RandomUser.CAMERA_INTERNAL_JPG_URL, patchCamera.getInternalJpgUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_JPG_URL, patchCamera.getExternalJpgUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP_URL, patchCamera.getInternalH264Url());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP_URL, patchCamera.getExternalH264Url());
assertEquals(RandomUser.CAMERA_INTERNAL_RTSP_URL_WITH_AUTH, patchCamera.getInternalH264UrlWithCredential());
assertEquals(RandomUser.CAMERA_EXTERNAL_RTSP_URL_WITH_AUTH, patchCamera.getExternalH264UrlWithCredential());
assertEquals(RandomUser.CAMERA_INTERNAL_MJPG_URL, patchCamera.getInternalObject().getHttp().getMjpgUrl());
//No external MJPG url in API
//assertEquals(RandomUser.CAMERA_EXTERNAL_MJPG_URL, patchCamera.getExternalObject().getHttp().getMjpgUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_MPEG_URL, patchCamera.getInternalObject().getRtsp().getMpegUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_MPEG_URL, patchCamera.getExternalObject().getRtsp().getMpegUrl());
assertEquals(RandomUser.CAMERA_INTERNAL_AUDIO_URL, patchCamera.getInternalObject().getRtsp().getAudioUrl());
assertEquals(RandomUser.CAMERA_EXTERNAL_AUDIO_URL, patchCamera.getExternalObject().getRtsp().getAudioUrl());
//Delete the user after testing
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
assertTrue(User.delete(randomUser.getUsername()));
API.setUserKeyPair(null, null);
//API.URL = TestURL.URL;
}
@Test
public void testCameraGetByIdAndIdSet() throws EvercamException {
RandomUser randomUser = new RandomUser();
Camera randomCamera1 = randomUser.addRandomCamera(true);
ApiKeyPair apiKeyPair = API.requestUserKeyPairFromEvercam(randomUser.getUsername(), randomUser.getPassword());
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
Camera camera = Camera.getById(randomCamera1.getId(), false);
assertEquals(randomCamera1.getId(), camera.getId());
assertEquals(randomUser.getUsername(), camera.getOwner());
assertEquals(2, camera.getEndpoints().size());
Camera randomCamera2 = randomUser.addRandomCamera(true);
API.setUserKeyPair(apiKeyPair.getApiKey(), apiKeyPair.getApiId());
String idSet = randomCamera1.getId() + "," + randomCamera2.getId();
ArrayList<Camera> camerasSet = Camera.getByIdSet(idSet);
Assert.assertEquals(2, camerasSet.size());
API.setUserKeyPair(null, null);
}
//TODO: Test for get snapshot. Currently it's disabled because test server doesn't work well with snapshot
// @Test
// public void testGetSnapshot() throws EvercamException, IOException
// {
// API.setUserKeyPair(LocalConstants.API_KEY, LocalConstants.API_ID);
// InputStream stream = Camera.getSnapshotByCameraId("evercam-remembrance-camera");
// byte[] byteSnapshot = IOUtils.toByteArray(stream);
// System.out.println(byteSnapshot.length);
// Assert.assertTrue(byteSnapshot.length > 200);
// API.setUserKeyPair(null, null);
// }
@Test
public void testTestSnapshot() throws EvercamException {
//FIXME: The test request is send to the production server
API.resetUrl();
String URL = "http://" + LocalConstants.IP + ":" + LocalConstants.HTTP_PORT;
String ENDING = LocalConstants.SNAPSHOT_ENDING;
Snapshot snapshot = Camera.testSnapshot(URL, ENDING, LocalConstants.USERNAME, LocalConstants.PASSWORD, LocalConstants.VENDOR_ID, LocalConstants.CAMERA_EXID);
assertNotNull(snapshot);
Assert.assertTrue(snapshot.getData().length > 0);
API.URL = TestURL.URL;
}
@AfterClass
public static void destroyClass() {
}
}