node icon indicating copy to clipboard operation
node copied to clipboard

test,doc: enable running embedtest for Windows

Open vmoroz opened this issue 10 months ago • 17 comments

Currently the embedtest does not run on Windows. One of the main reasons is that the Windows command line does not accept UTF-8 characters required by the test.

In this PR we enable embedtest to run on Windows:

  • Use node::FixupMain from tools/executable_wrapper.h to fix argc and argv values. The NODE_MAIN macro is defined as wmain for Windows targets that receives parameters as UTF-16. Then, the node::FixupMain converts them to UTF-8.
  • Make sure that we read and write snapshot files as binary files. Windows uses text mode by default.
  • Add calling embedtest to vcbuild.bat as a part of cctest call. It is currently implemented the same way in the Makefile.
  • Makefile is changed to add tools include directory for the embedtest project. It is need to include the executable_wrapper.h.
  • Fix small typo in embedding.md file.

vmoroz avatar Apr 22 '24 17:04 vmoroz

Review requested:

  • [ ] @nodejs/gyp

nodejs-github-bot avatar Apr 22 '24 17:04 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/58625/

nodejs-github-bot avatar Apr 23 '24 05:04 nodejs-github-bot

We already have tools/executable_wrapper.h and AFAICT it serves the same purpose. Not sure why this wasn't done for the embedtest although that wrapper was introduced later when we do need to create executable that also works on Windows (js2c). Can we just use that for the embedtest?

Great! It could work.

For the PR #43542 I will need to make tools/executable_wrapper.h compatible with C. It was the reason why the new APIs were done to match C calling conventions. Since tools/executable_wrapper.h is header-only it must be trivial to do as part of PR #43542.

vmoroz avatar Apr 23 '24 17:04 vmoroz

IIUC to share code with https://github.com/nodejs/node/pull/43542 ultimately we need to expose a helper like node::FixupMain to node.h. That sounds like a good idea, because the UTF8 convention is not currently surfaced to node.h, and we can also use it to remove the repeated code in src/node_main.cc. Not sure about how useful/appropriate it is for the C API, I'll defer that to the n-api team.

joyeecheung avatar Apr 23 '24 18:04 joyeecheung

It seems that we can avoid converting the node::FixupMain to C. #43542 adds two new executables to the embedtest directory. The simplest approach would be to add testmain.cc that is reused across all three executables. It will be a C++ file and it will use the node::FixupMain. It then will call TestMain function for each test executable. Anyway, the change will be implemented in the #43542. This PR will be greatly simplified by using the node::FixupMain.

As for the src/node_main.cc, I see that it has a copy of tools/executable_wrapper.h code. I guess we include tools/executable_wrapper.h to src/node_main.ccto reuse it. I can create a separate PR for it.

vmoroz avatar Apr 23 '24 21:04 vmoroz

It seems that macOS benchmark is failing, but the failure is not related to changes in this PR. I guess something else makes the test to break.

vmoroz avatar Apr 24 '24 21:04 vmoroz

I think that is one of the known flaky tests, restarted the github action on macOS

mhdawson avatar Apr 24 '24 21:04 mhdawson

I guess we include tools/executable_wrapper.h to src/node_main.cc to reuse it.

I think the reason why we don't do that is, we generally try to keep src/node_main.cc rely only on node.h and not any internal headers (I am not sure if that's just my impression at this point, or is that something really enforced). But tackling that in a different PR SGTM.

joyeecheung avatar Apr 25 '24 03:04 joyeecheung

CI: https://ci.nodejs.org/job/node-test-pull-request/58687/

nodejs-github-bot avatar Apr 25 '24 05:04 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/58808/

nodejs-github-bot avatar Apr 29 '24 22:04 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/58849/

nodejs-github-bot avatar May 01 '24 21:05 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/58867/

nodejs-github-bot avatar May 02 '24 13:05 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/58904/

nodejs-github-bot avatar May 03 '24 15:05 nodejs-github-bot

It seem that CI shows that the new embedding testing is failing on Windows and it is related to this PR. I am going to investigate/fix it. I wonder if the child.stderr is changed last week.

