blob: 452163c8f34ab5cf62ddabb734063fb92c912870 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/child_accounts/child_user_service.h"
#include <memory>
#include <vector>
#include "base/feature_list.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "chrome/browser/ash/child_accounts/child_user_service_factory.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_activity_registry.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_time_controller.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_time_limit_interface.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_time_limit_utils.h"
#include "chrome/browser/ash/child_accounts/time_limits/app_types.h"
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/browser_task_environment.h"
#include "extensions/common/constants.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
class ChildUserServiceTest : public testing::Test {
protected:
ChildUserServiceTest()
: service_(std::make_unique<ChildUserService>(&profile_)),
service_test_api_(
std::make_unique<ChildUserService::TestApi>(service_.get())) {}
ChildUserServiceTest(const ChildUserServiceTest&) = delete;
ChildUserServiceTest& operator=(const ChildUserServiceTest&) = delete;
~ChildUserServiceTest() override = default;
// Enables web time limits feature. Recreates ChildUserService object.
void EnableWebTimeLimits() {
EnableFeatures({features::kWebTimeLimits});
service_ = std::make_unique<ChildUserService>(&profile_);
service_test_api_ =
std::make_unique<ChildUserService::TestApi>(service_.get());
// Install Chrome browser and set its app limit.
app_time::AppActivityRegistry* registry =
service_test_api_->app_time_controller()->app_registry();
registry->OnAppInstalled(app_time::GetChromeAppId());
registry->OnAppAvailable(app_time::GetChromeAppId());
registry->SetAppLimit(
app_time::GetChromeAppId(),
app_time::AppLimit(app_time::AppRestriction::kTimeLimit, base::Hours(1),
base::Time::Now()));
}
Profile* profile() { return &profile_; }
ChildUserService* service() { return service_.get(); }
ChildUserService::TestApi* service_test_api() {
return service_test_api_.get();
}
private:
// Enables given |features|. Recreates ChildUserService object.
void EnableFeatures(const std::vector<base::Feature>& features) {
scoped_feature_list_.InitWithFeatures(features, {});
service_ = std::make_unique<ChildUserService>(&profile_);
service_test_api_ =
std::make_unique<ChildUserService::TestApi>(service_.get());
}
content::BrowserTaskEnvironment task_environment_;
TestingProfile profile_;
base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<ChildUserService> service_;
std::unique_ptr<ChildUserService::TestApi> service_test_api_;
};
// Tests Per-App Time Limits feature.
using PerAppTimeLimitsTest = ChildUserServiceTest;
TEST_F(PerAppTimeLimitsTest, GetAppTimeLimitInterface) {
EXPECT_EQ(ChildUserServiceFactory::GetForBrowserContext(profile()),
app_time::AppTimeLimitInterface::Get(profile()));
}
TEST_F(PerAppTimeLimitsTest, PauseAndResumeWebActivity) {
EnableWebTimeLimits();
EXPECT_FALSE(service()->WebTimeLimitReached());
const std::string app_id = extension_misc::kChromeAppId;
service()->PauseWebActivity(app_id);
EXPECT_TRUE(service()->WebTimeLimitReached());
service()->ResumeWebActivity(app_id);
EXPECT_FALSE(service()->WebTimeLimitReached());
EXPECT_EQ(base::TimeDelta(), service()->GetWebTimeLimit());
}
TEST_F(PerAppTimeLimitsTest, PauseWebActivityTwice) {
EnableWebTimeLimits();
EXPECT_FALSE(service()->WebTimeLimitReached());
const std::string app_id = extension_misc::kChromeAppId;
service()->PauseWebActivity(app_id);
EXPECT_TRUE(service()->WebTimeLimitReached());
service()->PauseWebActivity(app_id);
EXPECT_TRUE(service()->WebTimeLimitReached());
}
TEST_F(PerAppTimeLimitsTest, ResumeWebActivityTwice) {
EnableWebTimeLimits();
EXPECT_FALSE(service()->WebTimeLimitReached());
const std::string app_id = extension_misc::kChromeAppId;
service()->ResumeWebActivity(app_id);
EXPECT_FALSE(service()->WebTimeLimitReached());
EXPECT_EQ(base::TimeDelta(), service()->GetWebTimeLimit());
service()->ResumeWebActivity(app_id);
EXPECT_FALSE(service()->WebTimeLimitReached());
EXPECT_EQ(base::TimeDelta(), service()->GetWebTimeLimit());
}
TEST_F(PerAppTimeLimitsTest, WebAppsDontTriggerPauseOrResumeWebActivity) {
EnableWebTimeLimits();
EXPECT_FALSE(service()->WebTimeLimitReached());
const std::string chrome_app_id = extension_misc::kChromeAppId;
service()->PauseWebActivity(chrome_app_id);
EXPECT_TRUE(service()->WebTimeLimitReached());
const std::string web_app_id = "iniodglblcgmngkgdipeiclkdjjpnlbn";
service()->ResumeWebActivity(web_app_id);
EXPECT_TRUE(service()->WebTimeLimitReached());
}
} // namespace ash