// 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);
    }
}
