chromium/components/browser_ui/site_settings/android/junit/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreferenceUnitTest.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.components.browser_ui.site_settings;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify;

import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD;

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.robolectric.annotation.Config;

import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;

/** Unit tests for {@link AddExceptionPreference}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class AddExceptionPreferenceUnitTest {
    @Rule public JniMocker mJniMocker = new JniMocker();

    @Mock private WebsitePreferenceBridge.Natives mWebsitePreferenceBridgeJniMock;

    private boolean mIsPatternValid;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mJniMocker.mock(WebsitePreferenceBridgeJni.TEST_HOOKS, mWebsitePreferenceBridgeJniMock);

        doAnswer(invocation -> mIsPatternValid)
                .when(mWebsitePreferenceBridgeJniMock)
                .isContentSettingsPatternValid(anyString());
        mIsPatternValid = false;
    }

    @Test
    public void testIsPatternValid() {
        assertTrue(
                "Empty pattern should be valid.",
                AddExceptionPreference.isPatternValid(
                        "", SiteSettingsCategory.Type.THIRD_PARTY_COOKIES));
        mIsPatternValid = true;
        assertTrue(
                "Pattern is valid when it has colon and the type is REQUEST_DESKTOP_SITE.",
                AddExceptionPreference.isPatternValid(
                        "https://www.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE));
        assertFalse(
                "Pattern is invalid when it has space.",
                AddExceptionPreference.isPatternValid(
                        "https:// google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE));
        assertFalse(
                "Pattern is invalid when it starts with dot.",
                AddExceptionPreference.isPatternValid(
                        ".google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE));
        mIsPatternValid = false;
        assertFalse(
                "Pattern is invalid when its ContentSettingsPattern is invalid.",
                AddExceptionPreference.isPatternValid(
                        "https://", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE));
    }

    @Test
    public void testUpdatePatternIfNeeded() {
        assertEquals(
                "Pattern should not be updated except for REQUEST_DESKTOP_SITE type.",
                "maps.google.com",
                AddExceptionPreference.updatePatternIfNeeded(
                        "maps.google.com", SiteSettingsCategory.Type.THIRD_PARTY_COOKIES, true));
        assertEquals(
                "Pattern should not be updated except for REQUEST_DESKTOP_SITE type.",
                "maps.google.com",
                AddExceptionPreference.updatePatternIfNeeded(
                        "maps.google.com", SiteSettingsCategory.Type.THIRD_PARTY_COOKIES, false));

        AddExceptionPreference.updatePatternIfNeeded(
                "https://maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, true);
        verify(mWebsitePreferenceBridgeJniMock)
                .toDomainWildcardPattern(eq("https://maps.google.com"));

        AddExceptionPreference.updatePatternIfNeeded(
                "https://maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, false);
        verify(mWebsitePreferenceBridgeJniMock).toHostOnlyPattern(eq("https://maps.google.com"));
    }

    @Test
    public void testGetPrimaryPattern() {
        assertEquals(
                "Primary pattern should always be the original pattern except for"
                        + " THIRD_PARTY_COOKIES type.",
                "maps.google.com",
                AddExceptionPreference.getPrimaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, true));
        assertEquals(
                "Primary pattern should always be the original pattern except for"
                        + " THIRD_PARTY_COOKIES type.",
                "maps.google.com",
                AddExceptionPreference.getPrimaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, false));
        assertEquals(
                "Primary pattern should be wildcard for THIRD_PARTY_COOKIES.",
                SITE_WILDCARD,
                AddExceptionPreference.getPrimaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.THIRD_PARTY_COOKIES, true));
    }

    @Test
    public void testGetSecondaryPattern() {
        assertEquals(
                "Secondary pattern should always be wildcard except for THIRD_PARTY_COOKIES type.",
                SITE_WILDCARD,
                AddExceptionPreference.getSecondaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, true));
        assertEquals(
                "Secondary pattern should always be wildcard except for THIRD_PARTY_COOKIES type.",
                SITE_WILDCARD,
                AddExceptionPreference.getSecondaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, false));
        assertEquals(
                "Secondary pattern should be the original pattern for THIRD_PARTY_COOKIES",
                "maps.google.com",
                AddExceptionPreference.getSecondaryPattern(
                        "maps.google.com", SiteSettingsCategory.Type.THIRD_PARTY_COOKIES, true));
    }
}