blob: 9f4dd926f5b65a5f2d5b207d18ee82b88f7fef71 [file] [log] [blame]
// Copyright 2017 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 "cc/trees/ukm_manager.h"
#include "components/ukm/test_ukm_recorder.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace cc {
namespace {
const char kTestUrl[] = "https://example.com/foo";
const int64_t kTestSourceId1 = 100;
const int64_t kTestSourceId2 = 200;
const char kUserInteraction[] = "Compositor.UserInteraction";
const char kRendering[] = "Compositor.Rendering";
const char kCheckerboardArea[] = "CheckerboardedContentArea";
const char kCheckerboardAreaRatio[] = "CheckerboardedContentAreaRatio";
const char kMissingTiles[] = "NumMissingTiles";
const char kCheckerboardedImagesCount[] = "CheckerboardedImagesCount";
class UkmManagerTest : public testing::Test {
public:
UkmManagerTest() {
auto recorder = std::make_unique<ukm::TestUkmRecorder>();
test_ukm_recorder_ = recorder.get();
manager_ = std::make_unique<UkmManager>(std::move(recorder));
// In production, new UKM Source would have been already created, so
// manager only needs to know the source id.
test_ukm_recorder_->UpdateSourceURL(kTestSourceId1, GURL(kTestUrl));
manager_->SetSourceId(kTestSourceId1);
}
protected:
ukm::TestUkmRecorder* test_ukm_recorder_;
std::unique_ptr<UkmManager> manager_;
};
TEST_F(UkmManagerTest, Basic) {
manager_->SetUserInteractionInProgress(true);
manager_->AddCheckerboardStatsForFrame(5, 1, 10);
manager_->AddCheckerboardStatsForFrame(15, 3, 30);
manager_->AddCheckerboardedImages(6);
manager_->SetUserInteractionInProgress(false);
// We should see a single entry for the interaction above.
const auto& entries = test_ukm_recorder_->GetEntriesByName(kUserInteraction);
ukm::SourceId original_id = ukm::kInvalidSourceId;
EXPECT_EQ(1u, entries.size());
for (const auto* entry : entries) {
original_id = entry->source_id;
EXPECT_NE(ukm::kInvalidSourceId, entry->source_id);
test_ukm_recorder_->ExpectEntrySourceHasUrl(entry, GURL(kTestUrl));
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardArea, 10);
test_ukm_recorder_->ExpectEntryMetric(entry, kMissingTiles, 2);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardAreaRatio, 50);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardedImagesCount, 6);
}
test_ukm_recorder_->Purge();
// Try pushing some stats while no user interaction is happening. No entries
// should be pushed.
manager_->AddCheckerboardStatsForFrame(6, 1, 10);
manager_->AddCheckerboardStatsForFrame(99, 3, 100);
EXPECT_EQ(0u, test_ukm_recorder_->entries_count());
manager_->SetUserInteractionInProgress(true);
EXPECT_EQ(0u, test_ukm_recorder_->entries_count());
// Record a few entries and change the source before the interaction ends. The
// stats collected up till this point should be recorded before the source is
// swapped.
manager_->AddCheckerboardStatsForFrame(10, 1, 100);
manager_->AddCheckerboardStatsForFrame(30, 5, 100);
manager_->SetSourceId(kTestSourceId2);
const auto& entries2 = test_ukm_recorder_->GetEntriesByName(kUserInteraction);
EXPECT_EQ(1u, entries2.size());
for (const auto* entry : entries2) {
EXPECT_EQ(original_id, entry->source_id);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardArea, 20);
test_ukm_recorder_->ExpectEntryMetric(entry, kMissingTiles, 3);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardAreaRatio, 20);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardedImagesCount, 0);
}
// An entry for rendering is emitted when the URL changes.
const auto& entries_rendering =
test_ukm_recorder_->GetEntriesByName(kRendering);
EXPECT_EQ(1u, entries_rendering.size());
for (const auto* entry : entries_rendering) {
EXPECT_EQ(original_id, entry->source_id);
test_ukm_recorder_->ExpectEntryMetric(entry, kCheckerboardedImagesCount, 6);
}
}
} // namespace
} // namespace cc