/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.ui import androidx.core.net.toUri import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.helpers.TestSetup import org.mozilla.fenix.ui.robots.clickPageObject import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar class SettingsHTTPSOnlyModeTest : TestSetup() { private val httpPageUrl = "http://example.com/" private val httpsPageUrl = "https://example.com/" private val insecureHttpPage = "http.badssl.com" // "HTTPs not supported" error page contents: private val httpsOnlyErrorTitle = "Secure site not available" private val httpsOnlyErrorMessage = "Most likely, the website simply does not support HTTPS." private val httpsOnlyErrorMessage2 = "However, it’s also possible that an attacker is involved. If you continue to the website, you should not enter any sensitive info. If you continue, HTTPS-Only mode will be turned off temporarily for the site." private val httpsOnlyContinueButton = "Continue to HTTP Site" private val httpsOnlyBackButton = "Go Back (Recommended)" @get:Rule val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1724825 @Test fun httpsOnlyModeMenuItemsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { verifyHttpsOnlyModeMenuHeader() verifyHttpsOnlyModeSummary() verifyHttpsOnlyModeIsEnabled(false) verifyHttpsOnlyModeOptionsEnabled(false) verifyHttpsOnlyOptionSelected( allTabsOptionSelected = false, privateTabsOptionSelected = false, ) clickHttpsOnlyModeSwitch() verifyHttpsOnlyModeIsEnabled(true) verifyHttpsOnlyModeOptionsEnabled(true) verifyHttpsOnlyOptionSelected( allTabsOptionSelected = true, privateTabsOptionSelected = false, ) }.goBack { verifySettingsToolbar() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1724827 @SmokeTest @Test fun httpsOnlyModeEnabledInNormalBrowsingTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { clickHttpsOnlyModeSwitch() verifyHttpsOnlyOptionSelected( allTabsOptionSelected = true, privateTabsOptionSelected = false, ) }.goBack { verifySettingsOptionSummary("HTTPS-Only Mode", "On in all tabs") exitMenu() } navigationToolbar { }.enterURLAndEnterToBrowser(httpPageUrl.toUri()) { waitForPageToLoad() }.openNavigationToolbar { verifyUrl(httpsPageUrl) }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { verifyPageContent(httpsOnlyErrorTitle) verifyPageContent(httpsOnlyErrorMessage) verifyPageContent(httpsOnlyErrorMessage2) verifyPageContent(httpsOnlyBackButton) clickPageObject(itemContainingText(httpsOnlyBackButton)) verifyPageContent("Example Domain") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { clickPageObject(itemContainingText(httpsOnlyContinueButton)) verifyPageContent("http.badssl.com") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2091057 @Test fun httpsOnlyModeExceptionPersistsForCurrentSessionTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { clickHttpsOnlyModeSwitch() verifyHttpsOnlyOptionSelected( allTabsOptionSelected = true, privateTabsOptionSelected = false, ) exitMenu() } navigationToolbar { }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { verifyPageContent(httpsOnlyErrorTitle) clickPageObject(itemContainingText(httpsOnlyContinueButton)) verifyPageContent("http.badssl.com") }.openTabDrawer { closeTab() } navigationToolbar { }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { verifyPageContent("http.badssl.com") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1724828 @Test fun httpsOnlyModeEnabledOnlyInPrivateBrowsingTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { clickHttpsOnlyModeSwitch() selectHttpsOnlyModeOption( allTabsOptionSelected = false, privateTabsOptionSelected = true, ) }.goBack { verifySettingsOptionSummary("HTTPS-Only Mode", "On in private tabs") exitMenu() } navigationToolbar { }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { verifyPageContent("http.badssl.com") }.goToHomescreen { }.togglePrivateBrowsingMode() navigationToolbar { }.enterURLAndEnterToBrowser(httpPageUrl.toUri()) { waitForPageToLoad() }.openNavigationToolbar { verifyUrl(httpsPageUrl) }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { verifyPageContent(httpsOnlyErrorTitle) verifyPageContent(httpsOnlyErrorMessage) verifyPageContent(httpsOnlyErrorMessage2) verifyPageContent(httpsOnlyBackButton) clickPageObject(itemContainingText(httpsOnlyBackButton)) verifyPageContent("Example Domain") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(insecureHttpPage.toUri()) { clickPageObject(itemContainingText(httpsOnlyContinueButton)) verifyPageContent("http.badssl.com") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2091058 @Test fun turnOffHttpsOnlyModeTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { clickHttpsOnlyModeSwitch() verifyHttpsOnlyOptionSelected( allTabsOptionSelected = true, privateTabsOptionSelected = false, ) exitMenu() } navigationToolbar { }.enterURLAndEnterToBrowser(httpPageUrl.toUri()) { waitForPageToLoad() }.openNavigationToolbar { verifyUrl(httpsPageUrl) }.goBackToBrowserScreen { }.openThreeDotMenu { }.openSettings { }.openHttpsOnlyModeMenu { clickHttpsOnlyModeSwitch() verifyHttpsOnlyModeIsEnabled(false) }.goBack { verifySettingsOptionSummary("HTTPS-Only Mode", "Off") exitMenu() } navigationToolbar { }.enterURLAndEnterToBrowser(httpPageUrl.toUri()) { waitForPageToLoad() }.openNavigationToolbar { verifyUrl(httpPageUrl) } } }