/*
* Copyright 2010-2014 the original author or authors.
*
* 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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 org.springframework.mobile.device;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
public class LiteDeviceResolverTest {
private static final String MOBILE_TO_STRING = "[LiteDevice type=MOBILE]";
private static final String TABLET_TO_STRING = "[LiteDevice type=TABLET]";
private static final String NORMAL_TO_STRING = "[LiteDevice type=NORMAL]";
private LiteDeviceResolver resolver = new LiteDeviceResolver();
private MockMobileRequest request = new MockMobileRequest();
@Before
public void setUp() {
resolver.getNormalUserAgentKeywords().clear();
}
@Test
public void wapProfileHeader() {
request.setWapProfileHeader(WapProfile.NOKIA3650_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void profileHeader() {
request.setProfileHeader(WapProfile.NOKIA3650_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void userAgentHeaderPrefix() {
request.setUserAgentHeader(UserAgent.PALM_CENTRO_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void acceptHeader() {
request.addHeader(
"Accept",
"application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*");
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void userAgentKeyword() {
request.setUserAgentHeader(UserAgent.IPHONE_IOS5_STRING);
assertMobile(request);
assertIOSPlatform(request);
}
@Test
public void operaMini() {
request.addHeader(
"X-OperaMini-Phone-UA",
"X-OperaMini-Phone-UA: SonyEricssonK750i/R1AA Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1");
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void notMobileNoHeaders() {
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void normalDeviceMobileOverride() {
String[] normalDevices = new String[] { "android", "iphone" };
resolver.getNormalUserAgentKeywords().addAll(Arrays.asList(normalDevices));
request.setUserAgentHeader(UserAgent.IPHONE_IOS5_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void normalDeviceTabletOverride() {
String[] normalDevices = new String[] { "ipad" };
resolver.getNormalUserAgentKeywords().addAll(Arrays.asList(normalDevices));
request.setUserAgentHeader(UserAgent.IPAD_IOS5_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void constructorNormalDeviceOverride() {
String[] normalDevices = new String[] { "android", "iphone" };
LiteDeviceResolver resolver2 = new LiteDeviceResolver(
Arrays.asList(normalDevices));
request.setUserAgentHeader(UserAgent.IPHONE_IOS5_STRING);
Device device = resolver2.resolveDevice(request);
assertTrue(device.isNormal());
assertFalse(device.isMobile());
assertFalse(device.isTablet());
assertEquals(device.toString(), NORMAL_TO_STRING);
assertIOSPlatform(request);
}
// Normal device User-Agent tests
@Test
public void osX_10_7_3_Safari5_1_5() {
request.setUserAgentHeader(UserAgent.OSX_10_7_3_SAFARI5_1_5_STRING);
Device device = resolver.resolveDevice(request);
assertEquals(device.toString(), NORMAL_TO_STRING);
assertUnknownPlatform(request);
}
@Test
public void osX_10_6_FireFox3_6() {
request.setUserAgentHeader(UserAgent.OSX_10_6_FIREFOX3_6_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void windowsXP_IE8() {
request.setUserAgentHeader(UserAgent.WINDOWSXP_IE8_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void windowsRT_IE10() {
request.setUserAgentHeader(UserAgent.WINDOWSRT_IE10_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void windowsRT_IE10_touch() {
request.setUserAgentHeader(UserAgent.WINDOWSRT_IE10_TOUCH_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void windows8_1_IE11() {
request.setUserAgentHeader(UserAgent.WINDOWS8_1_IE_11_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
@Test
public void windows8_1_IE11_compatibility() {
request.setUserAgentHeader(UserAgent.WINDOWS8_1_IE11_COMPATIBILITY_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
// Mobile device User-Agent tests
@Test
public void iPodTouch() {
request.setUserAgentHeader(UserAgent.IPODTOUCH_IOS1_1_3_STRING);
assertMobile(request);
assertIOSPlatform(request);
}
@Test
public void iPhone_iOS5() {
request.setUserAgentHeader(UserAgent.IPHONE_IOS5_STRING);
assertMobile(request);
assertIOSPlatform(request);
}
@Test
public void iPhone_iOS6() {
request.setUserAgentHeader(UserAgent.IPHONE_IOS6_STRING);
assertMobile(request);
assertIOSPlatform(request);
}
@Test
public void iPhone_iOS7() {
request.setUserAgentHeader(UserAgent.IPHONE_IOS7_STRING);
assertMobile(request);
assertIOSPlatform(request);
}
@Test
public void googleNexusOne() {
request.setUserAgentHeader(UserAgent.GOOGLE_NEXUSONE_ANDROID2_1_STRING);
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void googleNexusS() {
request.setUserAgentHeader(UserAgent.GOOGLE_NEXUSS_ANDROID2_3_STRING);
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void samsungGalaxyNexus() {
request.setUserAgentHeader(UserAgent.SAMSUNG_GALAXYNEXUS_ANDROID4_STRING);
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void blackBerry9850() {
request.setUserAgentHeader(UserAgent.BLACKBERRY9850_OS7_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void blackBerry9800() {
request.setUserAgentHeader(UserAgent.BLACKBERRY9800_OS5_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void blackBerryTouch() {
request.setUserAgentHeader(UserAgent.BLACKBERRY_TOUCH_OS10_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void palmCentro() {
request.setUserAgentHeader(UserAgent.PALM_CENTRO_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void palmPre() {
request.setUserAgentHeader(UserAgent.PALM_PRE_WEBOS1_4_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void palmPre2() {
request.setUserAgentHeader(UserAgent.PALM_PRE2_WEBOS2_1_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void hpPre3() {
request.setUserAgentHeader(UserAgent.HP_PRE3_WEBOS2_1_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void palmPixi() {
request.setUserAgentHeader(UserAgent.PALM_PIXI_WEBOS1_4_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void kindleFireGen1SilkMobile() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE1_SILK_MOBILE_STRING);
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void kindleFireGen2SilkMobile() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE2_SILK_MOBILE_STRING);
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void firefoxOSMobile() {
request.setUserAgentHeader(UserAgent.FIREFOXOS_MOBILE_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void asusGalaxy6() {
request.setUserAgentHeader(UserAgent.ASUS_GALAXY6_WINDOWSPHONE7_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void samsungFocus() {
request.setUserAgentHeader(UserAgent.SAMSUNG_FOCUS_WINDOWSPHONE7_5_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void nokiaLumia920_mobile() {
request.setUserAgentHeader(UserAgent.NOKIA_LUMIA920_WINDOWSPHONE8_MOBILE_STRING);
assertMobile(request);
assertUnknownPlatform(request);
}
@Test
public void nokiaLumia920_desktop() {
request.setUserAgentHeader(UserAgent.NOKIA_LUMIA920_WINDOWSPHONE8_DESKTOP_STRING);
assertNormal(request);
assertUnknownPlatform(request);
}
// Tablet device User-Agent tests
@Test
public void iPad_iOS3_2() {
request.setUserAgentHeader(UserAgent.IPAD_IOS3_2_STRING);
assertTablet(request);
assertIOSPlatform(request);
}
@Test
public void iPad_iOS4_3_5() {
request.setUserAgentHeader(UserAgent.IPAD_IOS4_3_5_STRING);
assertTablet(request);
assertIOSPlatform(request);
}
@Test
public void iPad_iOS5() {
request.setUserAgentHeader(UserAgent.IPAD_IOS5_STRING);
assertTablet(request);
}
@Test
public void iPad_iOS6() {
request.setUserAgentHeader(UserAgent.IPAD_IOS6_STRING);
assertTablet(request);
assertIOSPlatform(request);
}
@Test
public void iPad_iOS7() {
request.setUserAgentHeader(UserAgent.IPAD_IOS7_STRING);
assertTablet(request);
assertIOSPlatform(request);
}
@Test
public void samsungGalaxyTab() {
request.setWapProfileHeader(WapProfile.SAMSUNG_GALAXYTAB_GT_P1000_STRING);
request.setUserAgentHeader(UserAgent.SAMSUNG_GALAXYTAB_GT_P1000_ANDROID2_2_STRING);
// Device reports standard Android user agent, indicating it as a mobile device
assertMobile(request);
assertAndroidPlatform(request);
}
@Test
public void samsungGalaxyTab10_1V() {
request.setUserAgentHeader(UserAgent.SAMSUNG_GALAXYTAB10_1V_GT_P7100_ANDROID3_0_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
@Test
public void samsungGalaxyTab10_1() {
request.setWapProfileHeader(WapProfile.SAMSUNG_GALAXYTAB10_1_GT_P7510_STRING);
request.setUserAgentHeader(UserAgent.SAMSUNG_GALAXYTAB10_1_GT_P7510_ANDROID3_1_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
@Test
public void samsungGalaxyTab8_9() {
request.setWapProfileHeader(WapProfile.SAMSUNG_GALAXYTAB8_9_GT_P7310_STRING);
request.setUserAgentHeader(UserAgent.SAMSUNG_GALAXYTAB8_9_GT_P7310_ANDROID3_1_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
@Test
public void motorolaXoom() {
request.setUserAgentHeader(UserAgent.MOTOROLA_XOOM_ANDROID3_1_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
@Test
public void blackBerryPlaybook() {
request.setUserAgentHeader(UserAgent.BLACKBERRY_PLAYBOOK_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void hpTouchPad() {
request.setUserAgentHeader(UserAgent.HPTOUCHPAD_WEBOS3_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindle1() {
request.setUserAgentHeader(UserAgent.KINDLE1_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindle2() {
request.setUserAgentHeader(UserAgent.KINDLE2_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindle2_5() {
request.setUserAgentHeader(UserAgent.KINDLE2_5_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindle3() {
request.setUserAgentHeader(UserAgent.KINDLE3_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindleFireGen1SilkDesktop() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE1_SILK_DESKTOP_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindleFireGen1AndroidWebView() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE2_ANDROID_WEBVIEW_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
@Test
public void kindleFireGen2SilkDesktop() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE2_SILK_DESKTOP_STRING);
assertTablet(request);
assertUnknownPlatform(request);
}
@Test
public void kindleFireGen2AndroidWebView() {
request.setUserAgentHeader(UserAgent.KINDLE_FIRE2_ANDROID_WEBVIEW_STRING);
assertTablet(request);
assertAndroidPlatform(request);
}
// helpers
private void assertNormal(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertTrue(device.isNormal());
assertFalse(device.isMobile());
assertFalse(device.isTablet());
assertEquals(device.toString(), NORMAL_TO_STRING);
}
private void assertMobile(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertFalse(device.isNormal());
assertTrue(device.isMobile());
assertFalse(device.isTablet());
assertEquals(device.toString(), MOBILE_TO_STRING);
}
private void assertTablet(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertFalse(device.isNormal());
assertFalse(device.isMobile());
assertTrue(device.isTablet());
assertEquals(device.toString(), TABLET_TO_STRING);
}
private void assertIOSPlatform(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertEquals(device.getDevicePlatform(), DevicePlatform.IOS);
}
private void assertAndroidPlatform(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertEquals(device.getDevicePlatform(), DevicePlatform.ANDROID);
}
private void assertUnknownPlatform(MockMobileRequest request) {
Device device = resolver.resolveDevice(request);
assertEquals(device.getDevicePlatform(), DevicePlatform.UNKNOWN);
}
private static class MockMobileRequest extends MockHttpServletRequest {
private static final String USER_AGENT = "User-Agent";
private static final String X_WAP_PROFILE = "x-wap-profile";
private static final String PROFILE = "Profile";
public void setUserAgentHeader(String value) {
this.addHeader(USER_AGENT, value);
}
public void setWapProfileHeader(String value) {
this.addHeader(X_WAP_PROFILE, value);
}
public void setProfileHeader(String value) {
this.addHeader(PROFILE, value);
}
}
}