chromium/chrome/android/javatests/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorTest.java

// Copyright 2022 The Chromium Authors
// 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.feedback;

import android.app.Activity;

import androidx.test.filters.SmallTest;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.feedback.ChromeFeedbackCollector.InitParams;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileManager;
import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;

import java.util.List;

@RunWith(ChromeJUnit4ClassRunner.class)
@Batch(Batch.PER_CLASS)
public class ChromeFeedbackCollectorTest {
    private static final String FEEDBACK_URL = "https://google.com";
    private static final String FEEDBACK_CONSTANT = "feedbackContext";
    @Rule public ChromeBrowserTestRule mChromeBrowserTestRule = new ChromeBrowserTestRule();

    @Mock Activity mActivity;

    ChromeFeedbackCollector mCollector;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    @SmallTest
    @Feature({"Feedback"})
    public void testRegularProfile() {
        ThreadUtils.runOnUiThreadBlocking(
                () -> {
                    Profile profile = ProfileManager.getLastUsedRegularProfile();
                    InitParams params = new InitParams(profile, FEEDBACK_URL, FEEDBACK_CONSTANT);
                    mCollector =
                            new ChromeFeedbackCollector(
                                    mActivity, null, null, null, params, null, profile);
                });

        Assert.assertTrue(
                "FamilyInfoFeedbackSource should be present.", containsFamilyFeedbackSource());
    }

    @Test
    @SmallTest
    @Feature({"Feedback"})
    public void testIncognitoProfile() {
        ThreadUtils.runOnUiThreadBlocking(
                () -> {
                    Profile profile =
                            ProfileManager.getLastUsedRegularProfile().getPrimaryOTRProfile(true);
                    InitParams params = new InitParams(profile, FEEDBACK_URL, FEEDBACK_CONSTANT);
                    mCollector =
                            new ChromeFeedbackCollector(
                                    mActivity, null, null, null, params, null, profile);
                });

        // FamilyInfoFeedbackSource relies on IdentityManager which is not available for the
        // incognito profile. See https://crbug.com/1340320.
        Assert.assertFalse(
                "FamilyInfoFeedbackSource should not be present.", containsFamilyFeedbackSource());
    }

    private boolean containsFamilyFeedbackSource() {
        List<AsyncFeedbackSource> asyncSources = mCollector.getAsyncFeedbackSourcesForTesting();
        for (AsyncFeedbackSource source : asyncSources) {
            if (source instanceof FamilyInfoFeedbackSource) return true;
        }
        return false;
    }
}