/******************************************************************************* * Copyright (c) 2014 EclipseSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package com.eclipsesource.tabris.tracking.internal; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Locale; import java.util.UUID; import org.eclipse.rap.rwt.client.Client; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.eclipsesource.tabris.ClientStore; import com.eclipsesource.tabris.app.App; import com.eclipsesource.tabris.device.ClientDevice; import com.eclipsesource.tabris.device.ClientDevice.Platform; import com.eclipsesource.tabris.test.util.TabrisEnvironment; import com.eclipsesource.tabris.test.util.TabrisRequest; import com.eclipsesource.tabris.tracking.TrackingInfo; import com.eclipsesource.tabris.ui.UI; public class TrackingInfoFactoryTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); private UI ui; private ClientStore clientStore; private TabrisRequest request; @Before public void setUp() { Client client = mock( Client.class ); mockApp( client ); mockDevice( client ); mockClientStore( client ); environment.setClient( client ); request = environment.newRequest(); mockUi(); } private void mockUi() { Display display = new Display(); ui = mock( UI.class ); when( ui.getDisplay() ).thenReturn( display ); } private void mockApp( Client client ) { App app = mock( App.class ); when( app.getId() ).thenReturn( "appId" ); when( app.getTabrisVersion() ).thenReturn( "tabrisVersion" ); when( app.getVersion() ).thenReturn( "appVersion" ); when( client.getService( App.class ) ).thenReturn( app ); } private void mockDevice( Client client ) { ClientDevice device = mock( ClientDevice.class ); when( device.getLocale() ).thenReturn( Locale.CANADA ); when( device.getModel() ).thenReturn( "model" ); when( device.getOSVersion() ).thenReturn( "osVersion" ); when( device.getPlatform() ).thenReturn( Platform.ANDROID ); when( device.getVendor() ).thenReturn( "vendor" ); doReturn( Integer.valueOf( 23 ) ).when( device ).getTimezoneOffset(); doReturn( Float.valueOf( 23F ) ).when( device ).getScaleFactor(); when( client.getService( ClientDevice.class ) ).thenReturn( device ); } private void mockClientStore( Client client ) { clientStore = mock( ClientStore.class ); when( client.getService( ClientStore.class ) ).thenReturn( clientStore ); } @Test public void testCreatesNewClientIdOnFirstAccess() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String clientId = info.getClientId(); assertNotNull( UUID.fromString( clientId ) ); } @Test public void testStoresNewClientIdInClientStore() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String clientId = info.getClientId(); verify( clientStore ).add( TrackingInfoFactory.PROPERTY_ID, clientId ); } @Test public void testUsesClientIdFromClientStore() { String id = UUID.randomUUID().toString(); when( clientStore.get( TrackingInfoFactory.PROPERTY_ID ) ).thenReturn( id ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String clientId = info.getClientId(); assertEquals( id, clientId ); } @Test public void testObtainsAppId() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String appId = info.getAppId(); assertEquals( "appId", appId ); } @Test public void testObtainsTabrisVersion() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String tabrisVersion = info.getTabrisVersion(); assertEquals( "tabrisVersion", tabrisVersion ); } @Test public void testObtainsAppVersion() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String appVersion = info.getAppVersion(); assertEquals( "appVersion", appVersion ); } @Test public void testObtainsLocale() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); Locale clientLocale = info.getClientLocale(); assertSame( Locale.CANADA, clientLocale ); } @Test public void testObtainsModel() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String deviceModel = info.getDeviceModel(); assertEquals( "model", deviceModel ); } @Test public void testObtainsOsVersion() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String deviceOsVersion = info.getDeviceOsVersion(); assertEquals( "osVersion", deviceOsVersion ); } @Test public void testObtainsVendor() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String deviceVendor = info.getDeviceVendor(); assertEquals( "vendor", deviceVendor ); } @Test public void testObtainsPlatform() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); Platform platform = info.getPlatform(); assertSame( Platform.ANDROID, platform ); } @Test public void testObtainsTimezoneOffset() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); int clientTimezoneOffset = info.getClientTimezoneOffset(); assertEquals( 23, clientTimezoneOffset ); } @Test public void testObtainsScaleFactor() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); float scaleFactor = info.getScaleFactor(); assertEquals( 23F, scaleFactor, 0 ); } @Test public void testObtainsScreenResolution() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); Point screenResolution = info.getScreenResolution(); Rectangle bounds = ui.getDisplay().getBounds(); Point expectedResolution = new Point( bounds.width, bounds.height ); assertEquals( expectedResolution, screenResolution ); } @Test public void testObtainsUserAgent() { request.setHeader( "User-Agent", "foo" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String userAgent = info.getUserAgent(); assertEquals( "foo", userAgent ); } @Test public void testObtainsClientIpFrom_X_Forwarded_For() { request.setHeader( "X-Forwarded-For", "12.34.56.78" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertEquals( "12.34.56.78", ip ); } @Test public void testObtainsClientIpFrom_Proxy_Client_IP() { request.setHeader( "Proxy-Client-IP", "12.34.56.78" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertEquals( "12.34.56.78", ip ); } @Test public void testObtainsClientIpFrom_WL_Proxy_Client_IP() { request.setHeader( "WL-Proxy-Client-IP", "12.34.56.78" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertEquals( "12.34.56.78", ip ); } @Test public void testObtainsClientIpFrom_HTTP_CLIENT_IP() { request.setHeader( "HTTP_CLIENT_IP", "12.34.56.78" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertEquals( "12.34.56.78", ip ); } @Test public void testObtainsClientIpFrom_HTTP_X_FORWARDED_FOR() { request.setHeader( "HTTP_X_FORWARDED_FOR", "12.34.56.78" ); TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertEquals( "12.34.56.78", ip ); } @Test public void testObtainsClientIpFromRemoteAddressWithoutHeaders() { TrackingInfo info = TrackingInfoFactory.createInfo( ui.getDisplay() ); String ip = info.getClientIp(); assertNull( ip ); } }