chromium/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/ChromeTabbedActivityPublicTransitEntryPoints.java

// Copyright 2023 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.test.transit;

import org.chromium.base.test.transit.BatchedPublicTransitRule;
import org.chromium.base.test.transit.EntryPointSentinelStation;
import org.chromium.base.test.transit.Station;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.transit.ntp.RegularNewTabPageStation;
import org.chromium.chrome.test.transit.page.PageStation;
import org.chromium.chrome.test.transit.page.WebPageStation;
import org.chromium.components.embedder_support.util.UrlConstants;

import java.util.concurrent.Callable;

/** Entry points for Public Transit tests that use ChromeTabbedActivity. */
public class ChromeTabbedActivityPublicTransitEntryPoints {
    private final ChromeTabbedActivityTestRule mActivityTestRule;
    private static ChromeTabbedActivity sActivity;

    public ChromeTabbedActivityPublicTransitEntryPoints(
            ChromeTabbedActivityTestRule chromeTabbedActivityTestRule) {
        mActivityTestRule = chromeTabbedActivityTestRule;
    }

    /**
     * Start the test in a blank page.
     *
     * @return the active entry {@link PageStation}
     */
    public WebPageStation startOnBlankPageNonBatched() {
        EntryPointSentinelStation sentinel = new EntryPointSentinelStation();
        sentinel.setAsEntryPoint();

        WebPageStation entryPageStation = WebPageStation.newBuilder().withEntryPoint().build();
        return sentinel.travelToSync(
                entryPageStation, mActivityTestRule::startMainActivityOnBlankPage);
    }

    /**
     * Start the test in an NTP.
     *
     * @return the active entry {@link RegularNewTabPageStation}
     */
    public RegularNewTabPageStation startOnNtpNonBatched() {
        EntryPointSentinelStation sentinel = new EntryPointSentinelStation();
        sentinel.setAsEntryPoint();
        RegularNewTabPageStation entryPageStation =
                RegularNewTabPageStation.newBuilder().withEntryPoint().build();
        return sentinel.travelToSync(
                entryPageStation,
                () -> mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL));
    }

    /**
     * Start the batched test in a blank page.
     *
     * @return the active entry {@link WebPageStation}
     */
    public WebPageStation startOnBlankPage(BatchedPublicTransitRule<WebPageStation> batchedRule) {
        return startBatched(batchedRule, this::startOnBlankPageNonBatched);
    }

    /**
     * Start the batched test in the New Tab Page.
     *
     * @return the active entry {@link RegularNewTabPageStation}
     */
    public RegularNewTabPageStation startOnNtp(
            BatchedPublicTransitRule<RegularNewTabPageStation> batchedRule) {
        return startBatched(batchedRule, this::startOnNtpNonBatched);
    }

    private <T extends Station> T startBatched(
            BatchedPublicTransitRule<T> batchedRule, Callable<T> entryPointCallable) {
        mActivityTestRule.setFinishActivity(false);
        T station = batchedRule.getHomeStation();
        if (station == null) {
            try {
                station = entryPointCallable.call();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            sActivity = mActivityTestRule.getActivity();
        } else {
            mActivityTestRule.setActivity(sActivity);
        }
        return station;
    }

    /**
     * Hop onto Public Transit when the test has already started the ChromeTabbedActivity in a blank
     * page.
     *
     * @return the active entry {@link WebPageStation}
     */
    public WebPageStation alreadyStartedOnBlankPageNonBatched() {
        EntryPointSentinelStation sentinel = new EntryPointSentinelStation();
        sentinel.setAsEntryPoint();

        WebPageStation entryPageStation = WebPageStation.newBuilder().withEntryPoint().build();
        return sentinel.travelToSync(entryPageStation, /* trigger= */ null);
    }
}