Skip to content

Commit da9d919

Browse files
committed
Add workerd test and run format
1 parent 69473cb commit da9d919

File tree

11 files changed

+137
-24
lines changed

11 files changed

+137
-24
lines changed

src/workerd/io/io-context.c++

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
#include <workerd/io/io-gate.h>
88
#include <workerd/io/worker.h>
99
#include <workerd/jsg/jsg.h>
10+
#include <workerd/jsg/setup.h>
1011
#include <workerd/util/sentry.h>
1112
#include <workerd/util/uncaught-exception-source.h>
12-
#include <workerd/jsg/setup.h>
1313

1414
#include <kj/debug.h>
1515

@@ -451,7 +451,8 @@ kj::Promise<void> IoContext::IncomingRequest::drain() {
451451
context->pumpMessageLoop();
452452
return context->waitUntilTasks.onEmpty()
453453
.exclusiveJoin(kj::mv(timeoutPromise))
454-
.exclusiveJoin(context->abortPromise.addBranch().then([] {}, [](kj::Exception&&) {}));
454+
.exclusiveJoin(context->abortPromise.addBranch().then(
455+
[] {}, [](kj::Exception&& e) { KJ_LOG(INFO, "uncaught exception", e); }));
455456
}
456457

457458
kj::Promise<IoContext_IncomingRequest::FinishScheduledResult> IoContext::IncomingRequest::

src/workerd/jsg/jsg.c++

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44

55
#include "jsg.h"
66

7+
#include "libplatform/libplatform.h"
78
#include "setup.h"
89

910
#include <workerd/jsg/util.h>
1011
#include <workerd/util/thread-scopes.h>
1112

