summaryrefslogtreecommitdiff
path: root/chromium/components/feed/core/v2/feed_stream_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/feed/core/v2/feed_stream_unittest.cc')
-rw-r--r--chromium/components/feed/core/v2/feed_stream_unittest.cc144
1 files changed, 122 insertions, 22 deletions
diff --git a/chromium/components/feed/core/v2/feed_stream_unittest.cc b/chromium/components/feed/core/v2/feed_stream_unittest.cc
index d0325fbd69e..46a25b3191c 100644
--- a/chromium/components/feed/core/v2/feed_stream_unittest.cc
+++ b/chromium/components/feed/core/v2/feed_stream_unittest.cc
@@ -28,6 +28,7 @@
#include "components/feed/core/proto/v2/ui.pb.h"
#include "components/feed/core/proto/v2/wire/action_request.pb.h"
#include "components/feed/core/proto/v2/wire/request.pb.h"
+#include "components/feed/core/proto/v2/wire/there_and_back_again_data.pb.h"
#include "components/feed/core/shared_prefs/pref_names.h"
#include "components/feed/core/v2/config.h"
#include "components/feed/core/v2/feed_network.h"
@@ -239,6 +240,8 @@ class TestFeedNetwork : public FeedNetwork {
// time we want to inject a translated response for ease of test-writing.
query_request_sent = request;
QueryRequestResult result;
+ result.response_info.status_code = 200;
+ result.response_info.response_body_bytes = 100;
result.response_info.fetch_duration = base::TimeDelta::FromMilliseconds(42);
if (injected_response_) {
result.response_body = std::make_unique<feedwire::Response>(
@@ -359,8 +362,8 @@ class FakeRefreshTaskScheduler : public RefreshTaskScheduler {
class TestMetricsReporter : public MetricsReporter {
public:
- explicit TestMetricsReporter(const base::TickClock* clock)
- : MetricsReporter(clock) {}
+ explicit TestMetricsReporter(const base::TickClock* clock, PrefService* prefs)
+ : MetricsReporter(clock, prefs) {}
// MetricsReporter.
void ContentSliceViewed(SurfaceId surface_id, int index_in_stream) override {
@@ -400,10 +403,15 @@ class TestMetricsReporter : public MetricsReporter {
class FeedStreamTest : public testing::Test, public FeedStream::Delegate {
public:
void SetUp() override {
+ // Reset to default config, since tests can change it.
+ SetFeedConfigForTesting(Config());
+
feed::prefs::RegisterFeedSharedProfilePrefs(profile_prefs_.registry());
feed::RegisterProfilePrefs(profile_prefs_.registry());
- CHECK_EQ(kTestTimeEpoch, task_environment_.GetMockClock()->Now());
+ metrics_reporter_ = std::make_unique<TestMetricsReporter>(
+ task_environment_.GetMockTickClock(), &profile_prefs_);
+ CHECK_EQ(kTestTimeEpoch, task_environment_.GetMockClock()->Now());
CreateStream();
}
@@ -436,7 +444,7 @@ class FeedStreamTest : public testing::Test, public FeedStream::Delegate {
chrome_info.channel = version_info::Channel::STABLE;
chrome_info.version = base::Version({99, 1, 9911, 2});
stream_ = std::make_unique<FeedStream>(
- &refresh_scheduler_, &metrics_reporter_, this, &profile_prefs_,
+ &refresh_scheduler_, metrics_reporter_.get(), this, &profile_prefs_,
&network_, store_.get(), task_environment_.GetMockClock(),
task_environment_.GetMockTickClock(), chrome_info);
@@ -495,8 +503,8 @@ class FeedStreamTest : public testing::Test, public FeedStream::Delegate {
protected:
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
- TestMetricsReporter metrics_reporter_{task_environment_.GetMockTickClock()};
TestingPrefServiceSimple profile_prefs_;
+ std::unique_ptr<TestMetricsReporter> metrics_reporter_;
TestFeedNetwork network_;
TestWireResponseTranslator response_translator_;
@@ -531,7 +539,7 @@ TEST_F(FeedStreamTest, DoNotRefreshIfArticlesListIsHidden) {
stream_->ExecuteRefreshTask();
EXPECT_TRUE(refresh_scheduler_.refresh_task_complete);
EXPECT_EQ(LoadStreamStatus::kLoadNotAllowedArticlesListHidden,
- metrics_reporter_.background_refresh_status);
+ metrics_reporter_->background_refresh_status);
}
TEST_F(FeedStreamTest, BackgroundRefreshSuccess) {
@@ -544,7 +552,7 @@ TEST_F(FeedStreamTest, BackgroundRefreshSuccess) {
// network.
ASSERT_TRUE(refresh_scheduler_.refresh_task_complete);
EXPECT_EQ(LoadStreamStatus::kLoadedFromNetwork,
- metrics_reporter_.background_refresh_status);
+ metrics_reporter_->background_refresh_status);
EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
EXPECT_FALSE(stream_->GetModel());
TestSurface surface(stream_.get());
@@ -558,7 +566,7 @@ TEST_F(FeedStreamTest, BackgroundRefreshNotAttemptedWhenModelIsLoading) {
stream_->ExecuteRefreshTask();
WaitForIdleTaskQueue();
- EXPECT_EQ(metrics_reporter_.background_refresh_status,
+ EXPECT_EQ(metrics_reporter_->background_refresh_status,
LoadStreamStatus::kModelAlreadyLoaded);
}
@@ -570,7 +578,7 @@ TEST_F(FeedStreamTest, BackgroundRefreshNotAttemptedAfterModelIsLoaded) {
stream_->ExecuteRefreshTask();
WaitForIdleTaskQueue();
- EXPECT_EQ(metrics_reporter_.background_refresh_status,
+ EXPECT_EQ(metrics_reporter_->background_refresh_status,
LoadStreamStatus::kModelAlreadyLoaded);
}
@@ -837,7 +845,7 @@ TEST_F(FeedStreamTest, LoadFromNetworkFailsDueToProtoTranslation) {
WaitForIdleTaskQueue();
EXPECT_EQ(LoadStreamStatus::kProtoTranslationFailed,
- metrics_reporter_.load_stream_status);
+ metrics_reporter_->load_stream_status);
}
TEST_F(FeedStreamTest, DoNotLoadFromNetworkWhenOffline) {
@@ -847,7 +855,7 @@ TEST_F(FeedStreamTest, DoNotLoadFromNetworkWhenOffline) {
WaitForIdleTaskQueue();
EXPECT_EQ(LoadStreamStatus::kCannotLoadFromNetworkOffline,
- metrics_reporter_.load_stream_status);
+ metrics_reporter_->load_stream_status);
EXPECT_EQ("loading -> cant-refresh", surface.DescribeUpdates());
}
@@ -858,7 +866,7 @@ TEST_F(FeedStreamTest, DoNotLoadStreamWhenArticleListIsHidden) {
WaitForIdleTaskQueue();
EXPECT_EQ(LoadStreamStatus::kLoadNotAllowedArticlesListHidden,
- metrics_reporter_.load_stream_status);
+ metrics_reporter_->load_stream_status);
EXPECT_EQ("no-cards", surface.DescribeUpdates());
}
@@ -869,7 +877,7 @@ TEST_F(FeedStreamTest, DoNotLoadStreamWhenEulaIsNotAccepted) {
WaitForIdleTaskQueue();
EXPECT_EQ(LoadStreamStatus::kLoadNotAllowedEulaNotAccepted,
- metrics_reporter_.load_stream_status);
+ metrics_reporter_->load_stream_status);
EXPECT_EQ("no-cards", surface.DescribeUpdates());
}
@@ -900,7 +908,7 @@ TEST_F(FeedStreamTest, DoNotLoadFromNetworkAfterHistoryIsDeleted) {
EXPECT_EQ("loading -> no-cards", surface.DescribeUpdates());
EXPECT_EQ(LoadStreamStatus::kCannotLoadFromNetworkSupressedForHistoryDelete,
- metrics_reporter_.load_stream_status);
+ metrics_reporter_->load_stream_status);
surface.Detach();
task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(2));
@@ -1028,7 +1036,7 @@ TEST_F(FeedStreamTest, ReportSliceViewedIdentifiesCorrectIndex) {
stream_->ReportSliceViewed(
surface.GetSurfaceId(),
surface.initial_state->updated_slices(1).slice().slice_id());
- EXPECT_EQ(1, metrics_reporter_.slice_viewed_index);
+ EXPECT_EQ(1, metrics_reporter_->slice_viewed_index);
}
TEST_F(FeedStreamTest, LoadMoreAppendsContent) {
@@ -1145,6 +1153,26 @@ TEST_F(FeedStreamTest, LoadMoreSendsTokens) {
.next_page_token());
}
+TEST_F(FeedStreamTest, LoadMoreAbortsIfNoNextPageToken) {
+ {
+ std::unique_ptr<StreamModelUpdateRequest> initial_state =
+ MakeTypicalInitialModelState();
+ initial_state->stream_data.clear_next_page_token();
+ response_translator_.InjectResponse(std::move(initial_state));
+ }
+ TestSurface surface(stream_.get());
+ WaitForIdleTaskQueue();
+
+ CallbackReceiver<bool> callback;
+ stream_->LoadMore(surface.GetSurfaceId(), callback.Bind());
+ WaitForIdleTaskQueue();
+
+ // LoadMore fails, and does not make an additional request.
+ EXPECT_EQ(base::Optional<bool>(false), callback.GetResult());
+ ASSERT_EQ(1, network_.send_query_call_count);
+ EXPECT_EQ("loading -> 2 slices", surface.DescribeUpdates());
+}
+
TEST_F(FeedStreamTest, LoadMoreFail) {
response_translator_.InjectResponse(MakeTypicalInitialModelState());
TestSurface surface(stream_.get());
@@ -1252,15 +1280,17 @@ TEST_F(FeedStreamTest, StorePendingAction) {
TEST_F(FeedStreamTest, StorePendingActionAndUploadNow) {
network_.consistency_token = "token-11";
- CallbackReceiver<UploadActionsTask::Result> cr;
- stream_->UploadAction(MakeFeedAction(42ul), true, cr.Bind());
+ // Call |ProcessThereAndBackAgain()|, which triggers Upload() with
+ // upload_now=true.
+ {
+ feedwire::ThereAndBackAgainData msg;
+ *msg.mutable_action_payload() = MakeFeedAction(42ul).action_payload();
+ stream_->ProcessThereAndBackAgain(msg.SerializeAsString());
+ }
WaitForIdleTaskQueue();
- ASSERT_TRUE(cr.GetResult());
- EXPECT_EQ(1ul, cr.GetResult()->upload_attempt_count);
- EXPECT_EQ(UploadActionsStatus::kUpdatedConsistencyToken,
- cr.GetResult()->status);
-
+ // Verify the action was uploaded.
+ EXPECT_EQ(1, network_.action_request_call_count);
std::vector<feedstore::StoredAction> result =
ReadStoredActions(stream_->GetStore());
ASSERT_EQ(0ul, result.size());
@@ -1425,5 +1455,75 @@ TEST_F(FeedStreamTest, MetadataLoadedWhenDatabaseInitialized) {
EXPECT_EQ(1, stream_->GetMetadata()->GetNextActionId().GetUnsafeValue());
}
+TEST_F(FeedStreamTest, ModelUnloadsAfterTimeout) {
+ Config config;
+ config.model_unload_timeout = base::TimeDelta::FromSeconds(1);
+ SetFeedConfigForTesting(config);
+
+ response_translator_.InjectResponse(MakeTypicalInitialModelState());
+ TestSurface surface(stream_.get());
+ WaitForIdleTaskQueue();
+
+ surface.Detach();
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+ WaitForIdleTaskQueue();
+ EXPECT_TRUE(stream_->GetModel());
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(2));
+ WaitForIdleTaskQueue();
+ EXPECT_FALSE(stream_->GetModel());
+}
+
+TEST_F(FeedStreamTest, ModelDoesNotUnloadIfSurfaceIsAttached) {
+ Config config;
+ config.model_unload_timeout = base::TimeDelta::FromSeconds(1);
+ SetFeedConfigForTesting(config);
+
+ response_translator_.InjectResponse(MakeTypicalInitialModelState());
+ TestSurface surface(stream_.get());
+ WaitForIdleTaskQueue();
+
+ surface.Detach();
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+ WaitForIdleTaskQueue();
+ EXPECT_TRUE(stream_->GetModel());
+
+ surface.Attach(stream_.get());
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(2));
+ WaitForIdleTaskQueue();
+ EXPECT_TRUE(stream_->GetModel());
+}
+
+TEST_F(FeedStreamTest, ModelUnloadsAfterSecondTimeout) {
+ Config config;
+ config.model_unload_timeout = base::TimeDelta::FromSeconds(1);
+ SetFeedConfigForTesting(config);
+
+ response_translator_.InjectResponse(MakeTypicalInitialModelState());
+ TestSurface surface(stream_.get());
+ WaitForIdleTaskQueue();
+
+ surface.Detach();
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+ WaitForIdleTaskQueue();
+ EXPECT_TRUE(stream_->GetModel());
+
+ // Attaching another surface will prolong the unload time for another second.
+ surface.Attach(stream_.get());
+ surface.Detach();
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+ WaitForIdleTaskQueue();
+ EXPECT_TRUE(stream_->GetModel());
+
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(2));
+ WaitForIdleTaskQueue();
+ EXPECT_FALSE(stream_->GetModel());
+}
+
} // namespace
} // namespace feed