| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/ukm/ukm_service.h" | 5 #include "components/ukm/ukm_service.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/hash.h" | 11 #include "base/hash.h" |
| 12 #include "base/metrics/metrics_hashes.h" | 12 #include "base/metrics/metrics_hashes.h" |
| 13 #include "base/test/scoped_feature_list.h" | 13 #include "base/test/scoped_feature_list.h" |
| 14 #include "base/test/test_simple_task_runner.h" | 14 #include "base/test/test_simple_task_runner.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "components/metrics/proto/ukm/report.pb.h" | 16 #include "components/metrics/proto/ukm/report.pb.h" |
| 17 #include "components/metrics/proto/ukm/source.pb.h" | 17 #include "components/metrics/proto/ukm/source.pb.h" |
| 18 #include "components/metrics/test_metrics_provider.h" | 18 #include "components/metrics/test_metrics_provider.h" |
| 19 #include "components/metrics/test_metrics_service_client.h" | 19 #include "components/metrics/test_metrics_service_client.h" |
| 20 #include "components/prefs/testing_pref_service.h" | 20 #include "components/prefs/testing_pref_service.h" |
| 21 #include "components/ukm/persisted_logs_metrics_impl.h" | 21 #include "components/ukm/persisted_logs_metrics_impl.h" |
| 22 #include "components/ukm/ukm_entry_builder.h" | 22 #include "components/ukm/public/ukm_entry_builder.h" |
| 23 #include "components/ukm/ukm_pref_names.h" | 23 #include "components/ukm/ukm_pref_names.h" |
| 24 #include "components/ukm/ukm_source.h" | 24 #include "components/ukm/ukm_source.h" |
| 25 #include "components/variations/variations_associated_data.h" | 25 #include "components/variations/variations_associated_data.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 27 #include "third_party/zlib/google/compression_utils.h" | 27 #include "third_party/zlib/google/compression_utils.h" |
| 28 | 28 |
| 29 namespace ukm { | 29 namespace ukm { |
| 30 | 30 |
| 31 // A small shim exposing UkmRecorder methods to tests. |
| 32 class TestRecordingHelper { |
| 33 public: |
| 34 TestRecordingHelper(UkmRecorder* recorder) : recorder_(recorder) {} |
| 35 |
| 36 void UpdateSourceURL(SourceId source_id, const GURL& url) { |
| 37 recorder_->UpdateSourceURL(source_id, url); |
| 38 }; |
| 39 |
| 40 std::unique_ptr<UkmEntryBuilder> GetEntryBuilder(SourceId source_id, |
| 41 const char* event_name) { |
| 42 return recorder_->GetEntryBuilder(source_id, event_name); |
| 43 } |
| 44 |
| 45 private: |
| 46 UkmRecorder* recorder_; |
| 47 }; |
| 48 |
| 31 namespace { | 49 namespace { |
| 32 | 50 |
| 33 // TODO(rkaplow): consider making this a generic testing class in | 51 // TODO(rkaplow): consider making this a generic testing class in |
| 34 // components/variations. | 52 // components/variations. |
| 35 class ScopedUkmFeatureParams { | 53 class ScopedUkmFeatureParams { |
| 36 public: | 54 public: |
| 37 ScopedUkmFeatureParams( | 55 ScopedUkmFeatureParams( |
| 38 base::FeatureList::OverrideState feature_state, | 56 base::FeatureList::OverrideState feature_state, |
| 39 const std::map<std::string, std::string>& variation_params) { | 57 const std::map<std::string, std::string>& variation_params) { |
| 40 static const char kTestFieldTrialName[] = "TestTrial"; | 58 static const char kTestFieldTrialName[] = "TestTrial"; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 service.EnableRecording(); | 158 service.EnableRecording(); |
| 141 service.EnableReporting(); | 159 service.EnableReporting(); |
| 142 EXPECT_TRUE(task_runner_->HasPendingTask()); | 160 EXPECT_TRUE(task_runner_->HasPendingTask()); |
| 143 service.DisableReporting(); | 161 service.DisableReporting(); |
| 144 task_runner_->RunPendingTasks(); | 162 task_runner_->RunPendingTasks(); |
| 145 EXPECT_FALSE(task_runner_->HasPendingTask()); | 163 EXPECT_FALSE(task_runner_->HasPendingTask()); |
| 146 } | 164 } |
| 147 | 165 |
| 148 TEST_F(UkmServiceTest, PersistAndPurge) { | 166 TEST_F(UkmServiceTest, PersistAndPurge) { |
| 149 UkmService service(&prefs_, &client_); | 167 UkmService service(&prefs_, &client_); |
| 168 TestRecordingHelper recorder(&service); |
| 150 EXPECT_EQ(GetPersistedLogCount(), 0); | 169 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 151 service.Initialize(); | 170 service.Initialize(); |
| 152 task_runner_->RunUntilIdle(); | 171 task_runner_->RunUntilIdle(); |
| 153 service.EnableRecording(); | 172 service.EnableRecording(); |
| 154 service.EnableReporting(); | 173 service.EnableReporting(); |
| 155 | 174 |
| 156 int32_t id = UkmService::GetNewSourceID(); | 175 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 157 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 176 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 158 // Should init, generate a log, and start an upload for source. | 177 // Should init, generate a log, and start an upload for source. |
| 159 task_runner_->RunPendingTasks(); | 178 task_runner_->RunPendingTasks(); |
| 160 EXPECT_TRUE(client_.uploader()->is_uploading()); | 179 EXPECT_TRUE(client_.uploader()->is_uploading()); |
| 161 // Flushes the generated log to disk and generates a new entry. | 180 // Flushes the generated log to disk and generates a new entry. |
| 162 { | 181 { |
| 163 std::unique_ptr<UkmEntryBuilder> builder = | 182 std::unique_ptr<UkmEntryBuilder> builder = |
| 164 service.GetEntryBuilder(id, "PageLoad"); | 183 recorder.GetEntryBuilder(id, "PageLoad"); |
| 165 builder->AddMetric("FirstContentfulPaint", 300); | 184 builder->AddMetric("FirstContentfulPaint", 300); |
| 166 } | 185 } |
| 167 service.Flush(); | 186 service.Flush(); |
| 168 EXPECT_EQ(GetPersistedLogCount(), 2); | 187 EXPECT_EQ(GetPersistedLogCount(), 2); |
| 169 service.Purge(); | 188 service.Purge(); |
| 170 EXPECT_EQ(GetPersistedLogCount(), 0); | 189 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 171 } | 190 } |
| 172 | 191 |
| 173 TEST_F(UkmServiceTest, SourceSerialization) { | 192 TEST_F(UkmServiceTest, SourceSerialization) { |
| 174 UkmService service(&prefs_, &client_); | 193 UkmService service(&prefs_, &client_); |
| 194 TestRecordingHelper recorder(&service); |
| 175 EXPECT_EQ(GetPersistedLogCount(), 0); | 195 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 176 service.Initialize(); | 196 service.Initialize(); |
| 177 task_runner_->RunUntilIdle(); | 197 task_runner_->RunUntilIdle(); |
| 178 service.EnableRecording(); | 198 service.EnableRecording(); |
| 179 service.EnableReporting(); | 199 service.EnableReporting(); |
| 180 | 200 |
| 181 int32_t id = UkmService::GetNewSourceID(); | 201 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 182 service.UpdateSourceURL(id, GURL("https://google.com/initial")); | 202 recorder.UpdateSourceURL(id, GURL("https://google.com/initial")); |
| 183 service.UpdateSourceURL(id, GURL("https://google.com/intermediate")); | 203 recorder.UpdateSourceURL(id, GURL("https://google.com/intermediate")); |
| 184 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 204 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 185 | 205 |
| 186 service.Flush(); | 206 service.Flush(); |
| 187 EXPECT_EQ(GetPersistedLogCount(), 1); | 207 EXPECT_EQ(GetPersistedLogCount(), 1); |
| 188 | 208 |
| 189 Report proto_report = GetPersistedReport(); | 209 Report proto_report = GetPersistedReport(); |
| 190 EXPECT_EQ(1, proto_report.sources_size()); | 210 EXPECT_EQ(1, proto_report.sources_size()); |
| 191 EXPECT_FALSE(proto_report.has_session_id()); | 211 EXPECT_FALSE(proto_report.has_session_id()); |
| 192 const Source& proto_source = proto_report.sources(0); | 212 const Source& proto_source = proto_report.sources(0); |
| 193 | 213 |
| 194 EXPECT_EQ(id, proto_source.id()); | 214 EXPECT_EQ(id, proto_source.id()); |
| 195 EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); | 215 EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); |
| 196 EXPECT_FALSE(proto_source.has_initial_url()); | 216 EXPECT_FALSE(proto_source.has_initial_url()); |
| 197 } | 217 } |
| 198 | 218 |
| 199 TEST_F(UkmServiceTest, EntryBuilderAndSerialization) { | 219 TEST_F(UkmServiceTest, EntryBuilderAndSerialization) { |
| 200 UkmService service(&prefs_, &client_); | 220 UkmService service(&prefs_, &client_); |
| 221 TestRecordingHelper recorder(&service); |
| 201 EXPECT_EQ(0, GetPersistedLogCount()); | 222 EXPECT_EQ(0, GetPersistedLogCount()); |
| 202 service.Initialize(); | 223 service.Initialize(); |
| 203 task_runner_->RunUntilIdle(); | 224 task_runner_->RunUntilIdle(); |
| 204 service.EnableRecording(); | 225 service.EnableRecording(); |
| 205 service.EnableReporting(); | 226 service.EnableReporting(); |
| 206 | 227 |
| 207 int32_t id = UkmService::GetNewSourceID(); | 228 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 208 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 229 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 209 { | 230 { |
| 210 std::unique_ptr<UkmEntryBuilder> foo_builder = | 231 std::unique_ptr<UkmEntryBuilder> foo_builder = |
| 211 service.GetEntryBuilder(id, "foo"); | 232 service.GetEntryBuilder(id, "foo"); |
| 212 foo_builder->AddMetric("foo_start", 0); | 233 foo_builder->AddMetric("foo_start", 0); |
| 213 foo_builder->AddMetric("foo_end", 10); | 234 foo_builder->AddMetric("foo_end", 10); |
| 214 | 235 |
| 215 std::unique_ptr<UkmEntryBuilder> bar_builder = | 236 std::unique_ptr<UkmEntryBuilder> bar_builder = |
| 216 service.GetEntryBuilder(id, "bar"); | 237 service.GetEntryBuilder(id, "bar"); |
| 217 bar_builder->AddMetric("bar_start", 5); | 238 bar_builder->AddMetric("bar_start", 5); |
| 218 bar_builder->AddMetric("bar_end", 15); | 239 bar_builder->AddMetric("bar_end", 15); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 EXPECT_EQ(base::HashMetricName("foo_start"), | 275 EXPECT_EQ(base::HashMetricName("foo_start"), |
| 255 proto_entry_foo_start.metric_hash()); | 276 proto_entry_foo_start.metric_hash()); |
| 256 EXPECT_EQ(0, proto_entry_foo_start.value()); | 277 EXPECT_EQ(0, proto_entry_foo_start.value()); |
| 257 const Entry::Metric proto_entry_foo_end = proto_entry_foo.metrics(1); | 278 const Entry::Metric proto_entry_foo_end = proto_entry_foo.metrics(1); |
| 258 EXPECT_EQ(base::HashMetricName("foo_end"), proto_entry_foo_end.metric_hash()); | 279 EXPECT_EQ(base::HashMetricName("foo_end"), proto_entry_foo_end.metric_hash()); |
| 259 EXPECT_EQ(10, proto_entry_foo_end.value()); | 280 EXPECT_EQ(10, proto_entry_foo_end.value()); |
| 260 } | 281 } |
| 261 | 282 |
| 262 TEST_F(UkmServiceTest, AddEntryWithEmptyMetrics) { | 283 TEST_F(UkmServiceTest, AddEntryWithEmptyMetrics) { |
| 263 UkmService service(&prefs_, &client_); | 284 UkmService service(&prefs_, &client_); |
| 285 TestRecordingHelper recorder(&service); |
| 264 EXPECT_EQ(0, GetPersistedLogCount()); | 286 EXPECT_EQ(0, GetPersistedLogCount()); |
| 265 service.Initialize(); | 287 service.Initialize(); |
| 266 task_runner_->RunUntilIdle(); | 288 task_runner_->RunUntilIdle(); |
| 267 service.EnableRecording(); | 289 service.EnableRecording(); |
| 268 service.EnableReporting(); | 290 service.EnableReporting(); |
| 269 | 291 |
| 270 int32_t id = UkmService::GetNewSourceID(); | 292 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 271 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 293 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 272 | 294 |
| 273 { | 295 { |
| 274 std::unique_ptr<UkmEntryBuilder> builder = | 296 std::unique_ptr<UkmEntryBuilder> builder = |
| 275 service.GetEntryBuilder(id, "PageLoad"); | 297 service.GetEntryBuilder(id, "PageLoad"); |
| 276 } | 298 } |
| 277 service.Flush(); | 299 service.Flush(); |
| 278 EXPECT_EQ(1, GetPersistedLogCount()); | 300 EXPECT_EQ(1, GetPersistedLogCount()); |
| 279 Report proto_report = GetPersistedReport(); | 301 Report proto_report = GetPersistedReport(); |
| 280 EXPECT_EQ(1, proto_report.entries_size()); | 302 EXPECT_EQ(1, proto_report.entries_size()); |
| 281 } | 303 } |
| 282 | 304 |
| 283 TEST_F(UkmServiceTest, MetricsProviderTest) { | 305 TEST_F(UkmServiceTest, MetricsProviderTest) { |
| 284 UkmService service(&prefs_, &client_); | 306 UkmService service(&prefs_, &client_); |
| 307 TestRecordingHelper recorder(&service); |
| 285 | 308 |
| 286 metrics::TestMetricsProvider* provider = new metrics::TestMetricsProvider(); | 309 metrics::TestMetricsProvider* provider = new metrics::TestMetricsProvider(); |
| 287 service.RegisterMetricsProvider( | 310 service.RegisterMetricsProvider( |
| 288 std::unique_ptr<metrics::MetricsProvider>(provider)); | 311 std::unique_ptr<metrics::MetricsProvider>(provider)); |
| 289 | 312 |
| 290 service.Initialize(); | 313 service.Initialize(); |
| 291 | 314 |
| 292 // Providers have not supplied system profile information yet. | 315 // Providers have not supplied system profile information yet. |
| 293 EXPECT_FALSE(provider->provide_system_profile_metrics_called()); | 316 EXPECT_FALSE(provider->provide_system_profile_metrics_called()); |
| 294 | 317 |
| 295 task_runner_->RunUntilIdle(); | 318 task_runner_->RunUntilIdle(); |
| 296 service.EnableRecording(); | 319 service.EnableRecording(); |
| 297 service.EnableReporting(); | 320 service.EnableReporting(); |
| 298 | 321 |
| 299 int32_t id = UkmService::GetNewSourceID(); | 322 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 300 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 323 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 301 { | 324 { |
| 302 std::unique_ptr<UkmEntryBuilder> builder = | 325 std::unique_ptr<UkmEntryBuilder> builder = |
| 303 service.GetEntryBuilder(id, "PageLoad"); | 326 service.GetEntryBuilder(id, "PageLoad"); |
| 304 builder->AddMetric("FirstContentfulPaint", 300); | 327 builder->AddMetric("FirstContentfulPaint", 300); |
| 305 } | 328 } |
| 306 service.Flush(); | 329 service.Flush(); |
| 307 EXPECT_EQ(GetPersistedLogCount(), 1); | 330 EXPECT_EQ(GetPersistedLogCount(), 1); |
| 308 | 331 |
| 309 Report proto_report = GetPersistedReport(); | 332 Report proto_report = GetPersistedReport(); |
| 310 EXPECT_EQ(1, proto_report.sources_size()); | 333 EXPECT_EQ(1, proto_report.sources_size()); |
| 311 EXPECT_EQ(1, proto_report.entries_size()); | 334 EXPECT_EQ(1, proto_report.entries_size()); |
| 312 | 335 |
| 313 // Providers have now supplied system profile information. | 336 // Providers have now supplied system profile information. |
| 314 EXPECT_TRUE(provider->provide_system_profile_metrics_called()); | 337 EXPECT_TRUE(provider->provide_system_profile_metrics_called()); |
| 315 } | 338 } |
| 316 | 339 |
| 317 TEST_F(UkmServiceTest, LogsUploadedOnlyWhenHavingSourcesOrEntries) { | 340 TEST_F(UkmServiceTest, LogsUploadedOnlyWhenHavingSourcesOrEntries) { |
| 318 UkmService service(&prefs_, &client_); | 341 UkmService service(&prefs_, &client_); |
| 342 TestRecordingHelper recorder(&service); |
| 319 EXPECT_EQ(GetPersistedLogCount(), 0); | 343 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 320 service.Initialize(); | 344 service.Initialize(); |
| 321 task_runner_->RunUntilIdle(); | 345 task_runner_->RunUntilIdle(); |
| 322 service.EnableRecording(); | 346 service.EnableRecording(); |
| 323 service.EnableReporting(); | 347 service.EnableReporting(); |
| 324 | 348 |
| 325 EXPECT_TRUE(task_runner_->HasPendingTask()); | 349 EXPECT_TRUE(task_runner_->HasPendingTask()); |
| 326 // Neither rotation or Flush should generate logs | 350 // Neither rotation or Flush should generate logs |
| 327 task_runner_->RunPendingTasks(); | 351 task_runner_->RunPendingTasks(); |
| 328 service.Flush(); | 352 service.Flush(); |
| 329 EXPECT_EQ(GetPersistedLogCount(), 0); | 353 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 330 | 354 |
| 331 int32_t id = UkmService::GetNewSourceID(); | 355 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 332 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 356 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 333 // Includes a Source, so will persist. | 357 // Includes a Source, so will persist. |
| 334 service.Flush(); | 358 service.Flush(); |
| 335 EXPECT_EQ(GetPersistedLogCount(), 1); | 359 EXPECT_EQ(GetPersistedLogCount(), 1); |
| 336 | 360 |
| 337 { | 361 { |
| 338 std::unique_ptr<UkmEntryBuilder> builder = | 362 std::unique_ptr<UkmEntryBuilder> builder = |
| 339 service.GetEntryBuilder(id, "PageLoad"); | 363 service.GetEntryBuilder(id, "PageLoad"); |
| 340 builder->AddMetric("FirstPaint", 300); | 364 builder->AddMetric("FirstPaint", 300); |
| 341 } | 365 } |
| 342 // Includes an Entry, so will persist. | 366 // Includes an Entry, so will persist. |
| 343 service.Flush(); | 367 service.Flush(); |
| 344 EXPECT_EQ(GetPersistedLogCount(), 2); | 368 EXPECT_EQ(GetPersistedLogCount(), 2); |
| 345 | 369 |
| 346 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 370 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 347 { | 371 { |
| 348 std::unique_ptr<UkmEntryBuilder> builder = | 372 std::unique_ptr<UkmEntryBuilder> builder = |
| 349 service.GetEntryBuilder(id, "PageLoad"); | 373 service.GetEntryBuilder(id, "PageLoad"); |
| 350 builder->AddMetric("FirstContentfulPaint", 300); | 374 builder->AddMetric("FirstContentfulPaint", 300); |
| 351 } | 375 } |
| 352 // Includes a Source and an Entry, so will persist. | 376 // Includes a Source and an Entry, so will persist. |
| 353 service.Flush(); | 377 service.Flush(); |
| 354 EXPECT_EQ(GetPersistedLogCount(), 3); | 378 EXPECT_EQ(GetPersistedLogCount(), 3); |
| 355 | 379 |
| 356 // Current log has no Sources. | 380 // Current log has no Sources. |
| 357 service.Flush(); | 381 service.Flush(); |
| 358 EXPECT_EQ(GetPersistedLogCount(), 3); | 382 EXPECT_EQ(GetPersistedLogCount(), 3); |
| 359 } | 383 } |
| 360 | 384 |
| 361 TEST_F(UkmServiceTest, GetNewSourceID) { | 385 TEST_F(UkmServiceTest, GetNewSourceID) { |
| 362 int32_t id1 = UkmService::GetNewSourceID(); | 386 ukm::SourceId id1 = UkmRecorder::GetNewSourceID(); |
| 363 int32_t id2 = UkmService::GetNewSourceID(); | 387 ukm::SourceId id2 = UkmRecorder::GetNewSourceID(); |
| 364 int32_t id3 = UkmService::GetNewSourceID(); | 388 ukm::SourceId id3 = UkmRecorder::GetNewSourceID(); |
| 365 EXPECT_NE(id1, id2); | 389 EXPECT_NE(id1, id2); |
| 366 EXPECT_NE(id1, id3); | 390 EXPECT_NE(id1, id3); |
| 367 EXPECT_NE(id2, id3); | 391 EXPECT_NE(id2, id3); |
| 368 } | 392 } |
| 369 | 393 |
| 370 TEST_F(UkmServiceTest, RecordInitialUrl) { | 394 TEST_F(UkmServiceTest, RecordInitialUrl) { |
| 371 for (bool should_record_initial_url : {true, false}) { | 395 for (bool should_record_initial_url : {true, false}) { |
| 372 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); | 396 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
| 373 ScopedUkmFeatureParams params( | 397 ScopedUkmFeatureParams params( |
| 374 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | 398 base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
| 375 {{"RecordInitialUrl", should_record_initial_url ? "true" : "false"}}); | 399 {{"RecordInitialUrl", should_record_initial_url ? "true" : "false"}}); |
| 376 | 400 |
| 377 ClearPrefs(); | 401 ClearPrefs(); |
| 378 UkmService service(&prefs_, &client_); | 402 UkmService service(&prefs_, &client_); |
| 403 TestRecordingHelper recorder(&service); |
| 379 EXPECT_EQ(GetPersistedLogCount(), 0); | 404 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 380 service.Initialize(); | 405 service.Initialize(); |
| 381 task_runner_->RunUntilIdle(); | 406 task_runner_->RunUntilIdle(); |
| 382 service.EnableRecording(); | 407 service.EnableRecording(); |
| 383 service.EnableReporting(); | 408 service.EnableReporting(); |
| 384 | 409 |
| 385 int32_t id = UkmService::GetNewSourceID(); | 410 ukm::SourceId id = UkmRecorder::GetNewSourceID(); |
| 386 service.UpdateSourceURL(id, GURL("https://google.com/initial")); | 411 recorder.UpdateSourceURL(id, GURL("https://google.com/initial")); |
| 387 service.UpdateSourceURL(id, GURL("https://google.com/intermediate")); | 412 recorder.UpdateSourceURL(id, GURL("https://google.com/intermediate")); |
| 388 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 413 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 389 | 414 |
| 390 service.Flush(); | 415 service.Flush(); |
| 391 EXPECT_EQ(GetPersistedLogCount(), 1); | 416 EXPECT_EQ(GetPersistedLogCount(), 1); |
| 392 | 417 |
| 393 Report proto_report = GetPersistedReport(); | 418 Report proto_report = GetPersistedReport(); |
| 394 EXPECT_EQ(1, proto_report.sources_size()); | 419 EXPECT_EQ(1, proto_report.sources_size()); |
| 395 const Source& proto_source = proto_report.sources(0); | 420 const Source& proto_source = proto_report.sources(0); |
| 396 | 421 |
| 397 EXPECT_EQ(id, proto_source.id()); | 422 EXPECT_EQ(id, proto_source.id()); |
| 398 EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); | 423 EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); |
| 399 EXPECT_EQ(should_record_initial_url, proto_source.has_initial_url()); | 424 EXPECT_EQ(should_record_initial_url, proto_source.has_initial_url()); |
| 400 if (should_record_initial_url) { | 425 if (should_record_initial_url) { |
| 401 EXPECT_EQ(GURL("https://google.com/initial").spec(), | 426 EXPECT_EQ(GURL("https://google.com/initial").spec(), |
| 402 proto_source.initial_url()); | 427 proto_source.initial_url()); |
| 403 } | 428 } |
| 404 } | 429 } |
| 405 } | 430 } |
| 406 | 431 |
| 407 TEST_F(UkmServiceTest, RecordSessionId) { | 432 TEST_F(UkmServiceTest, RecordSessionId) { |
| 408 for (bool should_record_session_id : {true, false}) { | 433 for (bool should_record_session_id : {true, false}) { |
| 409 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); | 434 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
| 410 ScopedUkmFeatureParams params( | 435 ScopedUkmFeatureParams params( |
| 411 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | 436 base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
| 412 {{"RecordSessionId", should_record_session_id ? "true" : "false"}}); | 437 {{"RecordSessionId", should_record_session_id ? "true" : "false"}}); |
| 413 | 438 |
| 414 ClearPrefs(); | 439 ClearPrefs(); |
| 415 UkmService service(&prefs_, &client_); | 440 UkmService service(&prefs_, &client_); |
| 441 TestRecordingHelper recorder(&service); |
| 416 EXPECT_EQ(0, GetPersistedLogCount()); | 442 EXPECT_EQ(0, GetPersistedLogCount()); |
| 417 service.Initialize(); | 443 service.Initialize(); |
| 418 task_runner_->RunUntilIdle(); | 444 task_runner_->RunUntilIdle(); |
| 419 service.EnableRecording(); | 445 service.EnableRecording(); |
| 420 service.EnableReporting(); | 446 service.EnableReporting(); |
| 421 | 447 |
| 422 auto id = UkmService::GetNewSourceID(); | 448 auto id = UkmRecorder::GetNewSourceID(); |
| 423 service.UpdateSourceURL(id, GURL("https://google.com/foobar")); | 449 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
| 424 | 450 |
| 425 service.Flush(); | 451 service.Flush(); |
| 426 EXPECT_EQ(1, GetPersistedLogCount()); | 452 EXPECT_EQ(1, GetPersistedLogCount()); |
| 427 | 453 |
| 428 auto proto_report = GetPersistedReport(); | 454 auto proto_report = GetPersistedReport(); |
| 429 EXPECT_EQ(should_record_session_id, proto_report.has_session_id()); | 455 EXPECT_EQ(should_record_session_id, proto_report.has_session_id()); |
| 430 } | 456 } |
| 431 } | 457 } |
| 432 | 458 |
| 433 TEST_F(UkmServiceTest, SourceSize) { | 459 TEST_F(UkmServiceTest, SourceSize) { |
| 434 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); | 460 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
| 435 // Set a threshold of number of Sources via Feature Params. | 461 // Set a threshold of number of Sources via Feature Params. |
| 436 ScopedUkmFeatureParams params(base::FeatureList::OVERRIDE_ENABLE_FEATURE, | 462 ScopedUkmFeatureParams params(base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
| 437 {{"MaxSources", "2"}}); | 463 {{"MaxSources", "2"}}); |
| 438 | 464 |
| 439 ClearPrefs(); | 465 ClearPrefs(); |
| 440 UkmService service(&prefs_, &client_); | 466 UkmService service(&prefs_, &client_); |
| 467 TestRecordingHelper recorder(&service); |
| 441 EXPECT_EQ(0, GetPersistedLogCount()); | 468 EXPECT_EQ(0, GetPersistedLogCount()); |
| 442 service.Initialize(); | 469 service.Initialize(); |
| 443 task_runner_->RunUntilIdle(); | 470 task_runner_->RunUntilIdle(); |
| 444 service.EnableRecording(); | 471 service.EnableRecording(); |
| 445 service.EnableReporting(); | 472 service.EnableReporting(); |
| 446 | 473 |
| 447 auto id = UkmService::GetNewSourceID(); | 474 auto id = UkmRecorder::GetNewSourceID(); |
| 448 service.UpdateSourceURL(id, GURL("https://google.com/foobar1")); | 475 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar1")); |
| 449 id = UkmService::GetNewSourceID(); | 476 id = UkmRecorder::GetNewSourceID(); |
| 450 service.UpdateSourceURL(id, GURL("https://google.com/foobar2")); | 477 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar2")); |
| 451 id = UkmService::GetNewSourceID(); | 478 id = UkmRecorder::GetNewSourceID(); |
| 452 service.UpdateSourceURL(id, GURL("https://google.com/foobar3")); | 479 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar3")); |
| 453 | 480 |
| 454 service.Flush(); | 481 service.Flush(); |
| 455 EXPECT_EQ(1, GetPersistedLogCount()); | 482 EXPECT_EQ(1, GetPersistedLogCount()); |
| 456 | 483 |
| 457 auto proto_report = GetPersistedReport(); | 484 auto proto_report = GetPersistedReport(); |
| 458 // Note, 2 instead of 3 sources, since we overrode the max number of sources | 485 // Note, 2 instead of 3 sources, since we overrode the max number of sources |
| 459 // via Feature params. | 486 // via Feature params. |
| 460 EXPECT_EQ(2, proto_report.sources_size()); | 487 EXPECT_EQ(2, proto_report.sources_size()); |
| 461 } | 488 } |
| 462 | 489 |
| 463 TEST_F(UkmServiceTest, PurgeMidUpload) { | 490 TEST_F(UkmServiceTest, PurgeMidUpload) { |
| 464 UkmService service(&prefs_, &client_); | 491 UkmService service(&prefs_, &client_); |
| 492 TestRecordingHelper recorder(&service); |
| 465 EXPECT_EQ(GetPersistedLogCount(), 0); | 493 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 466 service.Initialize(); | 494 service.Initialize(); |
| 467 task_runner_->RunUntilIdle(); | 495 task_runner_->RunUntilIdle(); |
| 468 service.EnableRecording(); | 496 service.EnableRecording(); |
| 469 service.EnableReporting(); | 497 service.EnableReporting(); |
| 470 auto id = UkmService::GetNewSourceID(); | 498 auto id = UkmRecorder::GetNewSourceID(); |
| 471 service.UpdateSourceURL(id, GURL("https://google.com/foobar1")); | 499 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar1")); |
| 472 // Should init, generate a log, and start an upload. | 500 // Should init, generate a log, and start an upload. |
| 473 task_runner_->RunPendingTasks(); | 501 task_runner_->RunPendingTasks(); |
| 474 EXPECT_TRUE(client_.uploader()->is_uploading()); | 502 EXPECT_TRUE(client_.uploader()->is_uploading()); |
| 475 // Purge should delete all logs, including the one being sent. | 503 // Purge should delete all logs, including the one being sent. |
| 476 service.Purge(); | 504 service.Purge(); |
| 477 // Upload succeeds after logs was deleted. | 505 // Upload succeeds after logs was deleted. |
| 478 client_.uploader()->CompleteUpload(200); | 506 client_.uploader()->CompleteUpload(200); |
| 479 EXPECT_EQ(GetPersistedLogCount(), 0); | 507 EXPECT_EQ(GetPersistedLogCount(), 0); |
| 480 EXPECT_FALSE(client_.uploader()->is_uploading()); | 508 EXPECT_FALSE(client_.uploader()->is_uploading()); |
| 481 } | 509 } |
| 482 | 510 |
| 483 TEST_F(UkmServiceTest, WhitelistEntryTest) { | 511 TEST_F(UkmServiceTest, WhitelistEntryTest) { |
| 484 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); | 512 base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
| 485 // Testing two whitelisted Entries. | 513 // Testing two whitelisted Entries. |
| 486 ScopedUkmFeatureParams params(base::FeatureList::OVERRIDE_ENABLE_FEATURE, | 514 ScopedUkmFeatureParams params(base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
| 487 {{"WhitelistEntries", "EntryA,EntryB"}}); | 515 {{"WhitelistEntries", "EntryA,EntryB"}}); |
| 488 | 516 |
| 489 ClearPrefs(); | 517 ClearPrefs(); |
| 490 UkmService service(&prefs_, &client_); | 518 UkmService service(&prefs_, &client_); |
| 519 TestRecordingHelper recorder(&service); |
| 491 EXPECT_EQ(0, GetPersistedLogCount()); | 520 EXPECT_EQ(0, GetPersistedLogCount()); |
| 492 service.Initialize(); | 521 service.Initialize(); |
| 493 task_runner_->RunUntilIdle(); | 522 task_runner_->RunUntilIdle(); |
| 494 service.EnableRecording(); | 523 service.EnableRecording(); |
| 495 service.EnableReporting(); | 524 service.EnableReporting(); |
| 496 | 525 |
| 497 auto id = UkmService::GetNewSourceID(); | 526 auto id = UkmRecorder::GetNewSourceID(); |
| 498 service.UpdateSourceURL(id, GURL("https://google.com/foobar1")); | 527 recorder.UpdateSourceURL(id, GURL("https://google.com/foobar1")); |
| 499 | 528 |
| 500 { | 529 { |
| 501 std::unique_ptr<UkmEntryBuilder> builder = | 530 std::unique_ptr<UkmEntryBuilder> builder = |
| 502 service.GetEntryBuilder(id, "EntryA"); | 531 service.GetEntryBuilder(id, "EntryA"); |
| 503 builder->AddMetric("MetricA", 300); | 532 builder->AddMetric("MetricA", 300); |
| 504 } | 533 } |
| 505 { | 534 { |
| 506 std::unique_ptr<UkmEntryBuilder> builder = | 535 std::unique_ptr<UkmEntryBuilder> builder = |
| 507 service.GetEntryBuilder(id, "EntryB"); | 536 service.GetEntryBuilder(id, "EntryB"); |
| 508 builder->AddMetric("MetricB", 400); | 537 builder->AddMetric("MetricB", 400); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 526 EXPECT_EQ(id, proto_entry_a.source_id()); | 555 EXPECT_EQ(id, proto_entry_a.source_id()); |
| 527 EXPECT_EQ(base::HashMetricName("EntryA"), proto_entry_a.event_hash()); | 556 EXPECT_EQ(base::HashMetricName("EntryA"), proto_entry_a.event_hash()); |
| 528 | 557 |
| 529 const Entry& proto_entry_b = proto_report.entries(1); | 558 const Entry& proto_entry_b = proto_report.entries(1); |
| 530 EXPECT_EQ(id, proto_entry_b.source_id()); | 559 EXPECT_EQ(id, proto_entry_b.source_id()); |
| 531 EXPECT_EQ(base::HashMetricName("EntryB"), proto_entry_b.event_hash()); | 560 EXPECT_EQ(base::HashMetricName("EntryB"), proto_entry_b.event_hash()); |
| 532 } | 561 } |
| 533 | 562 |
| 534 TEST_F(UkmServiceTest, SourceURLLength) { | 563 TEST_F(UkmServiceTest, SourceURLLength) { |
| 535 UkmService service(&prefs_, &client_); | 564 UkmService service(&prefs_, &client_); |
| 565 TestRecordingHelper recorder(&service); |
| 536 EXPECT_EQ(0, GetPersistedLogCount()); | 566 EXPECT_EQ(0, GetPersistedLogCount()); |
| 537 service.Initialize(); | 567 service.Initialize(); |
| 538 task_runner_->RunUntilIdle(); | 568 task_runner_->RunUntilIdle(); |
| 539 service.EnableRecording(); | 569 service.EnableRecording(); |
| 540 service.EnableReporting(); | 570 service.EnableReporting(); |
| 541 | 571 |
| 542 auto id = UkmService::GetNewSourceID(); | 572 auto id = UkmRecorder::GetNewSourceID(); |
| 543 | 573 |
| 544 // This URL is too long to be recorded fully. | 574 // This URL is too long to be recorded fully. |
| 545 const std::string long_string = "https://" + std::string(10000, 'a'); | 575 const std::string long_string = "https://" + std::string(10000, 'a'); |
| 546 service.UpdateSourceURL(id, GURL(long_string)); | 576 recorder.UpdateSourceURL(id, GURL(long_string)); |
| 547 | 577 |
| 548 service.Flush(); | 578 service.Flush(); |
| 549 EXPECT_EQ(1, GetPersistedLogCount()); | 579 EXPECT_EQ(1, GetPersistedLogCount()); |
| 550 | 580 |
| 551 auto proto_report = GetPersistedReport(); | 581 auto proto_report = GetPersistedReport(); |
| 552 ASSERT_EQ(1, proto_report.sources_size()); | 582 ASSERT_EQ(1, proto_report.sources_size()); |
| 553 const Source& proto_source = proto_report.sources(0); | 583 const Source& proto_source = proto_report.sources(0); |
| 554 EXPECT_EQ("URLTooLong", proto_source.url()); | 584 EXPECT_EQ("URLTooLong", proto_source.url()); |
| 555 } | 585 } |
| 556 | 586 |
| 557 } // namespace ukm | 587 } // namespace ukm |
| OLD | NEW |