// 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 "chrome/browser/resources_integrity.h"

#include "base/bind.h"
#include "base/path_service.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/app/packed_resources_integrity.h"
#include "chrome/browser/buildflags.h"
#include "chrome/common/chrome_paths.h"
#include "testing/gtest/include/gtest/gtest.h"

class CheckResourceIntegrityTest : public testing::Test {
 protected:
  base::test::TaskEnvironment task_environment_;
};

TEST_F(CheckResourceIntegrityTest, Match) {
  base::FilePath test_data_path;
  ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_path));

  std::array<uint8_t, crypto::kSHA256Length> expected = {
      0x1b, 0x3a, 0x5c, 0x9f, 0x92, 0x74, 0x48, 0xcc, 0x89, 0x1a, 0xe8,
      0x3e, 0xcb, 0xfa, 0xc6, 0x6e, 0xb8, 0x73, 0x03, 0xf2, 0xb2, 0x25,
      0xee, 0xf3, 0xba, 0x7f, 0xb6, 0x94, 0x85, 0x61, 0xe2, 0xe8};

  base::RunLoop loop;
  CheckResourceIntegrity(test_data_path.AppendASCII("circle.svg"), expected,
                         base::SequencedTaskRunnerHandle::Get(),
                         base::BindLambdaForTesting([&](bool matches) {
                           EXPECT_TRUE(matches);
                           loop.Quit();
                         }));
  loop.Run();
}

TEST_F(CheckResourceIntegrityTest, Mismatch) {
  base::FilePath test_data_path;
  ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_path));

  std::vector<uint8_t> unexpected(crypto::kSHA256Length, 'a');
  base::RunLoop loop;
  CheckResourceIntegrity(test_data_path.AppendASCII("circle.svg"),
                         base::make_span<32>(unexpected),
                         base::SequencedTaskRunnerHandle::Get(),
                         base::BindLambdaForTesting([&](bool matches) {
                           EXPECT_FALSE(matches);
                           loop.Quit();
                         }));
  loop.Run();
}

TEST_F(CheckResourceIntegrityTest, NonExistentFile) {
  std::vector<uint8_t> unexpected(crypto::kSHA256Length, 'a');
  base::RunLoop loop;
  CheckResourceIntegrity(
      base::FilePath(FILE_PATH_LITERAL("this file does not exist.moo")),
      base::make_span<crypto::kSHA256Length>(unexpected),
      base::SequencedTaskRunnerHandle::Get(),
      base::BindLambdaForTesting([&](bool matches) {
        EXPECT_FALSE(matches);
        loop.Quit();
      }));
  loop.Quit();
}

#if defined(OS_WIN)
// On Windows, CheckPakFileIntegrity() dynamically finds this symbol from its
// main exe module (normally chrome.exe). In unit_tests.exe, provide the same
// export.
extern "C" __declspec(dllexport) __cdecl void GetPakFileHashes(
    const uint8_t** resources_pak,
    const uint8_t** chrome_100_pak,
    const uint8_t** chrome_200_pak) {
  *resources_pak = kSha256_resources_pak.data();
  *chrome_100_pak = kSha256_chrome_100_percent_pak.data();
  *chrome_200_pak = kSha256_chrome_200_percent_pak.data();
}
#endif  // defined(OS_WIN)

TEST_F(CheckResourceIntegrityTest, ChromePaks) {
  base::HistogramTester tester;
  CheckPakFileIntegrity();
  task_environment_.RunUntilIdle();
  tester.ExpectBucketCount("SafeBrowsing.PakIntegrity.Resources", 1, 1);
  tester.ExpectBucketCount("SafeBrowsing.PakIntegrity.Chrome100", 1, 1);
  tester.ExpectBucketCount("SafeBrowsing.PakIntegrity.Chrome200", 1, 1);
}
