// Copyright 2021 The Chromium Authors
// 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 <algorithm>

#include "base/base64.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 {
namespace {

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);
  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::kValidSignature, 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;
  std::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_SUITE_P(VariationsTestUtils,
                         SignedSeedDataTest,
                         ::testing::Values(kTestSeedData, kCrashingSeedData));

}  // namespace
}  // namespace variations
