package com.vistarmedia.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.matchers.JUnitMatchers.containsString; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.junit.Before; import org.junit.Test; import com.vistarmedia.api.message.Api.AdRequest; import com.vistarmedia.api.message.Api.AdResponse; import com.vistarmedia.api.message.Api.Advertisement; import com.vistarmedia.api.message.Api.ProofOfPlayResponse; import com.vistarmedia.api.result.AdResponseResult; import com.vistarmedia.api.result.ErrorResult; import com.vistarmedia.api.result.ProofOfPlayResult; import com.vistarmedia.api.transport.ErrorTransport; import com.vistarmedia.api.transport.NoResponseTransport; import com.vistarmedia.api.transport.SuccessTransport; import com.vistarmedia.api.transport.Transport; public class ApiClientTest { private AdRequest sampleAdRequest; @Before public void setUp() { long nowInSeconds = new Date().getTime() / 1000; sampleAdRequest = AdRequest.newBuilder().setNetworkId("network-id") .setApiKey("api-key").setDeviceId("internal-device-id") .setDisplayTime(nowInSeconds).setDirectConnection(true).build(); } @Test public void testSimpleAdResponse() throws InterruptedException, ExecutionException { byte[] responseBody = AdResponse.newBuilder().build().toByteArray(); Transport transport = new SuccessTransport(responseBody); ApiClient client = new ApiClient("host", 80, transport); Future<AdResponseResult> resultFuture = client .sendAdRequest(sampleAdRequest); AdResponseResult result = resultFuture.get(); assertTrue(result.isSuccess()); AdResponse resp = result.getResult(); assertNotNull(resp); } @Test public void testSimpleProofOfPlay() throws InterruptedException, ExecutionException { ProofOfPlayResponse pop = ProofOfPlayResponse.newBuilder() .setImpressions(123) .setMediaCost(456) .setSpots(789) .setErrors(0) .build(); Transport transport = new SuccessTransport(pop.toByteArray()); ApiClient client = new ApiClient("example.com", 80, transport); Advertisement ad = Advertisement .newBuilder() .setId("test-id") .setProofOfPlayUrl("http://example.com?id=123") .setLeaseExpiry(0) .setDisplayAreaId("displayarea") .setAssetId("asset-id") .setAssetUrl("asset-url") .setWidth(800) .setHeight(600) .setMimeType("text/plain") .setExpirationUrl("http://expireme.org") .setDisplayTime(123456789L) .setCampaignId(987654321L) .setLengthInSeconds(15) .setLengthInMilliseconds(15000) .setCreativeId("a0") .setCreativeCategory("a-category") .build(); Future<ProofOfPlayResult> popFuture = client.sendProofOfPlay(ad); ProofOfPlayResult result = popFuture.get(); assertTrue(result.isSuccess()); ProofOfPlayResponse popResp = result.getResult(); assertEquals(456, popResp.getMediaCost()); } @Test public void testSimpleSyncProofOfPlay() throws InterruptedException, ExecutionException, ApiRequestException { Transport transport = new SuccessTransport(getPopResponse().toByteArray()); ApiClient client = new ApiClient("example.com", 80, transport); Advertisement ad = Advertisement.newBuilder() .setId("test-id") .setProofOfPlayUrl("http://example.com?id=123") .setLeaseExpiry(0) .setDisplayAreaId("displayarea") .setAssetId("asset-id") .setAssetUrl("asset-url") .setWidth(800) .setHeight(600) .setMimeType("text/plain") .setExpirationUrl("http://expireme.org") .setDisplayTime(123456789L) .setCampaignId(987654321L) .setLengthInSeconds(15) .setLengthInMilliseconds(15000) .setCreativeId("a0") .setCreativeCategory("a-category") .build(); ProofOfPlayResponse result = client.getProofOfPlay(ad); assertEquals(0, result.getErrors()); } @Test public void testProofOfPlayWithDisplayTime() throws InterruptedException, ExecutionException { ProofOfPlayResponse pop = ProofOfPlayResponse.newBuilder() .setImpressions(123) .setMediaCost(456) .setSpots(789) .setErrors(0) .build(); Transport transport = new SuccessTransport(pop.toByteArray()); ApiClient client = new ApiClient("example.com", 80, transport); Advertisement ad = Advertisement.newBuilder() .setId("test-id") .setProofOfPlayUrl("http://example.com?id=123") .setLeaseExpiry(0) .setDisplayAreaId("displayarea") .setAssetId("asset-id") .setAssetUrl("asset-url") .setWidth(800) .setHeight(600) .setMimeType("text/plain") .setExpirationUrl("http://expireme.org") .setDisplayTime(123456789L) .setCampaignId(987654321L) .setLengthInSeconds(15) .setLengthInMilliseconds(15000) .setCreativeId("a0") .setCreativeCategory("a-category") .build(); int displayTime = 234567890; Future<ProofOfPlayResult> popFuture = client.sendProofOfPlay(ad, displayTime); ProofOfPlayResult result = popFuture.get(); assertTrue(result.isSuccess()); } @Test public void testSyncProofOfPlayWithDisplayTime() throws InterruptedException, ExecutionException, ApiRequestException { Transport transport = new SuccessTransport(getPopResponse().toByteArray()); ApiClient client = new ApiClient("example.com", 80, transport); Advertisement ad = Advertisement.newBuilder() .setId("test-id") .setProofOfPlayUrl("http://example.com?id=123") .setLeaseExpiry(0) .setDisplayAreaId("displayarea") .setAssetId("asset-id") .setAssetUrl("asset-url") .setWidth(800) .setHeight(600) .setMimeType("text/plain") .setExpirationUrl("http://expireme.org") .setDisplayTime(123456789L) .setLengthInSeconds(30) .setLengthInMilliseconds(30000) .setCampaignId(987654321L) .setCreativeId("a0") .setCreativeCategory("a-category") .build(); int displayTime = 234567890; ProofOfPlayResponse result = client.getProofOfPlay(ad, displayTime); assertEquals(456, result.getMediaCost()); } @Test public void testInvalidResponseBody() throws InterruptedException, ExecutionException { Transport transport = new SuccessTransport("invalid".getBytes()); ApiClient client = new ApiClient("host", 80, transport); AdResponseResult result = client.sendAdRequest(sampleAdRequest).get(); assertFalse(result.isSuccess()); ErrorResult error = result.getError(); assertEquals(500, error.getCode()); assertThat(error.getMessage(), containsString("the input ended unexpectedly")); } @Test(expected = TimeoutException.class) public void testResponseTimeout() throws InterruptedException, ExecutionException, TimeoutException { Transport transport = new NoResponseTransport(); ApiClient client = new ApiClient("host", 80, transport); Future<AdResponseResult> resultFuture = client .sendAdRequest(sampleAdRequest); assertFalse(resultFuture.isDone()); resultFuture.get(100, TimeUnit.MILLISECONDS); } @Test public void testRequestError() throws InterruptedException, ExecutionException { Transport transport = new ErrorTransport(404, "Not Found"); ApiClient client = new ApiClient("host", 80, transport); AdResponseResult result = client.sendAdRequest(sampleAdRequest).get(); assertFalse(result.isSuccess()); ErrorResult error = result.getError(); assertEquals(404, error.getCode()); assertEquals("Not Found", error.getMessage()); } @Test public void testSimpleSynchronousAdRequest() throws ApiRequestException { byte[] responseBody = AdResponse.newBuilder().build().toByteArray(); Transport transport = new SuccessTransport(responseBody); ApiClient client = new ApiClient("host", 80, transport); AdResponse response = client.getAdResponse(sampleAdRequest); assertNotNull(response); } @Test public void testMalformedSyncResponse() { Transport transport = new SuccessTransport("invalid".getBytes()); ApiClient client = new ApiClient("host", 80, transport); try { client.getAdResponse(sampleAdRequest); } catch (ApiRequestException e) { assertEquals(500, e.getCode()); assertThat(e.getMessage(), containsString("the input ended unexpectedly")); return; } fail("Exception should have been thrown"); } @Test public void testSyncResponseTimeout() { Transport transport = new NoResponseTransport(); ApiClient client = new ApiClient("host", 80, transport, 0); try { client.getAdResponse(sampleAdRequest); } catch (ApiRequestException e) { assertEquals(408, e.getCode()); assertEquals(e.getMessage(), "Response timed out"); return; } fail("Exception should have been thrown"); } @Test public void testBulkProofOfPlay() throws InterruptedException, ExecutionException { ProofOfPlayResponse resp = ProofOfPlayResponse.newBuilder() .setSpots(1) .setImpressions(100) .setMediaCost(53423) .setErrors(0) .build(); SuccessTransport t = new SuccessTransport(resp.toByteArray()); ApiClient client = new ApiClient("host", 80, t); List<Advertisement> ads = new ArrayList<Advertisement>(); for(int i = 0; i < 10; i++) { ads.add(getAdvertisement().build()); } ProofOfPlayResult res = client.sendProofsOfPlay(ads).get(); assertTrue(res.isSuccess()); ProofOfPlayResponse popResp = res.getResult(); assertEquals(1, popResp.getSpots()); assertEquals(53423, popResp.getMediaCost()); assertEquals(0, popResp.getErrors()); String post = new String(t.lastPostBody); String []lines = post.split("\n"); assertEquals(10, lines.length); assertEquals("http://host/spend", lines[0]); } private Advertisement.Builder getAdvertisement() { return Advertisement.newBuilder() .setProofOfPlayUrl("http://host/spend") .setExpirationUrl("http://host/expire") .setDisplayTime(1234567890) .setLeaseExpiry(1234567890) .setDisplayAreaId("1") .setCreativeId("2") .setAssetId("3") .setAssetUrl("http://assets/mov") .setWidth(800) .setHeight(600) .setMimeType("text/plain") .setLengthInSeconds(1) .setLengthInMilliseconds(1000) .setId("123") .setCampaignId(12345) .setCreativeCategory("ads"); } private ProofOfPlayResponse getPopResponse() { return ProofOfPlayResponse.newBuilder() .setImpressions(123) .setMediaCost(456) .setSpots(789) .setErrors(0) .build(); } }