10:18:57 > echo running 'Release\node.exe test\embedding\test-embedding.js' 
10:18:57 running 'Release\node.exe test\embedding\test-embedding.js'
10:18:57 
10:18:57 > "Release\node.exe" test\embedding\test-embedding.js 
10:18:57 [process 0]: --- stderr ---
10:18:57 c:\workspace\node-test-binary-windows-native-suites\node\test\common\child_process.js:82
10:18:57     console.error(stderrStr === undefined ? child.stderr.toString() : stderrStr);
10:18:57                                                          ^
10:18:57 
10:18:57 TypeError: Cannot read properties of null (reading 'toString')
10:18:57     at logAndThrow (c:\workspace\node-test-binary-windows-native-suites\node\test\common\child_process.js:82:58)
10:18:57     at expectSyncExit (c:\workspace\node-test-binary-windows-native-suites\node\test\common\child_process.js:91:5)
10:18:57     at spawnSyncAndAssert (c:\workspace\node-test-binary-windows-native-suites\node\test\common\child_process.js:131:10)
10:18:57     at Object.<anonymous> (c:\workspace\node-test-binary-windows-native-suites\node\test\embedding\test-embedding.js:27:1)
10:18:57     at Module._compile (node:internal/modules/cjs/loader:1480:14)
10:18:57     at Module._extensions..js (node:internal/modules/cjs/loader:1564:10)
10:18:57     at Module.load (node:internal/modules/cjs/loader:1287:32)
10:18:57     at Module._load (node:internal/modules/cjs/loader:1103:12)
10:18:57     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:168:12)
10:18:57     at node:internal/main/run_main_module:30:49

vmoroz avatar May 04 '24 17:05 vmoroz

Failed to start CI
   ⚠  Something was pushed to the Pull Request branch since the last approving review.
   ✘  Refusing to run CI on potentially unsafe PR
https://github.com/nodejs/node/actions/runs/8958495093

github-actions[bot] avatar May 05 '24 13:05 github-actions[bot]

I had to rebase the PR since the test break on Windows seemed to be caused by PR being submitted against Node.js version 22 while now we have the version 23.

vmoroz avatar May 06 '24 22:05 vmoroz

CI: https://ci.nodejs.org/job/node-test-pull-request/59016/

nodejs-github-bot avatar May 07 '24 19:05 nodejs-github-bot

I see that the embedtest fails to run on Windows because the embedtest.exe is missing. We must add it to the BINARY_FILES variable in https://github.com/nodejs/build/blob/main/jenkins/scripts/windows/node-compile-windows.cmd

~~I guess I must split up this PR into two:~~ ~~- add building embedtest.exe, then change the nodejs/build~~ ~~- add testing embedtest.exe after changes to nodejs/build~~ (Edit: see the comment below - no need to split up the PR)

vmoroz avatar May 17 '24 14:05 vmoroz

I have found that the embedtest.exe is already built. So, we just need to update the https://github.com/nodejs/build scripts to package it before we can merge this PR. I have switched this PR state to draft until the CI scripts are ready.

vmoroz avatar May 17 '24 17:05 vmoroz

