Files
hakurei/internal/rosa/rosa_test.go
Ophestra 3d54d1f176
All checks were successful
Test / Create distribution (push) Successful in 1m21s
Test / Sandbox (push) Successful in 3m14s
Test / Hakurei (push) Successful in 4m27s
Test / ShareFS (push) Successful in 4m31s
Test / Sandbox (race detector) (push) Successful in 5m55s
Test / Hakurei (race detector) (push) Successful in 6m55s
Test / Flake checks (push) Successful in 1m30s
internal/rosa: drop caches
This enables accurate benchmarking of the toolchain abstraction.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-04-03 20:58:23 +09:00

104 lines
2.0 KiB
Go

package rosa_test
import (
"context"
"log"
"os"
"os/signal"
"sync"
"syscall"
"testing"
"hakurei.app/check"
"hakurei.app/container"
"hakurei.app/internal/pkg"
"hakurei.app/internal/rosa"
"hakurei.app/message"
)
var (
// skipBuildTest caches whether build tests are skipped.
skipBuildTest bool
// buildTestCache is populated by getCache and must not be accessed directly.
buildTestCache *pkg.Cache
// buildTestCacheCancel cancels buildTestCache.
buildTestCacheCancel context.CancelFunc
// buildTestCacheOnce synchronises access to buildTestCache.
buildTestCacheOnce sync.Once
)
func TestMain(m *testing.M) {
container.TryArgv0(nil)
code := m.Run()
if buildTestCache != nil {
buildTestCacheCancel()
buildTestCache.Close()
}
os.Exit(code)
}
func getCache(t *testing.T) *pkg.Cache {
t.Helper()
const env = "ROSA_BUILD_TEST_CACHE_DIR"
if !testing.Verbose() {
t.Skip("verbose flag not set")
}
buildTestCacheOnce.Do(func() {
if p, ok := os.LookupEnv(env); !ok {
skipBuildTest = true
return
} else if a, err := check.NewAbs(p); err != nil {
t.Fatal(err)
} else {
var ctx context.Context
ctx, buildTestCacheCancel = signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM)
msg := message.New(log.New(os.Stderr, "rosa: ", 0))
msg.SwapVerbose(true)
if buildTestCache, err = pkg.Open(ctx, msg, 0, 0, a); err != nil {
t.Fatal(err)
}
}
})
if skipBuildTest {
t.Skip(env + " not set")
}
return buildTestCache
}
func TestCureAll(t *testing.T) {
cache := getCache(t)
t.Parallel()
for i := range rosa.PresetEnd {
p := rosa.PArtifact(i)
meta := rosa.GetMetadata(p)
a := rosa.Std.Load(p)
t.Run(meta.Name, func(t *testing.T) {
t.Parallel()
if pathname, _, err := cache.Cure(a); err != nil {
t.Fatal(err)
} else {
t.Log(pathname)
}
})
}
}
func BenchmarkStage3(b *testing.B) {
for b.Loop() {
rosa.Std.Load(rosa.LLVMClang)
b.StopTimer()
rosa.DropCaches()
b.StartTimer()
}
}