1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/test/file_runner.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/path_service.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gin/array_buffer.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/converter.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/modules/console.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/modules/module_registry.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "gin/public/context_holder.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/public/isolate_holder.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/test/file.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "gin/test/gc.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/test/gtest.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/try_catch.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gin { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::vector<base::FilePath> GetModuleSearchPaths() { 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::FilePath> search_paths(2); 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &search_paths[0]); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PathService::Get(base::DIR_EXE, &search_paths[1]); 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) search_paths[1] = search_paths[1].AppendASCII("gen"); 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return search_paths; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FileRunnerDelegate::FileRunnerDelegate() 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : ModuleRunnerDelegate(GetModuleSearchPaths()) { 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddBuiltinModule(Console::kModuleName, Console::GetModule); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddBuiltinModule(GTest::kModuleName, GTest::GetModule); 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AddBuiltinModule(GC::kModuleName, GC::GetModule); 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddBuiltinModule(File::kModuleName, File::GetModule); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FileRunnerDelegate::~FileRunnerDelegate() { 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FileRunnerDelegate::UnhandledException(ShellRunner* runner, 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TryCatch& try_catch) { 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ModuleRunnerDelegate::UnhandledException(runner, try_catch); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FAIL() << try_catch.GetStackTrace(); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RunTestFromFile(const base::FilePath& path, FileRunnerDelegate* delegate, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool run_until_idle) { 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(base::PathExists(path)) << path.LossyDisplayName(); 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string source; 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(ReadFileToString(path, &source)); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop message_loop; 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gin::ArrayBufferAllocator::SharedInstance()); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gin::IsolateHolder instance; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gin::ShellRunner runner(delegate, instance.isolate()); 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gin::Runner::Scope scope(&runner); 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) runner.Run(source, path.AsUTF8Unsafe()); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (run_until_idle) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_loop.RunUntilIdle(); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_loop.Run(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) v8::Handle<v8::Value> result = runner.global()->Get( 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StringToSymbol(runner.GetContextHolder()->isolate(), "result")); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("PASS", V8ToString(result)); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace gin 83