From 2dd06c4378ffa84c088fd1a5ad7fa27f06cf6dc9 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 8 Nov 2024 11:20:51 +0100 Subject: [PATCH] [DO NOT MERGE] testing Windows CI failures --- .github/workflows/build-macos.yml | 4 ++ .github/workflows/linux.yml | 4 ++ .github/workflows/nix.yml | 2 + .github/workflows/sizediff.yml | 2 + .github/workflows/windows.yml | 54 +++++++++++++------- GNUmakefile | 8 +-- main_test.go | 85 ++++++++++++++++++++++++------- src/runtime/runtime_unix.go | 2 + src/runtime/runtime_windows.go | 12 ++++- 9 files changed, 133 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 4f26e1fb8f..98cde07a26 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -26,6 +26,8 @@ jobs: goarch: arm64 runs-on: ${{ matrix.os }} steps: + - name: exit early + run: command-does-not-exist - name: Install Dependencies run: | HOMEBREW_NO_AUTO_UPDATE=1 brew install qemu binaryen @@ -128,6 +130,8 @@ jobs: matrix: version: [16, 17, 18] steps: + - name: exit early + run: command-does-not-exist - name: Set up Homebrew uses: Homebrew/actions/setup-homebrew@master - name: Fix Python symlinks diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 206e6b7670..93b48f4df8 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -22,6 +22,8 @@ jobs: outputs: version: ${{ steps.version.outputs.version }} steps: + - name: exit early + run: command-does-not-exist - name: Install apk dependencies # tar: needed for actions/cache@v4 # git+openssh: needed for checkout (I think?) @@ -171,6 +173,8 @@ jobs: # potential bugs. runs-on: ubuntu-latest steps: + - name: exit early + run: command-does-not-exist - name: Checkout uses: actions/checkout@v4 with: diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 7ad4911d6c..70e03d9f39 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -15,6 +15,8 @@ jobs: nix-test: runs-on: ubuntu-latest steps: + - name: exit early + run: command-does-not-exist - name: Uninstall system LLVM # Hack to work around issue where we still include system headers for # some reason. diff --git a/.github/workflows/sizediff.yml b/.github/workflows/sizediff.yml index b9c40b1ea0..ab13085b8a 100644 --- a/.github/workflows/sizediff.yml +++ b/.github/workflows/sizediff.yml @@ -15,6 +15,8 @@ jobs: permissions: pull-requests: write steps: + - name: exit early + run: command-does-not-exist # Prepare, install tools - name: Add GOBIN to $PATH run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 0994d47a70..1ab17f9a72 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -23,26 +23,30 @@ jobs: minimum-size: 8GB maximum-size: 24GB disk-root: "C:" - - uses: brechtm/setup-scoop@v2 - with: - scoop_update: 'false' - - name: Install Dependencies - shell: bash - run: | - scoop install ninja binaryen + #- uses: brechtm/setup-scoop@v2 + # with: + # scoop_update: 'false' + #- name: Install Dependencies + # shell: bash + # run: | + # scoop install ninja binaryen - name: Checkout uses: actions/checkout@v4 - with: - submodules: true + - name: submodules + shell: bash + run: git submodule update --init lib/mingw-w64 - name: Extract TinyGo version id: version shell: bash run: ./.github/workflows/tinygo-extract-version.sh | tee -a "$GITHUB_OUTPUT" - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: '1.23' - cache: true + - name: command + shell: bash + run: go env + #- name: Install Go + # uses: actions/setup-go@v5 + # with: + # go-version: '1.23' + # cache: true - name: Restore cached LLVM source uses: actions/cache/restore@v4 id: cache-llvm-source @@ -91,6 +95,25 @@ jobs: with: key: ${{ steps.cache-llvm-build.outputs.cache-primary-key }} path: llvm-build + - name: Restore Go cache + uses: actions/cache/restore@v4 + with: + key: go-cache-v2 + path: | + C:/Users/runneradmin/AppData/Local/go-build + C:/Users/runneradmin/go/pkg/mod + - name: Test TinyGo + shell: bash + run: make test GOTESTFLAGS="-short -run=TestBuild -v" + - name: Save Go cache + uses: actions/cache/save@v4 + with: + key: go-cache-v2 + path: | + C:/Users/runneradmin/AppData/Local/go-build + C:/Users/runneradmin/go/pkg/mod + - name: exit + run: command-does-not-exist - name: Cache wasi-libc sysroot uses: actions/cache@v4 id: cache-wasi-libc @@ -105,9 +128,6 @@ jobs: scoop install wasmtime@14.0.4 - name: make gen-device run: make -j3 gen-device - - name: Test TinyGo - shell: bash - run: make test GOTESTFLAGS="-short" - name: Build TinyGo release tarball shell: bash run: make build/release -j4 diff --git a/GNUmakefile b/GNUmakefile index 2bf023c627..2357177f28 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -191,7 +191,7 @@ gen-device: gen-device-stm32 endif gen-device-avr: - @if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi + #@if [ ! -e lib/avr/README.md ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi $(GO) build -o ./build/gen-device-avr ./tools/gen-device-avr/ ./build/gen-device-avr lib/avr/packs/atmega src/device/avr/ ./build/gen-device-avr lib/avr/packs/tiny src/device/avr/ @@ -263,7 +263,7 @@ endif .PHONY: wasi-libc wasi-libc: lib/wasi-libc/sysroot/lib/wasm32-wasi/libc.a lib/wasi-libc/sysroot/lib/wasm32-wasi/libc.a: - @if [ ! -e lib/wasi-libc/Makefile ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi + #@if [ ! -e lib/wasi-libc/Makefile ]; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init"; exit 1; fi cd lib/wasi-libc && $(MAKE) -j4 EXTRA_CFLAGS="-O2 -g -DNDEBUG -mnontrapping-fptoint -msign-ext" MALLOC_IMPL=none CC="$(CLANG)" AR=$(LLVM_AR) NM=$(LLVM_NM) # Generate WASI syscall bindings @@ -292,8 +292,8 @@ endif tinygo: ## Build the TinyGo compiler @if [ ! -f "$(LLVM_BUILDDIR)/bin/llvm-config" ]; then echo "Fetch and build LLVM first by running:"; echo " $(MAKE) llvm-source"; echo " $(MAKE) $(LLVM_BUILDDIR)"; exit 1; fi CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GOENVFLAGS) $(GO) build -buildmode exe -o build/tinygo$(EXE) -tags "byollvm osusergo" . -test: wasi-libc check-nodejs-version - CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) test $(GOTESTFLAGS) -timeout=1h -buildmode exe -tags "byollvm osusergo" $(GOTESTPKGS) +test: #wasi-libc check-nodejs-version + CGO_CPPFLAGS="$(CGO_CPPFLAGS)" CGO_CXXFLAGS="$(CGO_CXXFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) test $(GOTESTFLAGS) -timeout=1h -race -buildmode exe -tags "byollvm osusergo" . # Standard library packages that pass tests on darwin, linux, wasi, and windows, but take over a minute in wasi TEST_PACKAGES_SLOW = \ diff --git a/main_test.go b/main_test.go index 22ac549de7..94522a4f33 100644 --- a/main_test.go +++ b/main_test.go @@ -7,6 +7,7 @@ import ( "bufio" "bytes" "context" + "crypto/sha256" "errors" "flag" "io" @@ -15,6 +16,7 @@ import ( "reflect" "regexp" "runtime" + "strconv" "strings" "sync" "testing" @@ -27,7 +29,6 @@ import ( "github.com/tetratelabs/wazero/sys" "github.com/tinygo-org/tinygo/builder" "github.com/tinygo-org/tinygo/compileopts" - "github.com/tinygo-org/tinygo/diagnostics" "github.com/tinygo-org/tinygo/goenv" ) @@ -114,10 +115,15 @@ func TestBuild(t *testing.T) { return } - t.Run("Host", func(t *testing.T) { - t.Parallel() - runPlatTests(optionsFromTarget("", sema), tests, t) + t.Run("Debugging", func(t *testing.T) { + for i := 0; i < 5; i++ { + t.Run(strconv.Itoa(i), func(t *testing.T) { + options := optionsFromTarget("", sema) + runTest("alias.go", options, t, nil, nil) + }) + } }) + return // Test a few build options. t.Run("build-options", func(t *testing.T) { @@ -420,21 +426,66 @@ func runTestWithConfig(name string, t *testing.T, options compileopts.Options, c // Build the test binary. stdout := &bytes.Buffer{} - _, err = buildAndRun(pkgName, config, stdout, cmdArgs, environmentVars, time.Minute, func(cmd *exec.Cmd, result builder.BuildResult) error { - return cmd.Run() - }) + _, fileExt := config.EmulatorFormat() + tmpdir := t.TempDir() + result, err := builder.Build(pkgName, fileExt, tmpdir, config) if err != nil { - w := &bytes.Buffer{} - diagnostics.CreateDiagnostics(err).WriteTo(w, "") - for _, line := range strings.Split(strings.TrimRight(w.String(), "\n"), "\n") { - t.Log(line) - } - if stdout.Len() != 0 { - t.Logf("output:\n%s", stdout.String()) - } - t.Fail() - return + t.Fatal("build failed:", err) + } + + data, err := os.ReadFile(result.Executable) + if err != nil { + t.Fatal("failed to read executable:", err) + } + hash := sha256.Sum256(data) + t.Logf("executable hash and size: %d %x", len(data), hash) + + for i := 0; i < 100; i++ { + i := i + t.Run(strconv.Itoa(i), func(t *testing.T) { + t.Parallel() + stdout := &bytes.Buffer{} + cmd := exec.Command(result.Executable) + cmd.Stdout = stdout + cmd.Stderr = stdout + err := cmd.Run() + if err != nil { + t.Log("run error:", err) + } + checkOutput(t, expectedOutputPath, stdout.Bytes()) + }) } + return + + //_, err = buildAndRun(pkgName, config, stdout, cmdArgs, environmentVars, time.Minute, func(cmd *exec.Cmd, result builder.BuildResult) error { + // data, err := os.ReadFile(result.Executable) + // if err != nil { + // t.Fatal("failed to read executable:", err) + // } + // hash := sha256.Sum256(data) + // t.Logf("executable hash and size: %d %x", len(data), hash) + + // t.Log("command:", cmd) + // err = cmd.Run() + // if err == nil { + // t.Log(" error is nil!") + // } else { + // t.Log(" error:", err) + // } + // return err + //}) + //if err != nil { + // w := &bytes.Buffer{} + // diagnostics.CreateDiagnostics(err).WriteTo(w, "") + // for _, line := range strings.Split(strings.TrimRight(w.String(), "\n"), "\n") { + // t.Log(line) + // } + // if stdout.Len() != 0 { + // t.Logf("output:\n%s", stdout.String()) + // } + // t.Fail() + // return + //} actual := stdout.Bytes() if config.EmulatorName() == "simavr" { diff --git a/src/runtime/runtime_unix.go b/src/runtime/runtime_unix.go index 3b20330e20..51807b8471 100644 --- a/src/runtime/runtime_unix.go +++ b/src/runtime/runtime_unix.go @@ -93,6 +93,8 @@ func main(argc int32, argv *unsafe.Pointer) int { stackTop = getCurrentStackPointer() runMain() + sleepTicks(nanosecondsToTicks(1e9)) + // For libc compatibility. return 0 } diff --git a/src/runtime/runtime_windows.go b/src/runtime/runtime_windows.go index 4b0b8f65b8..e2a5c4e5a3 100644 --- a/src/runtime/runtime_windows.go +++ b/src/runtime/runtime_windows.go @@ -52,7 +52,13 @@ func mainCRTStartup() int { stackTop = getCurrentStackPointer() runMain() - // For libc compatibility. + // Exit via exit(0) instead of returning. + // This matches mingw-w64-crt/crt/crtexe.c, which exits using exit(0) + // instead of returning the return value. + libc_exit(0) + + // Unreachable, since we're already exited. But we need to return something + // to make this valid Go code. return 0 } @@ -92,7 +98,9 @@ func os_runtime_args() []string { } func putchar(c byte) { - libc_putchar(int(c)) + if libc_putchar(int(c)) < 0 { + libc_exit(42) + } } var heapSize uintptr = 128 * 1024 // small amount to start