Skip to content

Commit 7e1a9e4

Browse files
committed
[core] Backend agnostic impl for tests
1 parent e9dc888 commit 7e1a9e4

7 files changed

Lines changed: 72 additions & 49 deletions

File tree

.github/workflows/ci.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,17 @@ jobs:
3939
- name: Build (zware native)
4040
run: zig build -Dbackend=zware -Doptimize=ReleaseSafe
4141

42+
- name: Run tests (zware native)
43+
run: zig build test -Dbackend=zware
44+
4245
- name: Build (zware wasm32)
4346
run: zig build -Dbackend=zware wasm -Doptimize=ReleaseSmall
4447

4548
- name: Build (wasmer)
46-
run: zig build -Doptimize=ReleaseSafe
49+
run: zig build -Dbackend=wasmer -Doptimize=ReleaseSafe
4750

48-
- name: Run tests
49-
run: zig build test
51+
- name: Run tests (wasmer)
52+
run: zig build test -Dbackend=wasmer
5053

5154
- name: Setup Go
5255
uses: actions/setup-go@v5

build.zig.zon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
},
2727
.zware = .{
2828
.url = "https://github.com/burdzwastaken/zware/archive/refs/heads/master.tar.gz",
29-
.hash = "zware-0.0.1-ZA7j6dLpBAAIiASxs8G9aOkUqRNDjEtBrblF5QvgoNVV",
29+
.hash = "zware-0.0.1-ZA7j6U_qBAAfIr6ZENpSVSzxpBG5nDG9xxqx_cAi6IDC",
3030
},
3131
},
3232
.paths = .{

flake.nix

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
pkgs.open-policy-agent
4444
pkgs.zig
4545
pkgs.zls
46+
pkgs.wabt
4647
wasmer
4748
];
4849

@@ -51,11 +52,12 @@
5152
shellHook = ''
5253
echo "zig-opa-wasm development environment"
5354
echo ""
54-
echo " go: $(go version)"
55-
echo " opa: $(opa version | grep '^Version:' | cut -d' ' -f2)"
56-
echo " wasmer: $(wasmer --version 2>/dev/null | cut -d' ' -f2 || echo 'binary')"
57-
echo " zig: $(zig version)"
58-
echo " zls: $(zls --version)"
55+
echo " go: $(go version)"
56+
echo " opa: $(opa version | grep '^Version:' | cut -d' ' -f2)"
57+
echo " wasmer: $(wasmer --version 2>/dev/null | cut -d' ' -f2 || echo 'binary')"
58+
echo " wasm2wat: $(wasm2wat --version)"
59+
echo " zig: $(zig version)"
60+
echo " zls: $(zls --version)"
5961
echo ""
6062
'';
6163
};

src/backends/wasmer.zig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ fn serializeResult(allocator: std.mem.Allocator, ctx: *OpaContext, value: std.js
535535
}
536536

