wasm-api-test.h 4.43 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// Copyright 2019 the V8 project 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 TEST_WASM_API_TESTS_WASM_API_TEST_H_
#define TEST_WASM_API_TESTS_WASM_API_TEST_H_

#include "src/wasm/wasm-module-builder.h"
#include "src/wasm/wasm-opcodes.h"
#include "src/zone/accounting-allocator.h"
#include "src/zone/zone.h"
#include "test/common/wasm/wasm-macro-gen.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/wasm-api/wasm.hh"

namespace v8 {
namespace internal {
namespace wasm {

using ::wasm::Engine;
using ::wasm::Extern;
using ::wasm::Foreign;
using ::wasm::Func;
using ::wasm::FuncType;
25
using ::wasm::Global;
26
using ::wasm::Instance;
27
using ::wasm::Memory;
28 29
using ::wasm::Module;
using ::wasm::own;
30
using ::wasm::ownvec;
31 32
using ::wasm::Ref;
using ::wasm::Store;
33
using ::wasm::Table;
34 35 36 37 38 39 40 41 42 43
using ::wasm::Trap;
using ::wasm::Val;
using ::wasm::ValType;
using ::wasm::vec;

class WasmCapiTest : public ::testing::Test {
 public:
  WasmCapiTest()
      : Test(),
        zone_(&allocator_, ZONE_NAME),
44
        wire_bytes_(&zone_),
45
        builder_(&zone_),
46
        exports_(ownvec<Extern>::make()),
47 48 49 50
        wasm_i_i_sig_(1, 1, wasm_i_i_sig_types_) {
    engine_ = Engine::make();
    store_ = Store::make(engine_.get());
    cpp_i_i_sig_ =
51 52
        FuncType::make(ownvec<ValType>::make(ValType::make(::wasm::I32)),
                       ownvec<ValType>::make(ValType::make(::wasm::I32)));
53 54 55
  }

  void Compile() {
56 57
    builder_.WriteTo(&wire_bytes_);
    size_t size = wire_bytes_.end() - wire_bytes_.begin();
58
    vec<byte_t> binary = vec<byte_t>::make(
59 60
        size,
        reinterpret_cast<byte_t*>(const_cast<byte*>(wire_bytes_.begin())));
61 62 63 64 65 66 67 68 69 70 71 72 73

    module_ = Module::make(store_.get(), binary);
    DCHECK_NE(module_.get(), nullptr);
  }

  void Instantiate(Extern* imports[]) {
    Compile();
    instance_ = Instance::make(store_.get(), module_.get(), imports);
    DCHECK_NE(instance_.get(), nullptr);
    exports_ = instance_->exports();
  }

  void AddExportedFunction(Vector<const char> name, byte code[],
74 75
                           size_t code_size, FunctionSig* sig) {
    WasmFunctionBuilder* fun = builder()->AddFunction(sig);
76 77 78 79 80 81 82
    fun->EmitCode(code, static_cast<uint32_t>(code_size));
    fun->Emit(kExprEnd);
    builder()->AddExport(name, fun);
  }

  Func* GetExportedFunction(size_t index) {
    DCHECK_GT(exports_.size(), index);
83
    Extern* exported = exports_[index].get();
84 85 86 87 88 89
    DCHECK_EQ(exported->kind(), ::wasm::EXTERN_FUNC);
    Func* func = exported->func();
    DCHECK_NE(func, nullptr);
    return func;
  }

90 91
  Global* GetExportedGlobal(size_t index) {
    DCHECK_GT(exports_.size(), index);
92
    Extern* exported = exports_[index].get();
93 94 95 96 97 98
    DCHECK_EQ(exported->kind(), ::wasm::EXTERN_GLOBAL);
    Global* global = exported->global();
    DCHECK_NE(global, nullptr);
    return global;
  }

99 100
  Memory* GetExportedMemory(size_t index) {
    DCHECK_GT(exports_.size(), index);
101
    Extern* exported = exports_[index].get();
102 103 104 105 106 107
    DCHECK_EQ(exported->kind(), ::wasm::EXTERN_MEMORY);
    Memory* memory = exported->memory();
    DCHECK_NE(memory, nullptr);
    return memory;
  }

108 109
  Table* GetExportedTable(size_t index) {
    DCHECK_GT(exports_.size(), index);
110
    Extern* exported = exports_[index].get();
111 112 113 114 115 116
    DCHECK_EQ(exported->kind(), ::wasm::EXTERN_TABLE);
    Table* table = exported->table();
    DCHECK_NE(table, nullptr);
    return table;
  }

117
  void Shutdown() {
118
    exports_.reset();
119 120 121 122 123 124 125
    instance_.reset();
    module_.reset();
    store_.reset();
    engine_.reset();
  }

  WasmModuleBuilder* builder() { return &builder_; }
126
  Engine* engine() { return engine_.get(); }
127 128
  Store* store() { return store_.get(); }
  Module* module() { return module_.get(); }
129
  Instance* instance() { return instance_.get(); }
130
  const ownvec<Extern>& exports() { return exports_; }
131
  ZoneBuffer* wire_bytes() { return &wire_bytes_; }
132 133 134 135 136 137 138

  FunctionSig* wasm_i_i_sig() { return &wasm_i_i_sig_; }
  FuncType* cpp_i_i_sig() { return cpp_i_i_sig_.get(); }

 private:
  AccountingAllocator allocator_;
  Zone zone_;
139
  ZoneBuffer wire_bytes_;
140
  WasmModuleBuilder builder_;
141 142 143 144 145 146
  own<Engine> engine_;
  own<Store> store_;
  own<Module> module_;
  own<Instance> instance_;
  ownvec<Extern> exports_;
  own<FuncType> cpp_i_i_sig_;
147 148 149 150 151 152 153 154 155
  ValueType wasm_i_i_sig_types_[2] = {kWasmI32, kWasmI32};
  FunctionSig wasm_i_i_sig_;
};

}  // namespace wasm
}  // namespace internal
}  // namespace v8

#endif  // TEST_WASM_API_TESTS_WASM_API_TEST_H_