blob: de1a96568337f21e0b277ca0fcebaf54e9824775 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.physicalweb;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.res.Resources;
import android.text.TextUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowResources;
import org.chromium.base.LocaleUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.R;
import java.util.Locale;
/**
* Tests for {@link PwsClientImpl}.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class PwsClientImplTest {
private static final String ACCEPT_LANGUAGES = "en-US,en";
PwsClientImpl mPwsClientImpl;
/**
* Robolectric shadow to mock out calls to {@link Resources#getString}.
*/
@Implements(Resources.class)
public static class AcceptLanguageShadowResources extends ShadowResources {
public static final Resources sResources = mock(Resources.class);
@Implementation
public CharSequence getText(int id) {
return sResources.getText(id);
}
}
@Before
public void setUp() throws Exception {
mPwsClientImpl = new PwsClientImpl();
}
@Test
public void testUserAgentNonEmpty() {
assertFalse(TextUtils.isEmpty(mPwsClientImpl.getUserAgent()));
}
@Test
@Config(shadows = AcceptLanguageShadowResources.class)
public void testLanguageTagIsIncludedInAcceptLanguageHeader() {
when(AcceptLanguageShadowResources.sResources.getText(R.string.accept_languages))
.thenReturn(ACCEPT_LANGUAGES);
String defaultLocaleString = LocaleUtils.getDefaultLocaleString();
String[] languageTags = defaultLocaleString.split(",");
// Ensure Accept-Language contains the full language tag.
String acceptLanguage = mPwsClientImpl.updateAcceptLanguage();
for (String tag : languageTags) {
assertTrue(acceptLanguage.contains(tag));
// Ensure Accept-Language also contains the language code by itself.
String languageCode;
if (tag.length() == 2 || tag.length() == 3) {
languageCode = tag;
} else if (tag.charAt(2) == '-') {
languageCode = tag.substring(0, 2);
} else { // length of the language code is 3.
languageCode = tag.substring(0, 3);
}
assertTrue(acceptLanguage.startsWith(languageCode + ",")
|| acceptLanguage.contains(languageCode + ";")
|| acceptLanguage.equals(languageCode));
}
}
@Test
public void testLanguageTagIsPrepended() {
Locale locale = new Locale("en", "GB");
String defaultLocale = LocaleUtils.toLanguageTag(locale);
String languageList = "fr-CA,fr-FR,fr";
// Should prepend the language tag "en-GB" as well as the language code "en".
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(defaultLocale, languageList);
assertEquals("en-GB,en,fr-CA,fr-FR,fr", languageListWithTag);
}
@Test
public void testLanguageOnlyTagIsPrepended() {
Locale locale = new Locale("mas");
String defaultLocale = LocaleUtils.toLanguageTag(locale);
String languageList = "fr-CA,fr-FR,fr";
// Should prepend the language code only language tag "aaa".
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(defaultLocale, languageList);
assertEquals("mas,fr-CA,fr-FR,fr", languageListWithTag);
}
@Test
public void testSpecialLengthCountryCodeIsPrepended() {
Locale locale = new Locale("es", "005");
String defaultLocale = LocaleUtils.toLanguageTag(locale);
String languageList = "fr-CA,fr-FR,fr";
// Should prepend the language tag "aa-AAA" as well as the language code "aa".
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(defaultLocale, languageList);
assertEquals("es-005,es,fr-CA,fr-FR,fr", languageListWithTag);
}
@Test
public void testMultipleLanguageTagIsPrepended() {
String locale = "jp-JP,is-IS";
String languageList = "en-US,en";
// Should prepend the language tag "aa-AA" as well as the language code "aa".
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(locale, languageList);
assertEquals("jp-JP,jp,is-IS,is,en-US,en", languageListWithTag);
// Make sure the language code is only inserted after the last languageTag that
// contains that language.
locale = "jp-JP,fr-CA,fr-FR";
languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(locale, languageList);
assertEquals("jp-JP,jp,fr-CA,fr-FR,fr,en-US,en", languageListWithTag);
}
@Test
public void testLanguageTagIsPrependedWhenListContainsLanguageCode() {
Locale locale = new Locale("fr", "FR");
String defaultLocale = LocaleUtils.toLanguageTag(locale);
String languageList = "fr-CA,fr";
// Should prepend the language tag "xx-XX" but not the language code "xx" as it's already
// included at the end of the list.
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(defaultLocale, languageList);
assertEquals("fr-FR,fr-CA,fr", languageListWithTag);
}
@Test
public void testLanguageTagNotPrependedWhenUnnecessary() {
Locale locale = new Locale("fr", "CA");
String defaultLocale = LocaleUtils.toLanguageTag(locale);
String languageList = "fr-CA,fr-FR,fr";
// Language list should be unmodified since the tag is already present.
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(defaultLocale, languageList);
assertEquals(languageList, languageListWithTag);
}
@Test
public void testMultiLanguageTagNotPrependedWhenUnnecessary() {
String locale = "fr-FR,is-IS";
String languageList = "fr-FR,is-IS,fr,is";
// Language list should be unmodified since the tag is already present. However, the order
// changes because a language-code-only language tag is acceptable now.
String languageListWithTag =
PwsClientImpl.prependToAcceptLanguagesIfNecessary(locale, languageList);
assertEquals(languageList, languageListWithTag);
}
@Test
public void testAcceptLanguageQvalues() {
String languageList = "en-US,en-GB,en,jp-JP,jp";
// Should insert q-values for each item except the first which implicitly has q=1.0.
String acceptLanguage = PwsClientImpl.generateAcceptLanguageHeader(languageList);
assertEquals("en-US,en-GB;q=0.8,en;q=0.6,jp-JP;q=0.4,jp;q=0.2", acceptLanguage);
// When there are six or more items, the q-value should not go below 0.2.
languageList = "mas,es,en,jp,ch,fr";
acceptLanguage = PwsClientImpl.generateAcceptLanguageHeader(languageList);
assertEquals("mas,es;q=0.8,en;q=0.6,jp;q=0.4,ch;q=0.2,fr;q=0.2", acceptLanguage);
}
}