diff --git a/slices/golang-1.25-go.yaml b/slices/golang-1.25-go.yaml new file mode 100644 index 000000000..de8154961 --- /dev/null +++ b/slices/golang-1.25-go.yaml @@ -0,0 +1,98 @@ +package: golang-1.25-go + +essential: + - golang-1.25-go_copyright + +slices: + # Note: The minimal slice provides a working Go installation + # that can be used to build and run simple Go programs, + # such as a "Hello World" program. + # See tests/spread/integration/golang-1.25-go/test_minimal.sh + # for more details. + minimal: + essential: + - base-files_tmp + - golang-1.25-go_build-tools + - golang-1.25-go_headers + - golang-1.25-go_symlinks + - golang-1.25-src_src-with-tests + contents: + /usr/lib/go-1.25/bin/go: + /usr/lib/go-1.25/bin/gofmt: + + # Note: The core slices provides the source code within the golang-1.25-go + # package in additional to the minimal slice. + core: + essential: + - golang-1.25-go_cmd-src + - golang-1.25-go_go-env + - golang-1.25-go_internal-src + - golang-1.25-go_minimal + - golang-1.25-go_runtime-src + - golang-1.25-go_time-src + + # Note: The build-tools provides the essential Go tools for building + # a minimal Go program, i.e., a single Hello World program. + build-tools: + contents: + /usr/lib/go-1.25/pkg/tool/linux_*/asm: + /usr/lib/go-1.25/pkg/tool/linux_*/compile: + /usr/lib/go-1.25/pkg/tool/linux_*/link: + # vet is used for go test + /usr/lib/go-1.25/pkg/tool/linux_*/vet: + + cgo-tools: + essential: + - gcc_gcc + - libc6-dev_core + - libc6-dev_libresolv + - libc6-dev_runtime + contents: + /usr/lib/go-1.25/pkg/tool/linux_*/cgo: + + cmd-src: + contents: + /usr/share/go-1.25/src/cmd/cgo/zdefaultcc.go: + /usr/share/go-1.25/src/cmd/go/internal/cfg/zdefaultcc.go: + /usr/share/go-1.25/src/cmd/internal/objabi/zbootstrap.go: + + go-env: + contents: + /usr/lib/go-1.25/go.env: + + headers: + contents: + /usr/share/go-1.25/pkg/include/*.h: + + internal-src: + contents: + /usr/share/go-1.25/src/internal/buildcfg/zbootstrap.go: + + profiling-tools: + contents: + /usr/lib/go-1.25/pkg/tool/linux_*/preprofile: + + runtime-src: + contents: + /usr/share/go-1.25/src/internal/runtime/sys/zversion.go: + + symlinks: + contents: + /usr/lib/go-1.25/api: # Symlink to ../share/go-1.25/api + /usr/lib/go-1.25/lib: # Symlink to ../share/go-1.25/lib + /usr/lib/go-1.25/misc: # Symlink to ../share/go-1.25/misc + /usr/lib/go-1.25/pkg/include: # Symlink to ../share/go-1.25/pkg/include + /usr/lib/go-1.25/src: # Symlink to ../share/go-1.25/src + /usr/lib/go-1.25/test: # Symlink to ../share/go-1.25/test + + testing-tools: + contents: + /usr/lib/go-1.25/pkg/tool/linux_*/cover: + + time-src: + contents: + /usr/share/go-1.25/src/time/tzdata/zzipdata.go: + + copyright: + contents: + /usr/share/doc/golang-1.25-go/copyright: diff --git a/slices/golang-1.25-src.yaml b/slices/golang-1.25-src.yaml new file mode 100644 index 000000000..9e4b8e1cd --- /dev/null +++ b/slices/golang-1.25-src.yaml @@ -0,0 +1,231 @@ +package: golang-1.25-src + +essential: + - golang-1.25-src_copyright + +slices: + # Note: This slice contains the source code of Go 1.25 as well as the tests. + # Due to Go's project layout convention, we cannot split the source code + # easily without Chisel's support for negative wildcards. + # To exclude the tests and test data, a command should be run after cutting + # this slice: + # find . -depth \( \ + # \( -path '*test*' \ + # ! -path '*src/testing*' \ + # ! -path '*src/internal/test*' \ + # ! -path '*src/internal/synctest' \ + # ! -path '*synctest.go' \ + # ! -path '*synctest_o*' \) -o \ + # \( -path '*/testing/*' -name '*_test.go' \) \ + # \) -exec rm -rf {} + + src-with-tests: + essential: + - golang-1.25-src_api + - golang-1.25-src_libs + contents: + # Note: Some paths are explicitly listed to avoid conflicts with + # the paths defined in golang-1.25-go. + # src/cmd/** conflicts with + # src/cmd/cgo/zdefaultcc.go + # src/cmd/go/internal/cfg/zdefaultcc.go + # src/cmd/internal/objabi/zbootstrap.go + # src/internal/** conflicts with + # src/internal/buildcfg/zbootstrap.go + # src/internal/runtime/sys/zversion.go + # src/time/** conflicts with + # src/time/tzdata/zzipdata.go + /usr/share/go-1.25/misc/**: + /usr/share/go-1.25/src/Make.dist: + /usr/share/go-1.25/src/a*/**: + /usr/share/go-1.25/src/b*/**: + /usr/share/go-1.25/src/cmd/a*/**: + /usr/share/go-1.25/src/cmd/b*/**: + /usr/share/go-1.25/src/cmd/cgo/a*.go: + /usr/share/go-1.25/src/cmd/cgo/doc.go: + /usr/share/go-1.25/src/cmd/cgo/g*.go: + /usr/share/go-1.25/src/cmd/cgo/internal/**: + /usr/share/go-1.25/src/cmd/cgo/main.go: + /usr/share/go-1.25/src/cmd/cgo/out.go: + /usr/share/go-1.25/src/cmd/cgo/util.go: + /usr/share/go-1.25/src/cmd/co*/**: + /usr/share/go-1.25/src/cmd/d*/**: + /usr/share/go-1.25/src/cmd/f*/**: + /usr/share/go-1.25/src/cmd/go.mod: + /usr/share/go-1.25/src/cmd/go.sum: + /usr/share/go-1.25/src/cmd/go/*.go: + /usr/share/go-1.25/src/cmd/go/internal/a*/**: + /usr/share/go-1.25/src/cmd/go/internal/b*/**: + /usr/share/go-1.25/src/cmd/go/internal/ca*/**: + /usr/share/go-1.25/src/cmd/go/internal/cfg/bench_test.go: + /usr/share/go-1.25/src/cmd/go/internal/cfg/cfg.go: + /usr/share/go-1.25/src/cmd/go/internal/cl*/**: + /usr/share/go-1.25/src/cmd/go/internal/cm*/**: + /usr/share/go-1.25/src/cmd/go/internal/d*/**: + /usr/share/go-1.25/src/cmd/go/internal/e*/**: + /usr/share/go-1.25/src/cmd/go/internal/f*/**: + /usr/share/go-1.25/src/cmd/go/internal/g*/**: + /usr/share/go-1.25/src/cmd/go/internal/h*/**: + /usr/share/go-1.25/src/cmd/go/internal/i*/**: + /usr/share/go-1.25/src/cmd/go/internal/l*/**: + /usr/share/go-1.25/src/cmd/go/internal/m*/**: + /usr/share/go-1.25/src/cmd/go/internal/r*/**: + /usr/share/go-1.25/src/cmd/go/internal/s*/**: + /usr/share/go-1.25/src/cmd/go/internal/t*/**: + /usr/share/go-1.25/src/cmd/go/internal/v*/**: + /usr/share/go-1.25/src/cmd/go/internal/w*/**: + /usr/share/go-1.25/src/cmd/go/t*/**: + /usr/share/go-1.25/src/cmd/gof*/**: + /usr/share/go-1.25/src/cmd/internal/a*/**: + /usr/share/go-1.25/src/cmd/internal/b*/**: + /usr/share/go-1.25/src/cmd/internal/c*/**: + /usr/share/go-1.25/src/cmd/internal/d*/**: + /usr/share/go-1.25/src/cmd/internal/e*/**: + /usr/share/go-1.25/src/cmd/internal/g*/**: + /usr/share/go-1.25/src/cmd/internal/h*/**: + /usr/share/go-1.25/src/cmd/internal/m*/**: + /usr/share/go-1.25/src/cmd/internal/obj/**: + /usr/share/go-1.25/src/cmd/internal/objabi/a*: + /usr/share/go-1.25/src/cmd/internal/objabi/f*: + /usr/share/go-1.25/src/cmd/internal/objabi/h*: + /usr/share/go-1.25/src/cmd/internal/objabi/l*: + /usr/share/go-1.25/src/cmd/internal/objabi/p*: + /usr/share/go-1.25/src/cmd/internal/objabi/r*: + /usr/share/go-1.25/src/cmd/internal/objabi/s*: + /usr/share/go-1.25/src/cmd/internal/objabi/u*: + /usr/share/go-1.25/src/cmd/internal/objfile/*.go: + /usr/share/go-1.25/src/cmd/internal/os*/**: + /usr/share/go-1.25/src/cmd/internal/p*/**: + /usr/share/go-1.25/src/cmd/internal/q*/**: + /usr/share/go-1.25/src/cmd/internal/r*/**: + /usr/share/go-1.25/src/cmd/internal/s*/**: + /usr/share/go-1.25/src/cmd/internal/t*/**: + /usr/share/go-1.25/src/cmd/l*/**: + /usr/share/go-1.25/src/cmd/n*/**: + /usr/share/go-1.25/src/cmd/o*/**: + /usr/share/go-1.25/src/cmd/p*/**: + /usr/share/go-1.25/src/cmd/r*/**: + /usr/share/go-1.25/src/cmd/t*/**: + /usr/share/go-1.25/src/cmd/v*/**: + /usr/share/go-1.25/src/cmp/**: + /usr/share/go-1.25/src/co*/**: + /usr/share/go-1.25/src/crypto/**: + /usr/share/go-1.25/src/d*/**: + /usr/share/go-1.25/src/e*/**: + /usr/share/go-1.25/src/f*/**: + /usr/share/go-1.25/src/go.mod: + /usr/share/go-1.25/src/go.sum: + /usr/share/go-1.25/src/go/**: + /usr/share/go-1.25/src/h*/**: + /usr/share/go-1.25/src/im*/**: + /usr/share/go-1.25/src/ind*/**: + /usr/share/go-1.25/src/internal/a*/**: + /usr/share/go-1.25/src/internal/bi*/**: + /usr/share/go-1.25/src/internal/buildcfg/c*: + /usr/share/go-1.25/src/internal/buildcfg/e*: + /usr/share/go-1.25/src/internal/by*/**: + /usr/share/go-1.25/src/internal/c*/**: + /usr/share/go-1.25/src/internal/d*/**: + /usr/share/go-1.25/src/internal/e*/**: + /usr/share/go-1.25/src/internal/f*/**: + /usr/share/go-1.25/src/internal/g*/**: + /usr/share/go-1.25/src/internal/i*/**: + /usr/share/go-1.25/src/internal/l*/**: + /usr/share/go-1.25/src/internal/m*/**: + /usr/share/go-1.25/src/internal/n*/**: + /usr/share/go-1.25/src/internal/o*/**: + /usr/share/go-1.25/src/internal/p*/**: + /usr/share/go-1.25/src/internal/ra*/**: + /usr/share/go-1.25/src/internal/re*/**: + /usr/share/go-1.25/src/internal/ro*/**: + /usr/share/go-1.25/src/internal/runtime/a*/**: + /usr/share/go-1.25/src/internal/runtime/c*/**: + /usr/share/go-1.25/src/internal/runtime/e*/**: + /usr/share/go-1.25/src/internal/runtime/g*/**: + /usr/share/go-1.25/src/internal/runtime/m*/**: + /usr/share/go-1.25/src/internal/runtime/st*/**: + /usr/share/go-1.25/src/internal/runtime/sys/c*: + /usr/share/go-1.25/src/internal/runtime/sys/d*: + /usr/share/go-1.25/src/internal/runtime/sys/e*: + /usr/share/go-1.25/src/internal/runtime/sys/i*: + /usr/share/go-1.25/src/internal/runtime/sys/n*: + /usr/share/go-1.25/src/internal/runtime/sys/s*: + /usr/share/go-1.25/src/internal/runtime/sysc*/**: + /usr/share/go-1.25/src/internal/runtime/w*/**: + /usr/share/go-1.25/src/internal/s*/**: + /usr/share/go-1.25/src/internal/t*/**: + /usr/share/go-1.25/src/internal/u*/**: + /usr/share/go-1.25/src/internal/x*/**: + /usr/share/go-1.25/src/internal/z*/**: + /usr/share/go-1.25/src/io*/**: + /usr/share/go-1.25/src/it*/**: + /usr/share/go-1.25/src/l*/**: + /usr/share/go-1.25/src/m*/**: + /usr/share/go-1.25/src/n*/**: + /usr/share/go-1.25/src/o*/**: + /usr/share/go-1.25/src/p*/**: + /usr/share/go-1.25/src/re*/**: + /usr/share/go-1.25/src/runtime/**.S: + /usr/share/go-1.25/src/runtime/**.c: + /usr/share/go-1.25/src/runtime/**.h: + /usr/share/go-1.25/src/runtime/**.s: + /usr/share/go-1.25/src/runtime/*.go: + /usr/share/go-1.25/src/runtime/*.py: + /usr/share/go-1.25/src/runtime/Makefile: + /usr/share/go-1.25/src/runtime/a*/**: + /usr/share/go-1.25/src/runtime/c*/**: + /usr/share/go-1.25/src/runtime/d*/**: + # /usr/share/go-1.25/src/runtime/internal/st*/**: + # /usr/share/go-1.25/src/runtime/internal/w*/**: + /usr/share/go-1.25/src/runtime/m*/**: + /usr/share/go-1.25/src/runtime/p*/**: + /usr/share/go-1.25/src/runtime/r*/**: + /usr/share/go-1.25/src/runtime/t*/**: + /usr/share/go-1.25/src/s*/**: + /usr/share/go-1.25/src/te*/**: + /usr/share/go-1.25/src/time/*.go: + /usr/share/go-1.25/src/time/te*/**: + /usr/share/go-1.25/src/time/tzdata/tzdata.go: + /usr/share/go-1.25/src/u*/**: + /usr/share/go-1.25/src/v*/**: + /usr/share/go-1.25/src/w*/**: + /usr/share/go-1.25/test/**: + + api: + contents: + /usr/share/go-1.25/api/*.txt: + + bash-scripts: + essential: + - bash_bins + - binutils_linker + # TODO: Include binutils-${ARCH_TRIPLET}_loader as well. + - coreutils_bins + - grep_bins + contents: + /usr/share/go-1.25/src/all.bash: + /usr/share/go-1.25/src/bootstrap.bash: + /usr/share/go-1.25/src/buildall.bash: + /usr/share/go-1.25/src/clean.bash: + /usr/share/go-1.25/src/cmp.bash: + /usr/share/go-1.25/src/make.bash: + /usr/share/go-1.25/src/race.bash: + /usr/share/go-1.25/src/run.bash: + + libs: + essential: + - bash_bins + - coreutils_bins + - make_bins + contents: + /usr/share/go-1.25/lib/fips140/Makefile: + /usr/share/go-1.25/lib/fips140/fips140.sum: + /usr/share/go-1.25/lib/fips140/inprocess.txt: + /usr/share/go-1.25/lib/fips140/v1.0.0.zip: + /usr/share/go-1.25/lib/time/mkzip.go: + /usr/share/go-1.25/lib/time/update.bash: + /usr/share/go-1.25/lib/time/zoneinfo.zip: + /usr/share/go-1.25/lib/wasm/*: + + copyright: + contents: + /usr/share/doc/golang-1.25-src/copyright: diff --git a/slices/golang-1.25.yaml b/slices/golang-1.25.yaml new file mode 100644 index 000000000..9907f208d --- /dev/null +++ b/slices/golang-1.25.yaml @@ -0,0 +1,20 @@ +package: golang-1.25 + +essential: + - golang-1.25_copyright + +slices: + core: + essential: + # Note: Package golang-1.25-go is not available on i386. + - golang-1.25-go_core + - golang-1.25-src_src-with-tests + + cgo-support: + essential: + - golang-1.25-go_cgo-tools + - golang-1.25_core + + copyright: + contents: + /usr/share/doc/golang-1.25/copyright: diff --git a/slices/golang-go.yaml b/slices/golang-go.yaml new file mode 100644 index 000000000..38a014ac4 --- /dev/null +++ b/slices/golang-go.yaml @@ -0,0 +1,21 @@ +package: golang-go + +essential: + - golang-go_copyright + +slices: + core: + essential: + - golang-1.25-go_core + contents: + /usr/bin/go: # Symlink to ../lib/go-1.25/bin/go + /usr/bin/gofmt: # Symlink to ../lib/go-1.25/bin/gofmt + /usr/lib/go: # Symlink to ../share/go-1.25 + + cgo-tools: + essential: + - golang-1.25-go_cgo-tools + + copyright: + contents: + /usr/share/doc/golang-go/copyright: diff --git a/slices/golang-src.yaml b/slices/golang-src.yaml new file mode 100644 index 000000000..83e936a68 --- /dev/null +++ b/slices/golang-src.yaml @@ -0,0 +1,15 @@ +package: golang-src + +essential: + - golang-src_copyright + +slices: + src-with-tests: + essential: + - golang-1.25-src_src-with-tests + contents: + /usr/share/go: # Symlink to go-1.25 + + copyright: + contents: + /usr/share/doc/golang-src/copyright: diff --git a/slices/golang.yaml b/slices/golang.yaml new file mode 100644 index 000000000..5ccc56ece --- /dev/null +++ b/slices/golang.yaml @@ -0,0 +1,19 @@ +package: golang + +essential: + - golang_copyright + +slices: + core: + essential: + - golang-go_core + - golang-src_src-with-tests + + cgo-support: + essential: + - golang-1.25-go_cgo-tools + - golang_core + + copyright: + contents: + /usr/share/doc/golang/copyright: diff --git a/slices/make.yaml b/slices/make.yaml new file mode 100644 index 000000000..b682cd2f2 --- /dev/null +++ b/slices/make.yaml @@ -0,0 +1,12 @@ +package: make + +slices: + bins: + essential: + - libc6_libs + contents: + /usr/bin/make: + + copyright: + contents: + /usr/share/doc/make/copyright: diff --git a/tests/spread/integration/golang-1.25-go/shared/epilogue.sh b/tests/spread/integration/golang-1.25-go/shared/epilogue.sh new file mode 100644 index 000000000..8951e2c55 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/shared/epilogue.sh @@ -0,0 +1,3 @@ +# cleanup +umount -l "${rootfs}"/dev +umount -l "${rootfs}"/proc diff --git a/tests/spread/integration/golang-1.25-go/shared/prologue.sh b/tests/spread/integration/golang-1.25-go/shared/prologue.sh new file mode 100644 index 000000000..a42cd1495 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/shared/prologue.sh @@ -0,0 +1,26 @@ +# TODO: remove the --arch and the ${arch} logic once +# canonical/chisel #256 is merged. +arch=$(uname -m) +arch="${arch//_/-}" + +if [ "${arch}" = "aarch64" ]; then +chisel_arch="arm64" +elif [ "${arch}" = "x86-64" ]; then +chisel_arch="amd64" +else +echo "Unsupported architecture: ${arch}" +exit 1 +fi + +rootfs="$(install-slices --arch "${chisel_arch}" golang-1.25-go_${SLICE} golang-1.25-go_minimal)" + +# we need dev/sys mounted for some of them +mkdir "${rootfs}"/dev +mkdir "${rootfs}/proc" + +mount --bind /dev "${rootfs}"/dev +mount --bind /proc "${rootfs}/proc" + +mkdir -p "${rootfs}/tmp" + +echo -n "${rootfs}" diff --git a/tests/spread/integration/golang-1.25-go/task.yaml b/tests/spread/integration/golang-1.25-go/task.yaml new file mode 100644 index 000000000..e4f6627e2 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/task.yaml @@ -0,0 +1,17 @@ +summary: Integration tests for golang-1.25-go + +variants: + - build-tools + - cgo-tools + - minimal + - profiling-tools + - testing-tools + +environment: + GOTOOLCHAIN: local + +execute: | + export "SLICE=${SPREAD_VARIANT}" + export "rootfs=$(bash -ex ./shared/prologue.sh)" + bash -ex ./test_${SPREAD_VARIANT}.sh + bash -ex ./shared/epilogue.sh diff --git a/tests/spread/integration/golang-1.25-go/test_build-tools.sh b/tests/spread/integration/golang-1.25-go/test_build-tools.sh new file mode 100644 index 000000000..7b90e8c16 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/test_build-tools.sh @@ -0,0 +1,5 @@ +[ -n "${rootfs}" ] || { echo "rootfs not set"; exit 1; } +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool asm -V +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool compile -V +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool link -V +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool vet -V diff --git a/tests/spread/integration/golang-1.25-go/test_cgo-tools.sh b/tests/spread/integration/golang-1.25-go/test_cgo-tools.sh new file mode 100644 index 000000000..6276ecc91 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/test_cgo-tools.sh @@ -0,0 +1,4 @@ +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool cgo -V +cp ../golang/hello/cmd/hello_cgo/main_cgo.go "${rootfs}/main_cgo.go" +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool cgo main_cgo.go +grep -q "hello_from_c" "${rootfs}/_obj/_cgo_.o" diff --git a/tests/spread/integration/golang-1.25-go/test_minimal.sh b/tests/spread/integration/golang-1.25-go/test_minimal.sh new file mode 100644 index 000000000..590766a5b --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/test_minimal.sh @@ -0,0 +1,2 @@ +cp ../golang/hello/cmd/hello/main.go "${rootfs}/hello.go" +chroot "${rootfs}" /usr/lib/go-1.25/bin/go run /hello.go | grep "Hello, World!" diff --git a/tests/spread/integration/golang-1.25-go/test_profiling-tools.sh b/tests/spread/integration/golang-1.25-go/test_profiling-tools.sh new file mode 100644 index 000000000..ec7f4ec73 --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/test_profiling-tools.sh @@ -0,0 +1 @@ +(chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool preprofile 2>&1 || true) | grep "usage" diff --git a/tests/spread/integration/golang-1.25-go/test_testing-tools.sh b/tests/spread/integration/golang-1.25-go/test_testing-tools.sh new file mode 100644 index 000000000..bf0196acc --- /dev/null +++ b/tests/spread/integration/golang-1.25-go/test_testing-tools.sh @@ -0,0 +1 @@ +chroot "${rootfs}" /usr/lib/go-1.25/bin/go tool cover -V diff --git a/tests/spread/integration/golang/hello/cmd/hello/main.go b/tests/spread/integration/golang/hello/cmd/hello/main.go new file mode 100644 index 000000000..a2e2bc363 --- /dev/null +++ b/tests/spread/integration/golang/hello/cmd/hello/main.go @@ -0,0 +1,9 @@ +// Source: https://gobyexample.com/hello-world + +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World!") +} diff --git a/tests/spread/integration/golang/hello/cmd/hello_cgo/main_cgo.go b/tests/spread/integration/golang/hello/cmd/hello_cgo/main_cgo.go new file mode 100644 index 000000000..5d393b197 --- /dev/null +++ b/tests/spread/integration/golang/hello/cmd/hello_cgo/main_cgo.go @@ -0,0 +1,15 @@ +package main + +/* +#include + +void hello_from_c() { + printf("Hello from C!\n"); +} +*/ +import "C" + +func main() { + C.hello_from_c() + C.fflush(C.stdout) +} diff --git a/tests/spread/integration/golang/hello/go.mod b/tests/spread/integration/golang/hello/go.mod new file mode 100644 index 000000000..853b93f78 --- /dev/null +++ b/tests/spread/integration/golang/hello/go.mod @@ -0,0 +1,3 @@ +module hello + +go 1.22.2 diff --git a/tests/spread/integration/golang/hello/hello.go b/tests/spread/integration/golang/hello/hello.go new file mode 100644 index 000000000..13f211a06 --- /dev/null +++ b/tests/spread/integration/golang/hello/hello.go @@ -0,0 +1,5 @@ +package hello + +func Hello() string { + return "Hello, World!" +} diff --git a/tests/spread/integration/golang/hello/hello_test.go b/tests/spread/integration/golang/hello/hello_test.go new file mode 100644 index 000000000..12a86d7c3 --- /dev/null +++ b/tests/spread/integration/golang/hello/hello_test.go @@ -0,0 +1,14 @@ +package hello_test + +import ( + "hello" + "testing" +) + +func TestMain(t *testing.T) { + expected := "Hello, World!" + t.Logf("expected: %s", expected) + if got := hello.Hello(); got != expected { + t.Errorf("expect %v, got %v", expected, got) + } +} diff --git a/tests/spread/integration/golang/task.yaml b/tests/spread/integration/golang/task.yaml new file mode 100644 index 000000000..9d478fca3 --- /dev/null +++ b/tests/spread/integration/golang/task.yaml @@ -0,0 +1,9 @@ +summary: Integration tests for golang + +variants: + - all + +environment: + GOTOOLCHAIN: local + +execute: bash -ex ./test_${SPREAD_VARIANT}.sh diff --git a/tests/spread/integration/golang/test_all.sh b/tests/spread/integration/golang/test_all.sh new file mode 100644 index 000000000..feb3bda88 --- /dev/null +++ b/tests/spread/integration/golang/test_all.sh @@ -0,0 +1,60 @@ +arch=$(uname -m) +arch="${arch//_/-}" + +if [ "${arch}" = "aarch64" ]; then +chisel_arch="arm64" +elif [ "${arch}" = "x86-64" ]; then +chisel_arch="amd64" +else +echo "Unsupported architecture: ${arch}" +exit 1 +fi + +rootfs="$(install-slices --arch "${chisel_arch}" \ + golang_cgo-support \ + ca-certificates_data \ # for `go get` to work properly +)" + +find ${rootfs}/usr/share/go-1.25 -depth \( \ + \( -path '*test*' \ + ! -path '*src/testing*' \ + ! -path '*src/internal/test*' \ + ! -path '*src/internal/synctest' \ + ! -path '*synctest.go' \ + ! -path '*synctest_o*' \) -o \ + \( -path '*/testing/*' -name '*_test.go' \) \ + \) -exec rm -rf {} + + +mkdir "${rootfs}/proc" +mount --bind /proc "${rootfs}/proc" + +mkdir "${rootfs}/dev" +mount --bind /dev "${rootfs}/dev" + +mkdir -p "${rootfs}/tmp" + +mkdir "${rootfs}/app" +cp -r hello "${rootfs}/" + +chroot "${rootfs}/" go version +chroot "${rootfs}/" go run /hello/cmd/hello/main.go | grep "Hello, World!" + +chroot "${rootfs}/" gofmt /hello/cmd/hello/main.go > /dev/null + +chroot "${rootfs}/" go -C /hello test + +git clone https://github.com/canonical/chisel.git "${rootfs}/chisel" +git -C "$rootfs/chisel" checkout v1.2.0 +cp /etc/resolv.conf "${rootfs}/etc/resolv.conf" + +chroot "${rootfs}/" go -C chisel build ./cmd/chisel +chroot "${rootfs}/" ./chisel/chisel 2>&1 > /dev/null + + +export CGO_ENABLED=1 +chroot "${rootfs}/" go run /hello/cmd/hello_cgo/main_cgo.go | grep "Hello from C!" + +umount "${rootfs}/proc" +umount "${rootfs}/dev" +rm -rf "${rootfs}/proc" +rm -rf "${rootfs}/dev" diff --git a/tests/spread/integration/make/Makefile b/tests/spread/integration/make/Makefile new file mode 100644 index 000000000..2b5560e19 --- /dev/null +++ b/tests/spread/integration/make/Makefile @@ -0,0 +1,3 @@ +.PHONY: all +all: + $(info Hello from Makefile!) diff --git a/tests/spread/integration/make/task.yaml b/tests/spread/integration/make/task.yaml new file mode 100644 index 000000000..51b138668 --- /dev/null +++ b/tests/spread/integration/make/task.yaml @@ -0,0 +1,9 @@ +summary: Integration tests for make + +execute: | + rootfs=$(install-slices make_bins) + + chroot "${rootfs}" make --version | grep "GNU Make" + + cp Makefile "${rootfs}/Makefile" + chroot "${rootfs}" make | grep -q "Hello from Makefile!"