Index: testing/test_support.cpp |
diff --git a/testing/test_support.cpp b/testing/test_support.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..611ba5d580641df8c5a64c31c273ab83e630a0a9 |
--- /dev/null |
+++ b/testing/test_support.cpp |
@@ -0,0 +1,140 @@ |
+// Copyright 2015 PDFium 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 "test_support.h" |
+ |
+#include <stdio.h> |
+#include <string.h> |
+ |
+#ifdef _WIN32 |
+#define PATH_SEPARATOR '\\' |
+#else |
+#define PATH_SEPARATOR '/' |
+#endif |
+ |
+namespace { |
+ |
+#ifdef PDF_ENABLE_V8 |
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA |
+// Returns the full path for an external V8 data file based on either |
+// the currect exectuable path or an explicit override. |
+std::string GetFullPathForSnapshotFile(const std::string& exe_path, |
+ const std::string& bin_dir, |
+ const std::string& filename) { |
+ std::string result; |
+ if (!bin_dir.empty()) { |
+ result = bin_dir; |
+ if (*bin_dir.rbegin() != PATH_SEPARATOR) { |
+ result += PATH_SEPARATOR; |
+ } |
+ } else if (!exe_path.empty()) { |
+ size_t last_separator = exe_path.rfind(PATH_SEPARATOR); |
+ if (last_separator != std::string::npos) { |
+ result = exe_path.substr(0, last_separator + 1); |
+ } |
+ } |
+ result += filename; |
+ return result; |
+} |
+ |
+bool GetExternalData(const std::string& exe_path, |
+ const std::string& bin_dir, |
+ const std::string& filename, |
+ v8::StartupData* result_data) { |
+ std::string full_path = |
+ GetFullPathForSnapshotFile(exe_path, bin_dir, filename); |
+ size_t data_length = 0; |
+ char* data_buffer = GetFileContents(full_path.c_str(), &data_length); |
+ if (!data_buffer) { |
+ return false; |
+ } |
+ result_data->data = const_cast<const char*>(data_buffer); |
+ result_data->raw_size = data_length; |
+ return true; |
+} |
+#endif // V8_USE_EXTERNAL_STARTUP_DATA |
+ |
+void InitializeV8Common(v8::Platform** platform) { |
+ v8::V8::InitializeICU(); |
+ |
+ *platform = v8::platform::CreateDefaultPlatform(); |
+ v8::V8::InitializePlatform(*platform); |
+ v8::V8::Initialize(); |
+ |
+ // By enabling predictable mode, V8 won't post any background tasks. |
+ const char predictable_flag[] = "--predictable"; |
+ v8::V8::SetFlagsFromString(predictable_flag, |
+ static_cast<int>(strlen(predictable_flag))); |
+} |
+#endif // PDF_ENABLE_V8 |
+ |
+} // namespace |
+ |
+char* GetFileContents(const char* filename, size_t* retlen) { |
+ FILE* file = fopen(filename, "rb"); |
+ if (!file) { |
+ fprintf(stderr, "Failed to open: %s\n", filename); |
+ return nullptr; |
+ } |
+ (void)fseek(file, 0, SEEK_END); |
+ size_t file_length = ftell(file); |
+ if (!file_length) { |
+ return nullptr; |
+ } |
+ (void)fseek(file, 0, SEEK_SET); |
+ char* buffer = (char*)malloc(file_length); |
+ if (!buffer) { |
+ return nullptr; |
+ } |
+ size_t bytes_read = fread(buffer, 1, file_length, file); |
+ (void)fclose(file); |
+ if (bytes_read != file_length) { |
+ fprintf(stderr, "Failed to read: %s\n", filename); |
+ free(buffer); |
+ return nullptr; |
+ } |
+ *retlen = bytes_read; |
+ return buffer; |
+} |
+ |
+#ifdef PDF_ENABLE_V8 |
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA |
+bool InitializeV8ForPDFium(const std::string& exe_path, |
+ const std::string& bin_dir, |
+ v8::StartupData* natives_blob, |
+ v8::StartupData* snapshot_blob, |
+ v8::Platform** platform) { |
+ InitializeV8Common(platform); |
+ if (!GetExternalData(exe_path, bin_dir, "natives_blob.bin", natives_blob)) |
+ return false; |
+ if (!GetExternalData(exe_path, bin_dir, "snapshot_blob.bin", snapshot_blob)) |
+ return false; |
+ v8::V8::SetNativesDataBlob(natives_blob); |
+ v8::V8::SetSnapshotDataBlob(snapshot_blob); |
+ return true; |
+} |
+#else // V8_USE_EXTERNAL_STARTUP_DATA |
+bool InitializeV8ForPDFium(v8::Platform** platform) { |
+ InitializeV8Common(platform); |
+ return true; |
+} |
+#endif // V8_USE_EXTERNAL_STARTUP_DATA |
+#endif // PDF_ENABLE_V8 |
+ |
+TestLoader::TestLoader(const char* pBuf, size_t len) |
+ : m_pBuf(pBuf), m_Len(len) { |
+} |
+ |
+// static |
+int TestLoader::GetBlock(void* param, |
+ unsigned long pos, |
+ unsigned char* pBuf, |
+ unsigned long size) { |
+ TestLoader* pLoader = static_cast<TestLoader*>(param); |
+ if (pos + size < pos || pos + size > pLoader->m_Len) |
+ return 0; |
+ |
+ memcpy(pBuf, pLoader->m_pBuf + pos, size); |
+ return 1; |
+} |