537537
test "wasmer backend init" {
538+
if (!is_wasmer) return;
538539
var wb = try WasmerBackend.init(std.testing.allocator);
539540
defer wb.deinit();
540541

@@ -543,6 +544,7 @@ test "wasmer backend init" {
543544
}
544545

545546
test "wasmer load and instantiate module" {
547+
if (!is_wasmer) return;
546548
const wasm_bytes = @embedFile("test_add_wasm");
547549
var wb = try WasmerBackend.init(std.testing.allocator);
548550
defer wb.deinit();

src/evaluation.zig

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,17 @@ test "evaluation context creation" {
149149
const testing = std.testing;
150150
const Policy = @import("policy.zig").Policy;
151151
const Inst = @import("instance.zig").Instance;
152-
const WasmerBackend = @import("backends/wasmer.zig").WasmerBackend;
152+
const options = @import("options");
153+
const BackendImpl = switch (options.backend) {
154+
.wasmer => @import("backends/wasmer.zig").WasmerBackend,
155+
.zware => @import("backends/zware.zig").ZwareBackend,
156+
};
153157

154158
const wasm_bytes = @embedFile("test_example_wasm");
155-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
156-
defer wasmer_backend.deinit();
159+
var wasm_backend = try BackendImpl.init(testing.allocator);
160+
defer wasm_backend.deinit();
157161

158-
var b = wasmer_backend.asBackend();
162+
var b = wasm_backend.asBackend();
159163
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
160164
defer policy.deinit();
161165

src/instance.zig

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@
22

33
const std = @import("std");
44
const backend = @import("backends/backend.zig");
5-
const wasmer = @import("backends/wasmer.zig");
5+
const options = @import("options");
66
const Policy = @import("policy.zig").Policy;
77
const MemoryManager = @import("memory/manager.zig").MemoryManager;
88

9+
const BackendImpl = switch (options.backend) {
10+
.wasmer => @import("backends/wasmer.zig").WasmerBackend,
11+
.zware => @import("backends/zware.zig").ZwareBackend,
12+
};
13+
const LogLevel = switch (options.backend) {
14+
.wasmer => @import("backends/wasmer.zig").LogLevel,
15+
.zware => @import("backends/zware.zig").LogLevel,
16+
};
17+
918
/// A live OPA WASM instance ready for policy evaluation.
1019
pub const Instance = struct {
1120
const Self = @This();
@@ -124,10 +133,10 @@ pub const Instance = struct {
124133
return self.evaluateById(entrypoint_id, input_json);
125134
}
126135

127-
fn log(self: *Self, level: @import("backends/wasmer.zig").LogLevel, comptime fmt: []const u8, args: anytype) void {
136+
fn log(self: *Self, level: LogLevel, comptime fmt: []const u8, args: anytype) void {
128137
var buf: [256]u8 = undefined;
129138
const msg = std.fmt.bufPrint(&buf, fmt, args) catch return;
130-
self.getWasmerBackend().opa_context.log(level, msg);
139+
self.getBackend().opa_context.log(level, msg);
131140
}
132141

133142
/// Looks up a builtin function name by its numeric ID.
@@ -141,9 +150,9 @@ pub const Instance = struct {
141150

142151
/// Evaluates a policy by entrypoint ID with the given JSON input.
143152
pub fn evaluateById(self: *Self, entrypoint_id: u32, input_json: []const u8) ![]const u8 {
144-
const wasmer_backend = self.getWasmerBackend();
145-
wasmer_backend.setBuiltins(&self.builtins);
146-
wasmer_backend.setOpaFunctions(
153+
const backend_impl = self.getBackend();
154+
backend_impl.setBuiltins(&self.builtins);
155+
backend_impl.setOpaFunctions(
147156
self.memory_manager.opa_malloc_fn,
148157
self.memory_manager.opa_json_parse_fn,
149158
self.memory_manager.opa_json_dump_fn,
@@ -205,18 +214,18 @@ pub const Instance = struct {
205214
} || MemoryManager.Error;
206215

207216
pub fn wasAborted(self: *Self) bool {
208-
return self.getWasmerBackend().wasAborted();
217+
return self.getBackend().wasAborted();
209218
}
210219

211220
pub fn getAbortMessage(self: *Self) ?[]const u8 {
212-
return self.getWasmerBackend().getAbortMessage();
221+
return self.getBackend().getAbortMessage();
213222
}
214223

215224
pub fn clearAbort(self: *Self) void {
216-
self.getWasmerBackend().clearAbort();
225+
self.getBackend().clearAbort();
217226
}
218227

219-
fn getWasmerBackend(self: *Self) *wasmer.WasmerBackend {
228+
fn getBackend(self: *Self) *BackendImpl {
220229
return @ptrCast(@alignCast(self.policy.module.backend_ptr));
221230
}
222231
};
@@ -285,14 +294,13 @@ pub const InstancePool = struct {
285294
};
286295

287296
const testing = std.testing;
288-
const WasmerBackend = @import("backends/wasmer.zig").WasmerBackend;
289297

290298
test "instantiate OPA policy module" {
291299
const wasm_bytes = @embedFile("test_example_wasm");
292-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
293-
defer wasmer_backend.deinit();
300+
var wasm_backend = try BackendImpl.init(testing.allocator);
301+
defer wasm_backend.deinit();
294302

295-
var b = wasmer_backend.asBackend();
303+
var b = wasm_backend.asBackend();
296304
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
297305
defer policy.deinit();
298306

@@ -304,10 +312,10 @@ test "instantiate OPA policy module" {
304312

305313
test "evaluate policy - admin allowed" {
306314
const wasm_bytes = @embedFile("test_example_wasm");
307-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
308-
defer wasmer_backend.deinit();
315+
var wasm_backend = try BackendImpl.init(testing.allocator);
316+
defer wasm_backend.deinit();
309317

310-
var b = wasmer_backend.asBackend();
318+
var b = wasm_backend.asBackend();
311319
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
312320
defer policy.deinit();
313321

@@ -322,10 +330,10 @@ test "evaluate policy - admin allowed" {
322330

323331
test "evaluate policy - guest denied" {
324332
const wasm_bytes = @embedFile("test_example_wasm");
325-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
326-
defer wasmer_backend.deinit();
333+
var wasm_backend = try BackendImpl.init(testing.allocator);
334+
defer wasm_backend.deinit();
327335

328-
var b = wasmer_backend.asBackend();
336+
var b = wasm_backend.asBackend();
329337
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
330338
defer policy.deinit();
331339

@@ -340,10 +348,10 @@ test "evaluate policy - guest denied" {
340348

341349
test "policy with builtins - sprintf" {
342350
const wasm_bytes = @embedFile("test_builtin_wasm");
343-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
344-
defer wasmer_backend.deinit();
351+
var wasm_backend = try BackendImpl.init(testing.allocator);
352+
defer wasm_backend.deinit();
345353

346-
var b = wasmer_backend.asBackend();
354+
var b = wasm_backend.asBackend();
347355
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
348356
defer policy.deinit();
349357

@@ -367,10 +375,10 @@ test "policy with builtins - sprintf" {
367375

368376
test "instance pool acquire and release" {
369377
const wasm_bytes = @embedFile("test_example_wasm");
370-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
371-
defer wasmer_backend.deinit();
378+
var wasm_backend = try BackendImpl.init(testing.allocator);
379+
defer wasm_backend.deinit();
372380

373-
var b = wasmer_backend.asBackend();
381+
var b = wasm_backend.asBackend();
374382
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
375383
defer policy.deinit();
376384

@@ -393,10 +401,10 @@ test "instance pool acquire and release" {
393401
// Regression test: OpaContext must have builtins and WASM functions connected for custom builtins to work.
394402
test "builtins are connected to backend context" {
395403
const wasm_bytes = @embedFile("test_builtin_wasm");
396-
var wasmer_backend = try WasmerBackend.init(testing.allocator);
397-
defer wasmer_backend.deinit();
404+
var wasm_backend = try BackendImpl.init(testing.allocator);
405+
defer wasm_backend.deinit();
398406

399-
var b = wasmer_backend.asBackend();
407+
var b = wasm_backend.asBackend();
400408
var policy = try Policy.load(testing.allocator, &b, wasm_bytes);
401409
defer policy.deinit();
402410

@@ -411,8 +419,8 @@ test "builtins are connected to backend context" {
411419
try testing.expect(res.len > 0);
412420
} else |_| {}
413421

414-
try testing.expect(wasmer_backend.opa_context.builtins != null);
415-
try testing.expect(wasmer_backend.opa_context.json_dump_fn != null);
416-
try testing.expect(wasmer_backend.opa_context.json_parse_fn != null);
417-
try testing.expect(wasmer_backend.opa_context.malloc_fn != null);
422+
try testing.expect(wasm_backend.opa_context.builtins != null);
423+
try testing.expect(wasm_backend.opa_context.json_dump_fn != null);
424+
try testing.expect(wasm_backend.opa_context.json_parse_fn != null);
425+
try testing.expect(wasm_backend.opa_context.malloc_fn != null);
418426
}

src/policy.zig

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,16 @@ fn freeStringMap(allocator: std.mem.Allocator, map: *std.StringHashMapUnmanaged(
126126

127127
test "policy load minimal wasm" {
128128
const testing = std.testing;
129-
const wasmer = @import("backends/wasmer.zig");
129+
const options = @import("options");
130+
const BackendImpl = switch (options.backend) {
131+
.wasmer => @import("backends/wasmer.zig").WasmerBackend,
132+
.zware => @import("backends/zware.zig").ZwareBackend,
133+
};
130134

131135
const test_wasm = @embedFile("test_add_wasm");
132136

133-
var wasm_backend = wasmer.WasmerBackend.init(testing.allocator) catch |err| {
134-
std.debug.print("Wasmer init failed: {}\n", .{err});
137+
var wasm_backend = BackendImpl.init(testing.allocator) catch |err| {
138+
std.debug.print("Backend init failed: {}\n", .{err});
135139
return err;
136140
};
137141
defer wasm_backend.deinit();

0 commit comments

Comments
 (0)