summaryrefslogtreecommitdiff
path: root/testing/test_support.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'testing/test_support.cpp')
-rw-r--r--testing/test_support.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/testing/test_support.cpp b/testing/test_support.cpp
new file mode 100644
index 0000000000..611ba5d580
--- /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;
+}