// Copyright 2018 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "build/build_config.h"
#include "core/fxcrt/fx_memory.h"
#include "testing/embedder_test_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

#ifdef PDF_ENABLE_V8
#include "testing/v8_test_environment.h"
#endif  // PDF_ENABLE_V8

#if defined(PDF_USE_PARTITION_ALLOC)
#include "testing/allocator_shim_config.h"
#endif

#if defined(BUILD_WITH_CHROMIUM) && defined(PDF_USE_SKIA)
#include "testing/chromium_support/discardable_memory_allocator.h"  // nogncheck
#endif

// Can't use gtest-provided main since we need to create our own
// testing environment which needs the executable path in order to
// find the external V8 binary data files.
int main(int argc, char** argv) {
#if defined(PDF_USE_PARTITION_ALLOC)
  pdfium::ConfigurePartitionAllocShimPartitionForTest();
#endif

  FX_InitializeMemoryAllocators();

#ifdef PDF_ENABLE_V8
  // The env will be deleted by gtest.
  AddGlobalTestEnvironment(new V8TestEnvironment(argv[0]));
#endif  // PDF_ENABLE_V8

  // The env will be deleted by gtest.
  AddGlobalTestEnvironment(new EmbedderTestEnvironment);

  testing::InitGoogleTest(&argc, argv);
  testing::InitGoogleMock(&argc, argv);

  // Anything remaining in argc/argv is an embedder_tests flag.
  EmbedderTestEnvironment::GetInstance()->AddFlags(argc, argv);

#if defined(BUILD_WITH_CHROMIUM) && defined(PDF_USE_SKIA)
  chromium_support::InitializeDiscardableMemoryAllocator();
#endif

  return RUN_ALL_TESTS();
}
