| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/scheduler/renderer/user_model.h" | 5 #include "components/scheduler/renderer/user_model.h" |
| 6 | 6 |
| 7 #include "base/metrics/field_trial.h" |
| 8 #include "base/metrics/user_metrics.h" |
| 9 #include "base/metrics/user_metrics_action.h" |
| 7 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| 11 #include "base/test/test_simple_task_runner.h" |
| 12 #include "base/test/user_action_tester.h" |
| 8 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 15 |
| 11 namespace scheduler { | 16 namespace scheduler { |
| 12 | 17 |
| 13 class UserModelTest : public testing::Test { | 18 class UserModelTest : public testing::Test { |
| 14 public: | 19 public: |
| 15 UserModelTest() {} | 20 UserModelTest() {} |
| 16 ~UserModelTest() override {} | 21 ~UserModelTest() override {} |
| 17 | 22 |
| 18 void SetUp() override { | 23 void SetUp() override { |
| 24 mock_task_runner_ = new base::TestSimpleTaskRunner(); |
| 25 |
| 19 clock_.reset(new base::SimpleTestTickClock()); | 26 clock_.reset(new base::SimpleTestTickClock()); |
| 20 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 27 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
| 21 | 28 |
| 22 user_model_.reset(new UserModel()); | 29 user_model_.reset(new UserModel(mock_task_runner_)); |
| 30 |
| 31 // Register a mock user action callback for testing. |
| 32 user_action_tester_.reset(new base::UserActionTester()); |
| 23 } | 33 } |
| 24 | 34 |
| 25 protected: | 35 protected: |
| 26 static base::TimeDelta priority_escalation_after_input_duration() { | 36 static base::TimeDelta priority_escalation_after_input_duration() { |
| 27 return base::TimeDelta::FromMilliseconds( | 37 return base::TimeDelta::FromMilliseconds( |
| 28 UserModel::kGestureEstimationLimitMillis); | 38 UserModel::kGestureEstimationLimitMillis); |
| 29 } | 39 } |
| 30 | 40 |
| 31 static base::TimeDelta subsequent_input_expected_after_input_duration() { | 41 static base::TimeDelta subsequent_input_expected_after_input_duration() { |
| 32 return base::TimeDelta::FromMilliseconds( | 42 return base::TimeDelta::FromMilliseconds( |
| 33 UserModel::kExpectSubsequentGestureMillis); | 43 UserModel::kExpectSubsequentGestureMillis); |
| 34 } | 44 } |
| 35 | 45 |
| 36 scoped_ptr<base::SimpleTestTickClock> clock_; | 46 scoped_ptr<base::SimpleTestTickClock> clock_; |
| 37 scoped_ptr<UserModel> user_model_; | 47 scoped_ptr<UserModel> user_model_; |
| 48 scoped_refptr<base::TestSimpleTaskRunner> mock_task_runner_; |
| 49 base::ActionCallback action_callback_; |
| 50 |
| 51 // Tracks user actions that were recorded. |
| 52 scoped_ptr<base::UserActionTester> user_action_tester_; |
| 38 }; | 53 }; |
| 39 | 54 |
| 40 TEST_F(UserModelTest, TimeLeftInUserGesture_NoInput) { | 55 TEST_F(UserModelTest, TimeLeftInUserGesture_NoInput) { |
| 41 EXPECT_EQ(base::TimeDelta(), | 56 EXPECT_EQ(base::TimeDelta(), |
| 42 user_model_->TimeLeftInUserGesture(clock_->NowTicks())); | 57 user_model_->TimeLeftInUserGesture(clock_->NowTicks())); |
| 43 } | 58 } |
| 44 | 59 |
| 45 TEST_F(UserModelTest, TimeLeftInUserGesture_ImmediatelyAfterInput) { | 60 TEST_F(UserModelTest, TimeLeftInUserGesture_ImmediatelyAfterInput) { |
| 46 user_model_->DidStartProcessingInputEvent( | 61 user_model_->DidStartProcessingInputEvent( |
| 47 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks()); | 62 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks()); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 base::TimeDelta delta(base::TimeDelta::FromMilliseconds( | 259 base::TimeDelta delta(base::TimeDelta::FromMilliseconds( |
| 245 UserModel::kMedianGestureDurationMillis * 2)); | 260 UserModel::kMedianGestureDurationMillis * 2)); |
| 246 clock_->Advance(delta); | 261 clock_->Advance(delta); |
| 247 | 262 |
| 248 base::TimeDelta prediction_valid_duration; | 263 base::TimeDelta prediction_valid_duration; |
| 249 EXPECT_FALSE(user_model_->IsGestureExpectedToContinue( | 264 EXPECT_FALSE(user_model_->IsGestureExpectedToContinue( |
| 250 clock_->NowTicks(), &prediction_valid_duration)); | 265 clock_->NowTicks(), &prediction_valid_duration)); |
| 251 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration); | 266 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration); |
| 252 } | 267 } |
| 253 | 268 |
| 269 TEST_F(UserModelTest, AreActionsLogged) { |
| 270 // Add the action logging feature. |
| 271 base::FeatureList::ClearInstanceForTesting(); |
| 272 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 273 feature_list->InitializeFromCommandLine(features::kRecordGestureAction.name, |
| 274 std::string()); |
| 275 base::FeatureList::SetInstance(std::move(feature_list)); |
| 276 |
| 277 // Reset user model so it uses the new feature list. |
| 278 user_model_.reset(new UserModel(mock_task_runner_)); |
| 279 |
| 280 EXPECT_EQ(0, user_action_tester_->GetActionCount( |
| 281 "RendererScheduler.UserModel.GestureStart")); |
| 282 EXPECT_EQ(0, user_action_tester_->GetActionCount( |
| 283 "RendererScheduler.UserModel.GestureEnd")); |
| 284 |
| 285 user_model_->DidStartProcessingInputEvent( |
| 286 blink::WebInputEvent::Type::GestureScrollBegin, clock_->NowTicks()); |
| 287 mock_task_runner_->RunPendingTasks(); |
| 288 |
| 289 EXPECT_EQ(1, user_action_tester_->GetActionCount( |
| 290 "RendererScheduler.UserModel.GestureStart")); |
| 291 EXPECT_EQ(0, user_action_tester_->GetActionCount( |
| 292 "RendererScheduler.UserModel.GestureEnd")); |
| 293 |
| 294 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(500)); |
| 295 clock_->Advance(delta); |
| 296 |
| 297 user_model_->DidStartProcessingInputEvent( |
| 298 blink::WebInputEvent::Type::GestureScrollEnd, clock_->NowTicks()); |
| 299 mock_task_runner_->RunPendingTasks(); |
| 300 |
| 301 EXPECT_EQ(1, user_action_tester_->GetActionCount( |
| 302 "RendererScheduler.UserModel.GestureStart")); |
| 303 EXPECT_EQ(1, user_action_tester_->GetActionCount( |
| 304 "RendererScheduler.UserModel.GestureEnd")); |
| 305 } |
| 306 |
| 254 } // namespace scheduler | 307 } // namespace scheduler |
| OLD | NEW |