| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_ |
| #define SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_ |
| |
| #include <zircon/status.h> |
| #include <zircon/types.h> |
| |
| #include "src/developer/shell/josh/lib/runtime.h" |
| #include "third_party/quickjs/quickjs.h" |
| |
| namespace shell { |
| |
| // A class that supports running a test inside a quickjs context. |
| class JsTest : public ::testing::Test { |
| protected: |
| void SetUp() override { |
| rt_ = std::make_unique<Runtime>(); |
| ASSERT_NE(nullptr, rt_.get()) << "Cannot allocate JS runtime"; |
| |
| ctx_ = std::make_unique<Context>(rt_.get()); |
| ASSERT_NE(nullptr, ctx_.get()) << "Cannot allocate JS context"; |
| if (!ctx_->InitStd()) { |
| ctx_->DumpError(); |
| FAIL(); |
| } |
| } |
| |
| // Initializes shell-specific modules, including fidl, zx, and fdio. |
| // |fidl_path| points to where you look for FIDL JSON IR. |
| // |js_lib_path| points to where you look for system JS libs. |
| void InitBuiltins(const std::string& fidl_path, const std::string& js_lib_path) { |
| if (!ctx_->InitBuiltins(fidl_path, js_lib_path)) { |
| ctx_->DumpError(); |
| FAIL(); |
| } |
| } |
| |
| bool Eval(std::string command) { |
| JSValue result = JS_Eval(ctx_->Get(), command.c_str(), command.length(), "batch", 0); |
| if (JS_IsException(result)) { |
| ctx_->DumpError(); |
| return false; |
| } |
| return true; |
| } |
| |
| std::unique_ptr<Context> ctx_; |
| std::unique_ptr<Runtime> rt_; |
| }; |
| |
| } // namespace shell |
| |
| #endif // SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_ |