Index: components/ukm/ukm_service_unittest.cc |
diff --git a/components/ukm/ukm_service_unittest.cc b/components/ukm/ukm_service_unittest.cc |
index 3ec67ce19318151a0e4d3377ccc20f3e21c85a62..21f31eefc7b1c881e17233b168cb77097e5e8eb5 100644 |
--- a/components/ukm/ukm_service_unittest.cc |
+++ b/components/ukm/ukm_service_unittest.cc |
@@ -4,11 +4,13 @@ |
#include "components/ukm/ukm_service.h" |
+#include <map> |
#include <string> |
#include <utility> |
#include "base/hash.h" |
#include "base/metrics/metrics_hashes.h" |
+#include "base/test/scoped_feature_list.h" |
#include "base/test/test_simple_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "components/metrics/proto/ukm/report.pb.h" |
@@ -20,6 +22,7 @@ |
#include "components/ukm/ukm_entry_builder.h" |
#include "components/ukm/ukm_pref_names.h" |
#include "components/ukm/ukm_source.h" |
+#include "components/variations/variations_associated_data.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/zlib/google/compression_utils.h" |
@@ -27,13 +30,63 @@ namespace ukm { |
namespace { |
+// TODO(rkaplow): consider making this a generic testing class in |
+// components/variations. |
+class ScopedUkmFeatureParams { |
+ public: |
+ ScopedUkmFeatureParams( |
+ base::FeatureList::OverrideState feature_state, |
+ const std::map<std::string, std::string>& variation_params) { |
+ static const char kTestFieldTrialName[] = "TestTrial"; |
+ static const char kTestExperimentGroupName[] = "TestGroup"; |
+ |
+ variations::testing::ClearAllVariationParams(); |
+ |
+ EXPECT_TRUE(variations::AssociateVariationParams( |
+ kTestFieldTrialName, kTestExperimentGroupName, variation_params)); |
+ |
+ base::FieldTrial* field_trial = base::FieldTrialList::CreateFieldTrial( |
+ kTestFieldTrialName, kTestExperimentGroupName); |
+ |
+ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
+ feature_list->RegisterFieldTrialOverride(kUkmFeature.name, feature_state, |
+ field_trial); |
+ |
+ // Since we are adding a scoped feature list after browser start, copy over |
+ // the existing feature list to prevent inconsistency. |
+ base::FeatureList* existing_feature_list = base::FeatureList::GetInstance(); |
+ if (existing_feature_list) { |
+ std::string enabled_features; |
+ std::string disabled_features; |
+ base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features, |
+ &disabled_features); |
+ feature_list->InitializeFromCommandLine(enabled_features, |
+ disabled_features); |
+ } |
+ |
+ scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); |
+ } |
+ |
+ ~ScopedUkmFeatureParams() { variations::testing::ClearAllVariationParams(); } |
+ |
+ private: |
+ base::test::ScopedFeatureList scoped_feature_list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedUkmFeatureParams); |
+}; |
+ |
class UkmServiceTest : public testing::Test { |
public: |
UkmServiceTest() |
: task_runner_(new base::TestSimpleTaskRunner), |
task_runner_handle_(task_runner_) { |
UkmService::RegisterPrefs(prefs_.registry()); |
+ ClearPrefs(); |
+ } |
+ |
+ void ClearPrefs() { |
prefs_.ClearPref(prefs::kUkmClientId); |
+ prefs_.ClearPref(prefs::kUkmSessionId); |
prefs_.ClearPref(prefs::kUkmPersistedLogs); |
} |
@@ -126,6 +179,8 @@ TEST_F(UkmServiceTest, SourceSerialization) { |
service.EnableReporting(); |
int32_t id = UkmService::GetNewSourceID(); |
+ service.UpdateSourceURL(id, GURL("https://google.com/initial")); |
+ service.UpdateSourceURL(id, GURL("https://google.com/intermediate")); |
service.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
service.Flush(); |
@@ -133,10 +188,12 @@ TEST_F(UkmServiceTest, SourceSerialization) { |
Report proto_report = GetPersistedReport(); |
EXPECT_EQ(1, proto_report.sources_size()); |
+ EXPECT_FALSE(proto_report.has_session_id()); |
const Source& proto_source = proto_report.sources(0); |
EXPECT_EQ(id, proto_source.id()); |
EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); |
+ EXPECT_FALSE(proto_source.has_initial_url()); |
} |
TEST_F(UkmServiceTest, EntryBuilderAndSerialization) { |
@@ -320,4 +377,67 @@ TEST_F(UkmServiceTest, GetNewSourceID) { |
EXPECT_NE(id2, id3); |
} |
+TEST_F(UkmServiceTest, RecordInitialUrl) { |
+ for (bool should_record_initial_url : {true, false}) { |
+ base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
+ ScopedUkmFeatureParams params( |
+ base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
+ {{"RecordInitialUrl", should_record_initial_url ? "true" : "false"}}); |
+ |
+ ClearPrefs(); |
+ UkmService service(&prefs_, &client_); |
+ EXPECT_EQ(GetPersistedLogCount(), 0); |
+ service.Initialize(); |
+ task_runner_->RunUntilIdle(); |
+ service.EnableRecording(); |
+ service.EnableReporting(); |
+ |
+ int32_t id = UkmService::GetNewSourceID(); |
+ service.UpdateSourceURL(id, GURL("https://google.com/initial")); |
+ service.UpdateSourceURL(id, GURL("https://google.com/intermediate")); |
+ service.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
+ |
+ service.Flush(); |
+ EXPECT_EQ(GetPersistedLogCount(), 1); |
+ |
+ Report proto_report = GetPersistedReport(); |
+ EXPECT_EQ(1, proto_report.sources_size()); |
+ const Source& proto_source = proto_report.sources(0); |
+ |
+ EXPECT_EQ(id, proto_source.id()); |
+ EXPECT_EQ(GURL("https://google.com/foobar").spec(), proto_source.url()); |
+ EXPECT_EQ(should_record_initial_url, proto_source.has_initial_url()); |
+ if (should_record_initial_url) { |
+ EXPECT_EQ(GURL("https://google.com/initial").spec(), |
+ proto_source.initial_url()); |
+ } |
+ } |
+} |
+ |
+TEST_F(UkmServiceTest, RecordSessionId) { |
+ for (bool should_record_session_id : {true, false}) { |
+ base::FieldTrialList field_trial_list(nullptr /* entropy_provider */); |
+ ScopedUkmFeatureParams params( |
+ base::FeatureList::OVERRIDE_ENABLE_FEATURE, |
+ {{"RecordSessionId", should_record_session_id ? "true" : "false"}}); |
+ |
+ ClearPrefs(); |
+ UkmService service(&prefs_, &client_); |
+ EXPECT_EQ(GetPersistedLogCount(), 0); |
+ service.Initialize(); |
+ task_runner_->RunUntilIdle(); |
+ service.EnableRecording(); |
+ service.EnableReporting(); |
+ |
+ int32_t id = UkmService::GetNewSourceID(); |
+ service.UpdateSourceURL(id, GURL("https://google.com/foobar")); |
+ |
+ service.Flush(); |
+ EXPECT_EQ(GetPersistedLogCount(), 1); |
+ |
+ Report proto_report = GetPersistedReport(); |
+ EXPECT_EQ(should_record_session_id, proto_report.has_session_id()); |
+ } |
+} |
+ |
} // namespace ukm |