The build script to package embedtest.exe for testing is merged (https://github.com/nodejs/build/pull/3730). It should enable CI for this PR to pass. The PR is rebased on the latest code. No other changes are added.

@mhdawson , could you please review it again? The CI cannot be started without newer bits review. Thank you!

vmoroz avatar May 21 '24 17:05 vmoroz

CI: https://ci.nodejs.org/job/node-test-pull-request/59338/

nodejs-github-bot avatar May 21 '24 22:05 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/59340/

nodejs-github-bot avatar May 22 '24 05:05 nodejs-github-bot

CI: https://ci.nodejs.org/job/node-test-pull-request/59348/

nodejs-github-bot avatar May 22 '24 12:05 nodejs-github-bot

@StefanStojanovic , it seems that the VS2022 build for ARM64 fails because of insufficient hard drive space. Is there a way to increase it?

06:29:57 C:\workspace\node-compile-windows\node\out\Release\obj\global_intermediate\torque-generated\src\builtins\string-substring-tq-csa.cc : fatal error C1085: Cannot write compiler generated file: 'C:\workspace\node-compile-windows\node\out\Release\obj\v8_initializers_host\obj\global_intermediate\torque-generated\src\builtins\string-substring-tq-csa.obj': No space left on device [C:\workspace\node-compile-windows\node\tools\v8_gypfiles\v8_initializers_host.vcxproj]

vmoroz avatar May 22 '24 17:05 vmoroz

CI: https://ci.nodejs.org/job/node-test-pull-request/59361/

nodejs-github-bot avatar May 23 '24 07:05 nodejs-github-bot

@StefanStojanovic , it seems that the VS2022 build for ARM64 fails because of insufficient hard drive space. Is there a way to increase it?

This happens sometimes. I'm investigating ARM64 cross-compilation issues in CI and will hopefully have a more permanent solution soon.

StefanStojanovic avatar May 23 '24 07:05 StefanStojanovic

Commit Queue failed
- Loading data for nodejs/node/pull/52646
✔  Done loading data for nodejs/node/pull/52646
----------------------------------- PR info ------------------------------------
Title      test,doc: enable running embedtest for Windows (#52646)
Author     Vladimir Morozov  (@vmoroz)
Branch     vmoroz:pr/enable_embedtest_for_windows -> nodejs:main
Labels     windows, build, needs-ci
Commits    2
 - test,doc: enable running embedtest for Windows
 - use existing executable_wrapper.h
Committers 1
 - Vladimir Morozov 
PR-URL: https://github.com/nodejs/node/pull/52646
Reviewed-By: Joyee Cheung 
Reviewed-By: Michael Dawson 
Reviewed-By: James M Snell 
------------------------------ Generated metadata ------------------------------
PR-URL: https://github.com/nodejs/node/pull/52646
Reviewed-By: Joyee Cheung 
Reviewed-By: Michael Dawson 
Reviewed-By: James M Snell 
--------------------------------------------------------------------------------
   ℹ  This PR was created on Mon, 22 Apr 2024 17:29:50 GMT
   ✔  Approvals: 3
   ✔  - Joyee Cheung (@joyeecheung) (TSC): https://github.com/nodejs/node/pull/52646#pullrequestreview-2069697036
   ✔  - Michael Dawson (@mhdawson) (TSC): https://github.com/nodejs/node/pull/52646#pullrequestreview-2071969985
   ✔  - James M Snell (@jasnell) (TSC): https://github.com/nodejs/node/pull/52646#pullrequestreview-2039461466
   ✔  Last GitHub CI successful
   ℹ  Last Full PR CI on 2024-05-23T07:38:01Z: https://ci.nodejs.org/job/node-test-pull-request/59361/
- Querying data for job/node-test-pull-request/59361/
   ✔  Last Jenkins CI successful
--------------------------------------------------------------------------------
   ✔  No git cherry-pick in progress
   ✔  No git am in progress
   ✔  No git rebase in progress
--------------------------------------------------------------------------------
- Bringing origin/main up to date...
From https://github.com/nodejs/node
 * branch                  main       -> FETCH_HEAD
✔  origin/main is now up-to-date
- Downloading patch for 52646
From https://github.com/nodejs/node
 * branch                  refs/pull/52646/merge -> FETCH_HEAD
✔  Fetched commits as c137d6eb3101..91b5225d7946
--------------------------------------------------------------------------------
[main c9fde46b15] test,doc: enable running embedtest for Windows
 Author: Vladimir Morozov 
 Date: Mon Apr 22 10:12:59 2024 -0700
 7 files changed, 82 insertions(+), 4 deletions(-)
 create mode 100644 test/embedding/utf8_args.c
 create mode 100644 test/embedding/utf8_args.h
[main 0b310539dd] use existing executable_wrapper.h
 Author: Vladimir Morozov 
 Date: Tue Apr 23 14:30:34 2024 -0700
 5 files changed, 5 insertions(+), 76 deletions(-)
 delete mode 100644 test/embedding/utf8_args.c
 delete mode 100644 test/embedding/utf8_args.h
   ✔  Patches applied
There are 2 commits in the PR. Attempting autorebase.
Rebasing (2/4)

Executing: git node land --amend --yes --------------------------------- New Message ---------------------------------- test,doc: enable running embedtest for Windows

PR-URL: https://github.com/nodejs/node/pull/52646 Reviewed-By: Joyee Cheung [email protected] Reviewed-By: Michael Dawson [email protected] Reviewed-By: James M Snell [email protected]

[detached HEAD bfaf50e60f] test,doc: enable running embedtest for Windows Author: Vladimir Morozov [email protected] Date: Mon Apr 22 10:12:59 2024 -0700 7 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 test/embedding/utf8_args.c create mode 100644 test/embedding/utf8_args.h Rebasing (3/4) Rebasing (4/4)

Executing: git node land --amend --yes --------------------------------- New Message ---------------------------------- use existing executable_wrapper.h

PR-URL: https://github.com/nodejs/node/pull/52646 Reviewed-By: Joyee Cheung [email protected] Reviewed-By: Michael Dawson [email protected] Reviewed-By: James M Snell [email protected]

[detached HEAD 455cd1577d] use existing executable_wrapper.h Author: Vladimir Morozov [email protected] Date: Tue Apr 23 14:30:34 2024 -0700 5 files changed, 5 insertions(+), 76 deletions(-) delete mode 100644 test/embedding/utf8_args.c delete mode 100644 test/embedding/utf8_args.h

Successfully rebased and updated refs/heads/main.

ℹ Add commit-queue-squash label to land the PR as one commit, or commit-queue-rebase to land as separate commits.

https://github.com/nodejs/node/actions/runs/9212395583

nodejs-github-bot avatar May 23 '24 17:05 nodejs-github-bot

Landed in 98a1ecfc7b5e675bfe05e3c0869a841e3d07e472

nodejs-github-bot avatar May 23 '24 18:05 nodejs-github-bot