12-
#include "libplatform/libplatform.h"
13-
1413
namespace workerd::jsg {
1514

1615
kj::String stringifyHandle(v8::Local<v8::Value> value) {

src/workerd/jsg/jsg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2682,7 +2682,7 @@ class Lock {
26822682
// the inspector (if attached), or to KJ_LOG(Info).
26832683
virtual void reportError(const JsValue& value) = 0;
26842684

2685-
protected:
2685+
protected:
26862686
virtual const V8System& getV8System() = 0;
26872687

26882688
private:

src/workerd/jsg/setup.c++

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,19 @@ static kj::Own<v8::Platform> userPlatform(v8::Platform& platform) {
7676
V8System::V8System(): V8System(defaultPlatform(0), nullptr) {}
7777
V8System::V8System(kj::ArrayPtr<const kj::StringPtr> flags): V8System(defaultPlatform(0), flags) {}
7878
V8System::V8System(v8::Platform& platformParam): V8System(platformParam, nullptr) {}
79-
V8System::V8System(v8::Platform& platformParam, kj::ArrayPtr<const kj::StringPtr> flags, v8::Platform* defaultPlatformPtr)
79+
V8System::V8System(v8::Platform& platformParam,
80+
kj::ArrayPtr<const kj::StringPtr> flags,
81+
v8::Platform* defaultPlatformPtr)
8082
: V8System(userPlatform(platformParam), flags, defaultPlatformPtr) {}
81-
V8System::V8System(kj::Own<v8::Platform> platformParam, kj::ArrayPtr<const kj::StringPtr> flags, v8::Platform* defaultPlatformPtr)
83+
V8System::V8System(kj::Own<v8::Platform> platformParam,
84+
kj::ArrayPtr<const kj::StringPtr> flags,
85+
v8::Platform* defaultPlatformPtr)
8286
: platformInner(kj::mv(platformParam)),
83-
platformWrapper(*platformInner), defaultPlatformPtr_{defaultPlatformPtr} {
84-
if (!defaultPlatformPtr_) {
85-
defaultPlatformPtr_ = platformInner.get();
86-
}
87+
platformWrapper(*platformInner),
88+
defaultPlatformPtr_{defaultPlatformPtr} {
89+
if (!defaultPlatformPtr_) {
90+
defaultPlatformPtr_ = platformInner.get();
91+
}
8792
#if V8_HAS_STACK_START_MARKER
8893
v8::StackStartMarker::EnableForProcess();
8994
#endif

src/workerd/jsg/setup.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,28 @@ class V8System {
5252
explicit V8System(v8::Platform& platform);
5353

5454
// Use a possibly-custom v8::Platform implementation, and apply flags.
55-
explicit V8System(v8::Platform& platform, kj::ArrayPtr<const kj::StringPtr> flags, v8::Platform* defaultPlatformPtr = nullptr);
55+
explicit V8System(v8::Platform& platform,
56+
kj::ArrayPtr<const kj::StringPtr> flags,
57+
v8::Platform* defaultPlatformPtr = nullptr);
5658

5759
~V8System() noexcept(false);
5860

5961
typedef void FatalErrorCallback(kj::StringPtr location, kj::StringPtr message);
6062
static void setFatalErrorCallback(FatalErrorCallback* callback);
6163

62-
auto& getDefaultPlatform() { return *defaultPlatformPtr_; }
64+
auto& getDefaultPlatform() {
65+
return *defaultPlatformPtr_;
66+
}
6367

6468
private:
6569
kj::Own<v8::Platform> platformInner;
6670
V8PlatformWrapper platformWrapper;
6771
friend class IsolateBase;
6872
v8::Platform* defaultPlatformPtr_;
6973

70-
explicit V8System(kj::Own<v8::Platform>, kj::ArrayPtr<const kj::StringPtr>, v8::Platform* defaultPlatformPtr = nullptr);
74+
explicit V8System(kj::Own<v8::Platform>,
75+
kj::ArrayPtr<const kj::StringPtr>,
76+
v8::Platform* defaultPlatformPtr = nullptr);
7177
};
7278

7379
// Base class of Isolate<T> containing parts that don't need to be templated, to avoid code
@@ -680,7 +686,8 @@ class Isolate: public IsolateBase {
680686
*this, value.toString(*this), value, JsMessage::create(*this, value));
681687
}
682688
}
683-
protected:
689+
690+
protected:
684691
virtual const V8System& getV8System() override {
685692
return jsgIsolate.getV8System();
686693
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
load("@aspect_rules_js//js:defs.bzl", "js_test")
2+
3+
js_test(
4+
name = "js-weak-ref-test",
5+
data = [
6+
":config.capnp",
7+
":index.mjs",
8+
"//src/workerd/server:workerd",
9+
"//src/workerd/server/tests:server-harness_js_lib",
10+
],
11+
entry_point = "test.mjs",
12+
env = {
13+
"WORKERD_BINARY": "$(rootpath //src/workerd/server:workerd)",
14+
"WORKERD_CONFIG": "$(rootpath :config.capnp)",
15+
},
16+
tags = ["js-test"],
17+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# config.capnp
2+
using Workerd = import "/workerd/workerd.capnp";
3+
4+
const config :Workerd.Config = (
5+
v8Flags = [ "--expose-gc" ],
6+
services = [
7+
( name = "main", worker = .worker ),
8+
],
9+
sockets = [
10+
( name = "http", address = "*:0", http = (), service = "main" ),
11+
]
12+
);
13+
14+
const worker :Workerd.Worker = (
15+
modules = [
16+
( name = "./index.mjs", esModule = embed "index.mjs" )
17+
],
18+
compatibilityDate = "2024-01-01",
19+
compatibilityFlags = ["enable_weak_ref"],
20+
);
21+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
let counter = 0;
2+
const fr = new FinalizationRegistry(() => {
3+
++counter;
4+
});
5+
6+
export default {
7+
async fetch(request, env, ctx) {
8+
(function () {
9+
let obj = {};
10+
fr.register(obj, '');
11+
obj = undefined;
12+
})();
13+
14+
// Ensure obj gets GC'd
15+
gc();
16+
17+
return new Response(counter);
18+
},
19+
};
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { env } from 'node:process';
2+
import { beforeEach, afterEach, test } from 'node:test';
3+
import assert from 'node:assert';
4+
import { WorkerdServerHarness } from '../server-harness.mjs';
5+
6+
// Global that is reset for each test.
7+
let workerd;
8+
9+
assert(
10+
env.WORKERD_BINARY !== undefined,
11+
'You must set the WORKERD_BINARY environment variable.'
12+
);
13+
assert(
14+
env.WORKERD_CONFIG !== undefined,
15+
'You must set the WORKERD_CONFIG environment variable.'
16+
);
17+
18+
// Start workerd.
19+
beforeEach(async () => {
20+
workerd = new WorkerdServerHarness({
21+
workerdBinary: env.WORKERD_BINARY,
22+
workerdConfig: env.WORKERD_CONFIG,
23+
24+
// Hard-coded to match a socket name expected in the `workerdConfig` file.
25+
listenPortNames: ['http'],
26+
});
27+
28+
await workerd.start();
29+
30+
await workerd.getListenPort('http');
31+
});
32+
33+
// Stop workerd.
34+
afterEach(async () => {
35+
const [code, signal] = await workerd.stop();
36+
assert(code === 0 || signal === 'SIGTERM');
37+
workerd = null;
38+
});
39+
40+
// FinalizationRegistry callbacks only run after the exported handler returns
41+
// So we should see its effects in a follow-up request
42+
test('JS FinalizationRegistry', async () => {
43+
let httpPort = await workerd.getListenPort('http');
44+
for (let i = 0; i < 3; ++i) {
45+
const response = await fetch(`http://localhost:${httpPort}`);
46+
assert.equal(await response.text(), i);
47+
}
48+
});

src/workerd/server/workerd-api.c++

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -271,9 +271,7 @@ struct WorkerdApi::Impl final {
271271
auto version = getPythonBundleName(pythonRelease);
272272
auto bundle = KJ_ASSERT_NONNULL(
273273
fetchPyodideBundle(pythonConfig, version), "Failed to get Pyodide bundle");
274-
jsg::NewContextOptions options{
275-
.enableWeakRef = features->getJsWeakRef()
276-
};
274+
jsg::NewContextOptions options{.enableWeakRef = features->getJsWeakRef()};
277275
auto context = lock.newContext<api::ServiceWorkerGlobalScope>(options, lock.v8Isolate);
278276
v8::Context::Scope scope(context.getHandle(lock));
279277
// Init emscripten synchronously, the python script will import setup-emscripten and
@@ -344,10 +342,8 @@ CompatibilityFlags::Reader WorkerdApi::getFeatureFlags() const {
344342
return *impl->features;
345343
}
346344
jsg::JsContext<api::ServiceWorkerGlobalScope> WorkerdApi::newContext(jsg::Lock& lock) const {
347-
jsg::NewContextOptions options{
348-
.newModuleRegistry = impl->tryGetModuleRegistry(),
349-
.enableWeakRef = getFeatureFlags().getJsWeakRef()
350-
};
345+
jsg::NewContextOptions options{.newModuleRegistry = impl->tryGetModuleRegistry(),
346+
.enableWeakRef = getFeatureFlags().getJsWeakRef()};
351347
return kj::downcast<JsgWorkerdIsolate::Lock>(lock).newContext<api::ServiceWorkerGlobalScope>(
352348
kj::mv(options), lock.v8Isolate);
353349
}

src/workerd/server/workerd.c++

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,8 +1328,8 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
13281328
auto config = getConfig();
13291329
auto platform = jsg::defaultPlatform(0);
13301330
WorkerdPlatform v8Platform(*platform);
1331-
jsg::V8System v8System(
1332-
v8Platform, KJ_MAP(flag, config.getV8Flags()) -> kj::StringPtr { return flag; }, platform.get());
1331+
jsg::V8System v8System(v8Platform,
1332+
KJ_MAP(flag, config.getV8Flags()) -> kj::StringPtr { return flag; }, platform.get());
13331333
auto promise = func(v8System, config);
13341334
KJ_IF_SOME(w, watcher) {
13351335
promise = promise.exclusiveJoin(waitForChanges(w).then([this]() {

0 commit comments

Comments
 (0)