blob: 11afabbc615765a709ed2701388aac725934acb4 [file] [log] [blame]
// Copyright 2020 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.translate;
import androidx.test.filters.MediumTest;
import org.hamcrest.Matchers;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Criteria;
import org.chromium.base.test.util.CriteriaHelper;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
import org.chromium.chrome.test.util.TranslateUtil;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
/**
* Tests for the translate info included in onProvideAssistContent.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@Batch(TranslateAssistContentTest.TRANSLATE_BATCH_NAME)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class TranslateAssistContentTest {
public static final String TRANSLATE_BATCH_NAME = "translate_batch_name";
@ClassRule
public static ChromeTabbedActivityTestRule sActivityTestRule =
new ChromeTabbedActivityTestRule();
@Rule
public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
new BlankCTATabInitialStateRule(sActivityTestRule, false);
private static final String TRANSLATE_PAGE = "/chrome/test/data/translate/fr_test.html";
private static final String NON_TRANSLATE_PAGE = "/chrome/test/data/android/test.html";
/**
* Returns true if a test that requires internet access should be skipped due to an
* out-of-process NetworkService. When the NetworkService is run out-of-process, a fake DNS
* resolver is used that will fail to resolve any non-local names. crbug.com/1134812 is tracking
* the changes to make the translate service mockable and remove the internet requirement.
*/
private boolean shouldSkipDueToNetworkService() {
return !ChromeFeatureList.isEnabled("NetworkServiceInProcess2");
}
@Before
public void setUp() {
TestThreadUtils.runOnUiThreadBlocking(
() -> TranslateBridge.setIgnoreMissingKeyForTesting(true));
}
@Test
@MediumTest
@Restriction(Restriction.RESTRICTION_TYPE_INTERNET)
@Features.DisableFeatures({ChromeFeatureList.TRANSLATE_ASSIST_CONTENT})
public void testAssistContentDisabled() throws TimeoutException, ExecutionException {
if (shouldSkipDueToNetworkService()) return;
// Load a page that triggers the translate recommendation.
final String url = sActivityTestRule.getTestServer().getURL(TRANSLATE_PAGE);
sActivityTestRule.loadUrl(url);
TranslateUtil.waitUntilTranslatable(sActivityTestRule.getActivity().getActivityTab());
String structuredData = TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateAssistContent.getTranslateDataForTab(
sActivityTestRule.getActivity().getActivityTab(),
/*isInOverviewMode=*/false));
Assert.assertNull(structuredData);
}
@Test
@MediumTest
@Restriction(Restriction.RESTRICTION_TYPE_INTERNET)
@Features.EnableFeatures({ChromeFeatureList.TRANSLATE_ASSIST_CONTENT})
@Features.DisableFeatures({ChromeFeatureList.TRANSLATE_TFLITE})
public void testAssistContentTranslatablePage()
throws TimeoutException, ExecutionException, JSONException {
if (shouldSkipDueToNetworkService()) return;
// Load a page that triggers the translate recommendation.
final String url = sActivityTestRule.getTestServer().getURL(TRANSLATE_PAGE);
sActivityTestRule.loadUrl(url);
TranslateUtil.waitUntilTranslatable(sActivityTestRule.getActivity().getActivityTab());
String structuredData = TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateAssistContent.getTranslateDataForTab(
sActivityTestRule.getActivity().getActivityTab(),
/*isInOverviewMode=*/false));
JSONObject parsed = new JSONObject(structuredData);
Assert.assertEquals(TranslateAssistContent.TYPE_VALUE,
parsed.getString(TranslateAssistContent.TYPE_KEY));
Assert.assertEquals(url, parsed.getString(TranslateAssistContent.URL_KEY));
Assert.assertEquals("fr", parsed.getString(TranslateAssistContent.IN_LANGUAGE_KEY));
Assert.assertEquals("en",
parsed.getJSONObject(TranslateAssistContent.WORK_TRANSLATION_KEY)
.getString(TranslateAssistContent.IN_LANGUAGE_KEY));
}
@Test
@MediumTest
@Restriction(Restriction.RESTRICTION_TYPE_INTERNET)
@Features.EnableFeatures({ChromeFeatureList.TRANSLATE_ASSIST_CONTENT})
@Features.DisableFeatures({ChromeFeatureList.TRANSLATE_TFLITE})
public void testAssistContentTranslatedPage()
throws TimeoutException, ExecutionException, JSONException {
if (shouldSkipDueToNetworkService()) return;
// Load a page that triggers the translate recommendation.
final String url = sActivityTestRule.getTestServer().getURL(TRANSLATE_PAGE);
sActivityTestRule.loadUrl(url);
TranslateUtil.waitUntilTranslatable(sActivityTestRule.getActivity().getActivityTab());
TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateBridge.translateTabWhenReady(
sActivityTestRule.getActivity().getActivityTab()));
// Can't wait on the Translate infobar state here because the target language tab is
// selected before the translation is complete. Wait for the language to change instead.
CriteriaHelper.pollUiThread(() -> {
Criteria.checkThat(TranslateBridge.getCurrentLanguage(
sActivityTestRule.getActivity().getActivityTab()),
Matchers.is("en"));
});
String structuredData = TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateAssistContent.getTranslateDataForTab(
sActivityTestRule.getActivity().getActivityTab(),
/*isInOverviewMode=*/false));
JSONObject parsed = new JSONObject(structuredData);
Assert.assertEquals(TranslateAssistContent.TYPE_VALUE,
parsed.getString(TranslateAssistContent.TYPE_KEY));
Assert.assertEquals(url, parsed.getString(TranslateAssistContent.URL_KEY));
Assert.assertEquals("en", parsed.getString(TranslateAssistContent.IN_LANGUAGE_KEY));
Assert.assertEquals("fr",
parsed.getJSONObject(TranslateAssistContent.TRANSLATION_OF_WORK_KEY)
.getString(TranslateAssistContent.IN_LANGUAGE_KEY));
}
@Test
@MediumTest
@Restriction(Restriction.RESTRICTION_TYPE_INTERNET)
@Features.EnableFeatures({ChromeFeatureList.TRANSLATE_ASSIST_CONTENT})
@DisabledTest(message = "https://crbug.com/1189385")
public void testAssistContentNonTranslatePage()
throws TimeoutException, ExecutionException, JSONException {
if (shouldSkipDueToNetworkService()) return;
// Load a page that can't be translated.
final String url = sActivityTestRule.getTestServer().getURL(NON_TRANSLATE_PAGE);
sActivityTestRule.loadUrl(url);
String structuredData = TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateAssistContent.getTranslateDataForTab(
sActivityTestRule.getActivity().getActivityTab(),
/*isInOverviewMode=*/false));
JSONObject parsed = new JSONObject(structuredData);
Assert.assertEquals(TranslateAssistContent.TYPE_VALUE,
parsed.getString(TranslateAssistContent.TYPE_KEY));
Assert.assertEquals(url, parsed.getString(TranslateAssistContent.URL_KEY));
Assert.assertFalse(parsed.has(TranslateAssistContent.IN_LANGUAGE_KEY));
Assert.assertFalse(parsed.has(TranslateAssistContent.TRANSLATION_OF_WORK_KEY));
Assert.assertFalse(parsed.has(TranslateAssistContent.WORK_TRANSLATION_KEY));
}
@Test
@MediumTest
@Restriction(Restriction.RESTRICTION_TYPE_INTERNET)
@Features.EnableFeatures({ChromeFeatureList.TRANSLATE_ASSIST_CONTENT})
public void testAssistContentOverviewMode() throws TimeoutException, ExecutionException {
if (shouldSkipDueToNetworkService()) return;
// Load a page that triggers the translate recommendation.
final String url = sActivityTestRule.getTestServer().getURL(TRANSLATE_PAGE);
sActivityTestRule.loadUrl(url);
TranslateUtil.waitUntilTranslatable(sActivityTestRule.getActivity().getActivityTab());
// Pretend we're in overview mode.
String structuredData = TestThreadUtils.runOnUiThreadBlocking(
()
-> TranslateAssistContent.getTranslateDataForTab(
sActivityTestRule.getActivity().getActivityTab(),
/*isInOverviewMode=*/true));
Assert.assertNull(structuredData);
}
}