/*
* Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* 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://aws.amazon.com/apache2.0
*
* This file 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 com.amazonaws.mobileconnectors.pinpoint.targeting;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.amazonaws.mobileconnectors.pinpoint.analytics.MobileAnalyticsTestBase;
import com.amazonaws.mobileconnectors.pinpoint.analytics.utils.AnalyticsContextBuilder;
import com.amazonaws.mobileconnectors.pinpoint.internal.core.PinpointContext;
import com.amazonaws.mobileconnectors.pinpoint.internal.core.system.MockDeviceDetails;
import com.amazonaws.mobileconnectors.pinpoint.targeting.endpointProfile.EndpointProfile;
import com.amazonaws.services.pinpoint.AmazonPinpointClient;
import com.amazonaws.services.pinpoint.model.UpdateEndpointRequest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TargetingClientTest extends MobileAnalyticsTestBase {
private static final String SDK_NAME = "AppIntelligenceSDK-Analytics";
private static final String SDK_VERSION = "test";
private static final String UNIQUE_ID = "abc123";
private MockDeviceDetails testDeviceDetails;
private PinpointContext mockContext;
private TargetingClient targetingClient;
@Mock
AmazonPinpointClient mockPinpointServiceClient;
@Mock
ThreadPoolExecutor mockPinpointExecutor;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
testDeviceDetails = new MockDeviceDetails();
mockContext = new AnalyticsContextBuilder()
.withSdkInfo(SDK_NAME, SDK_VERSION)
.withUniqueIdValue(UNIQUE_ID)
.withDeviceDetails(testDeviceDetails)
.withPinpointServiceClient(mockPinpointServiceClient)
.withContext(Robolectric.application.getApplicationContext())
.build();
targetingClient = new TargetingClient(mockContext, mockPinpointExecutor);
}
@After
public void cleanup() {
targetingClient = null;
}
@Test
public void endpoint_globalAttributeAndMetricsAddedAfterEndpointCreation() {
final EndpointProfile endpointProfile = targetingClient.currentEndpoint();
final List attrVals = Arrays.asList(new String[]{"attr1", "attr2"});
endpointProfile.withAttribute(null,null).withMetric(null,null)
.withAttribute("attr", attrVals).withMetric("metric", 1.0);
assertThat(endpointProfile.getAllAttributes().size(), is(1));
assertThat(endpointProfile.getAllMetrics().size(), is(1));
assertThat(endpointProfile.getAttribute("attr"), is(attrVals));
assertThat(endpointProfile.getMetric("metric").intValue(), is(1));
endpointProfile.withAttribute("attr", null).withMetric("metric", null);
assertThat(endpointProfile.getAllAttributes().size(), is(0));
assertThat(endpointProfile.getAllMetrics().size(), is(0));
targetingClient.addAttribute("globalAttr", attrVals);
targetingClient.addMetric("globalMetric", 100.0);
targetingClient.currentEndpoint();
assertThat(targetingClient.currentEndpoint().getAllAttributes().size(), is(1));
assertThat(targetingClient.currentEndpoint().getAllMetrics().size(), is(1));
assertThat(targetingClient.currentEndpoint().getAttribute("globalAttr"), is(attrVals));
assertThat(targetingClient.currentEndpoint().getMetric("globalMetric").intValue(), is(100));
targetingClient.removeMetric(null);
targetingClient.removeMetric("globalMetric");
targetingClient.removeAttribute(null);
targetingClient.removeAttribute("globalAttr");
assertThat(targetingClient.currentEndpoint().getAllAttributes().size(), is(0));
assertThat(targetingClient.currentEndpoint().getAllMetrics().size(), is(0));
}
@Test
public void endpoint_globalAttributeAndMetricSpecific_doesNotOverrideLocalAttribute() {
final List attrVals1 = Arrays.asList(new String[]{"attr1", "attr2"});
final List attrVals2 = Arrays.asList(new String[]{"attr3", "attr4"});
targetingClient.addAttribute("c", attrVals1);
targetingClient.addMetric("metric", 3.0);
final EndpointProfile endpointProfile = targetingClient.currentEndpoint()
.withAttribute("c", attrVals2)
.withMetric("metric", 1.0);
assertThat(endpointProfile.getAttribute("c"), is(attrVals2));
assertThat(endpointProfile.getMetric("metric"), is(1.0));
}
@Test
public void updateEndpoint_enqueueEndpointForDeliveryCalled() {
targetingClient.updateEndpointProfile();
verifyAndRunExecutorService(1);
verify(mockPinpointServiceClient, times(1)).updateEndpoint(any(UpdateEndpointRequest.class));
}
private void verifyAndRunExecutorService(int numExpectedRunnables) {
final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(mockPinpointExecutor, times(numExpectedRunnables)).execute(runnableCaptor.capture());
for (final Runnable enqueueRunnable : runnableCaptor.getAllValues()) {
enqueueRunnable.run();
}
}
}