blob: b1e20de36349389fb62d4be4d97dfc26a0db80c6 [file] [log] [blame]
// Copyright 2021 The Chromium OS 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 arcappcompat will have tast tests for android apps on Chromebooks.
package arcappcompat
import (
"context"
"time"
"chromiumos/tast/common/android/ui"
"chromiumos/tast/local/arc"
"chromiumos/tast/local/bundles/cros/arcappcompat/pre"
"chromiumos/tast/local/bundles/cros/arcappcompat/testutil"
"chromiumos/tast/local/chrome"
"chromiumos/tast/testing"
"chromiumos/tast/testing/hwdep"
)
// clamshellLaunchForReddit launches Reddit in clamshell mode.
var clamshellLaunchForReddit = []testutil.TestCase{
{Name: "Launch app in Clamshell", Fn: launchAppForReddit},
}
// touchviewLaunchForReddit launches Reddit in tablet mode.
var touchviewLaunchForReddit = []testutil.TestCase{
{Name: "Launch app in Touchview", Fn: launchAppForReddit},
}
func init() {
testing.AddTest(&testing.Test{
Func: Reddit,
LacrosStatus: testing.LacrosVariantUnneeded,
Desc: "Functional test for Reddit that installs the app also verifies it is logged in and that the main page is open, checks Reddit correctly changes the window state in both clamshell and touchview mode",
Contacts: []string{"mthiyagarajan@chromium.org", "cros-appcompat-test-team@google.com"},
Attr: []string{"group:appcompat"},
SoftwareDeps: []string{"chrome"},
Params: []testing.Param{{
Name: "clamshell_mode",
Val: testutil.TestParams{
LaunchTests: clamshellLaunchForReddit,
CommonTests: testutil.ClamshellCommonTests,
},
ExtraSoftwareDeps: []string{"android_p"},
// TODO(b/189704585): Remove hwdep.SkipOnModel once the solution is found.
// Skip on tablet only models.
ExtraHardwareDeps: hwdep.D(hwdep.SkipOnModel(testutil.TabletOnlyModels...)),
Pre: pre.AppCompatBootedUsingTestAccountPool,
}, {
Name: "tablet_mode",
Val: testutil.TestParams{
LaunchTests: touchviewLaunchForReddit,
CommonTests: testutil.TouchviewCommonTests,
},
ExtraSoftwareDeps: []string{"android_p"},
// TODO(b/189704585): Remove hwdep.SkipOnModel once the solution is found.
// Skip on clamshell only models.
ExtraHardwareDeps: hwdep.D(hwdep.TouchScreen(), hwdep.SkipOnModel(testutil.ClamshellOnlyModels...)),
Pre: pre.AppCompatBootedInTabletModeUsingTestAccountPool,
}, {
Name: "vm_clamshell_mode",
Val: testutil.TestParams{
LaunchTests: clamshellLaunchForReddit,
CommonTests: testutil.ClamshellCommonTests,
},
ExtraSoftwareDeps: []string{"android_vm"},
// TODO(b/189704585): Remove hwdep.SkipOnModel once the solution is found.
// Skip on tablet only models.
ExtraHardwareDeps: hwdep.D(hwdep.SkipOnModel(testutil.TabletOnlyModels...)),
Pre: pre.AppCompatBootedUsingTestAccountPool,
}, {
Name: "vm_tablet_mode",
Val: testutil.TestParams{
LaunchTests: touchviewLaunchForReddit,
CommonTests: testutil.TouchviewCommonTests,
},
ExtraSoftwareDeps: []string{"android_vm"},
// TODO(b/189704585): Remove hwdep.SkipOnModel once the solution is found.
// Skip on clamshell only models.
ExtraHardwareDeps: hwdep.D(hwdep.TouchScreen(), hwdep.SkipOnModel(testutil.ClamshellOnlyModels...)),
Pre: pre.AppCompatBootedInTabletModeUsingTestAccountPool,
}},
Timeout: 10 * time.Minute,
Vars: []string{"arcappcompat.gaiaPoolDefault"},
})
}
// Reddit test uses library for opting into the playstore and installing app.
// Checks Reddit correctly changes the window states in both clamshell and touchview mode.
func Reddit(ctx context.Context, s *testing.State) {
const (
appPkgName = "com.reddit.frontpage"
appActivity = "launcher.default"
)
testSet := s.Param().(testutil.TestParams)
testutil.RunTestCases(ctx, s, appPkgName, appActivity, testSet)
}
// launchAppForReddit verifies Reddit is logged in and
// verify Reddit reached main activity page of the app.
func launchAppForReddit(ctx context.Context, s *testing.State, tconn *chrome.TestConn, a *arc.ARC, d *ui.Device, appPkgName, appActivity string) {
const (
allowButtonText = "ALLOW"
continueID = "com.google.android.gms:id/continue_button"
continueText = "Continue"
skipButtonText = "Skip"
whileUsingThisAppButtonText = "WHILE USING THE APP"
)
// Click on continue button to sign in using gmail account.
continueButton := d.Object(ui.TextStartsWith("(?i)" + continueText))
if err := continueButton.WaitForExists(ctx, testutil.LongUITimeout); err != nil {
s.Log("continueButton doesn't exist: ", err)
} else if err := continueButton.Click(ctx); err != nil {
s.Fatal("Failed to click on continueButton: ", err)
}
// Click on skip button.
skipButton := d.Object(ui.ClassName(testutil.AndroidButtonClassName), ui.TextMatches("(?i)"+skipButtonText))
if err := skipButton.WaitForExists(ctx, testutil.ShortUITimeout); err != nil {
s.Log("skipButton doesn't exist: ", err)
} else if err := skipButton.Click(ctx); err != nil {
s.Fatal("Failed to click on skipButton: ", err)
}
// Click on continue button to sign in using gmail account.
continueButton = d.Object(ui.ID(continueID))
if err := continueButton.WaitForExists(ctx, testutil.ShortUITimeout); err != nil {
s.Log("continueButton doesn't exist: ", err)
} else if err := continueButton.Click(ctx); err != nil {
s.Fatal("Failed to click on continueButton: ", err)
}
// Click on continue button to sign back in Reddit using gmail account.
continueButton = d.Object(ui.ID(continueID))
if err := continueButton.WaitForExists(ctx, testutil.ShortUITimeout); err != nil {
s.Log("continueButton doesn't exist: ", err)
} else if err := continueButton.Click(ctx); err != nil {
s.Fatal("Failed to click on continueButton: ", err)
}
// Click on skip button.
skipButton = d.Object(ui.ClassName(testutil.AndroidButtonClassName), ui.TextMatches("(?i)"+skipButtonText))
if err := skipButton.WaitForExists(ctx, testutil.ShortUITimeout); err != nil {
s.Log("skipButton doesn't exist: ", err)
} else if err := skipButton.Click(ctx); err != nil {
s.Fatal("Failed to click on skipButton: ", err)
}
// Click on allow button to access your photos, media and files.
allowButton := d.Object(ui.ClassName(testutil.AndroidButtonClassName), ui.TextMatches("(?i)"+allowButtonText))
if err := allowButton.WaitForExists(ctx, testutil.DefaultUITimeout); err != nil {
s.Log("Allow Button doesn't exist: ", err)
} else if err := allowButton.Click(ctx); err != nil {
s.Fatal("Failed to click on allowButton: ", err)
}
// Click on allow while using this app button to record audio.
clickOnWhileUsingThisAppButton := d.Object(ui.TextMatches("(?i)" + whileUsingThisAppButtonText))
if err := clickOnWhileUsingThisAppButton.WaitForExists(ctx, testutil.DefaultUITimeout); err != nil {
s.Log("clickOnWhileUsingThisApp Button doesn't exists: ", err)
} else if err := clickOnWhileUsingThisAppButton.Click(ctx); err != nil {
s.Fatal("Failed to click on clickOnWhileUsingThisApp Button: ", err)
}
testutil.HandleDialogBoxes(ctx, s, d, appPkgName)
// Check for launch verifier.
launchVerifier := d.Object(ui.PackageName(appPkgName))
if err := launchVerifier.WaitForExists(ctx, testutil.LongUITimeout); err != nil {
testutil.DetectAndHandleCloseCrashOrAppNotResponding(ctx, s, d)
s.Fatal("launchVerifier doesn't exists: ", err)
}
}