Use seeds to drive variations extended safe mode end-to-end test

This CL updates the variations extended safe mode end-to-end tests
[see TEST_P(FieldTrialTest, ExtendedSafeModeEndToEnd)] to inject a
safe seed into the test environment and use a candidate seed to
enable a crashing feature.

Bug: 1249256
Change-Id: Ibeb5131750188b0b99ebf9d7eed4acb16fd0b193
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3175920
Commit-Queue: Roger McFarlane <[email protected]>
Reviewed-by: Rohit Rao <[email protected]>
Reviewed-by: Alexei Svitkine <[email protected]>
Reviewed-by: Caitlin Fischer <[email protected]>
Cr-Commit-Position: refs/heads/main@{#928645}
diff --git a/components/variations/variations_test_utils_unittest.cc b/components/variations/variations_test_utils_unittest.cc
new file mode 100644
index 0000000..b717044
--- /dev/null
+++ b/components/variations/variations_test_utils_unittest.cc
@@ -0,0 +1,74 @@
+// Copyright 2021 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 "components/variations/variations_test_utils.h"
+
+#include "base/base64.h"
+#include "base/ranges/algorithm.h"
+#include "components/variations/metrics.h"
+#include "components/variations/proto/variations_seed.pb.h"
+#include "components/variations/variations_seed_store.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/zlib/google/compression_utils.h"
+
+namespace variations {
+
+using SignedSeedDataTest = ::testing::TestWithParam<SignedSeedData>;
+
+TEST_P(SignedSeedDataTest, HasValidBase64Data) {
+  const auto& signed_seed_data = GetParam();
+
+  std::string decoded_compressed_data;
+  ASSERT_TRUE(base::Base64Decode(signed_seed_data.base64_compressed_data,
+                                 &decoded_compressed_data));
+
+  std::string actual_uncompressed_data;
+  ASSERT_TRUE(compression::GzipUncompress(decoded_compressed_data,
+                                          &actual_uncompressed_data));
+
+  std::string actual_encoded_uncompressed_data;
+  base::Base64Encode(actual_uncompressed_data,
+                     &actual_encoded_uncompressed_data);
+  EXPECT_EQ(actual_encoded_uncompressed_data,
+            signed_seed_data.base64_uncompressed_data);
+
+  std::string decoded_uncompressed_data;
+  ASSERT_TRUE(base::Base64Decode(signed_seed_data.base64_uncompressed_data,
+                                 &decoded_uncompressed_data));
+
+  EXPECT_EQ(decoded_uncompressed_data, actual_uncompressed_data);
+}
+
+TEST_P(SignedSeedDataTest, HasValidSignature) {
+  const auto& signed_seed_data = GetParam();
+  std::string decoded_uncompressed_data;
+  ASSERT_TRUE(base::Base64Decode(signed_seed_data.base64_uncompressed_data,
+                                 &decoded_uncompressed_data));
+
+  const auto verify_signature_result =
+      VariationsSeedStore::VerifySeedSignatureForTesting(
+          decoded_uncompressed_data, signed_seed_data.base64_signature);
+  EXPECT_EQ(VerifySignatureResult::VALID_SIGNATURE, verify_signature_result);
+}
+
+TEST_P(SignedSeedDataTest, HasStudyNames) {
+  const auto& signed_seed_data = GetParam();
+  std::string decoded_uncompressed_data;
+  ASSERT_TRUE(base::Base64Decode(signed_seed_data.base64_uncompressed_data,
+                                 &decoded_uncompressed_data));
+  VariationsSeed seed;
+  ASSERT_TRUE(seed.ParseFromString(decoded_uncompressed_data));
+  std::vector<std::string> parsed_study_names;
+  base::ranges::transform(seed.study(), std::back_inserter(parsed_study_names),
+                          [](const Study& s) { return s.name(); });
+  EXPECT_THAT(parsed_study_names, ::testing::UnorderedElementsAreArray(
+                                      signed_seed_data.study_names));
+}
+
+INSTANTIATE_TEST_CASE_P(VariationsTestUtils,
+                        SignedSeedDataTest,
+                        ::testing::Values(kTestSeedData, kCrashingSeedData));
+
+}  // namespace variations
\ No newline at end of file