From ddc9290370665562278e4e78aa85ec670367e806 Mon Sep 17 00:00:00 2001 From: aya Date: Sun, 16 Mar 2025 12:46:52 +0200 Subject: [PATCH] Adding changes for creating multi iteration job --- .github/workflows/endurancce_test.yml | 42 +++++++++++++++ waku/memory_utils.go | 77 +++++++++++++++++++++++++++ waku/stress_test.go | 3 ++ 3 files changed, 122 insertions(+) create mode 100644 .github/workflows/endurancce_test.yml create mode 100644 waku/memory_utils.go diff --git a/.github/workflows/endurancce_test.yml b/.github/workflows/endurancce_test.yml new file mode 100644 index 0000000..814db62 --- /dev/null +++ b/.github/workflows/endurancce_test.yml @@ -0,0 +1,42 @@ +name: Repeated Test Suite + +on: + push: + branches: [ "main" ] + pull_request: + +jobs: + repeated-tests: + runs-on: ubuntu-latest + + steps: + - name: Check out repo + uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: "1.21" + + - name: Clean environment + run: go clean -cache + + - name: Initialize CSV + run: echo "TestName,Iteration,Phase,HeapAlloc(KB),RSS(KB),Timestamp" > memory_metrics.csv + + - name: Repeated test runs + run: | + for i in {1..10}; do + echo "Iteration $i: measuring memory BEFORE the tests..." + go run waku/memory_utils.go --iteration $i --phase start + echo "Running tests (iteration $i)..." + go test -v -tags '!stress' ./... + echo "Iteration $i: measuring memory AFTER the tests..." + go run waku/memory_utils.go --iteration $i --phase end + done + + - name: Upload memory_metrics.csv + uses: actions/upload-artifact@v4 + with: + name: memory_metrics + path: memory_metrics.csv diff --git a/waku/memory_utils.go b/waku/memory_utils.go new file mode 100644 index 0000000..6187a6c --- /dev/null +++ b/waku/memory_utils.go @@ -0,0 +1,77 @@ +package waku + +import ( + "encoding/csv" + "flag" + "fmt" + "os" + "runtime" + "strconv" + "sync" + "time" +) + +var ( + testName string + iteration int + phase string + mu sync.Mutex +) + +func main() { + flag.StringVar(&testName, "testName", "FullTestSuite", "Name of the test ") + flag.IntVar(&iteration, "iteration", 0, "Iteration number") + flag.StringVar(&phase, "phase", "", "'start' or 'end')") + flag.Parse() + + var memStats runtime.MemStats + runtime.ReadMemStats(&memStats) + heapKB := memStats.HeapAlloc / 1024 + + rssKB, err := getRSSKB() + if err != nil { + fmt.Fprintln(os.Stderr, "Failed to get RSS:", err) + rssKB = 0 + } + + if err := recordMemoryMetricsCSV(testName, iteration, phase, heapKB, rssKB); err != nil { + fmt.Fprintln(os.Stderr, "Error recording metrics:", err) + os.Exit(1) + } +} + +func recordMemoryMetricsCSV(testName string, iter int, phase string, heapKB, rssKB uint64) error { + mu.Lock() + defer mu.Unlock() + + f, err := os.OpenFile("memory_metrics.csv", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer f.Close() + + w := csv.NewWriter(f) + defer w.Flush() + + stat, err := f.Stat() + if err != nil { + return err + } + if stat.Size() == 0 { + header := []string{"TestName", "Iteration", "Phase", "HeapAlloc(KB)", "RSS(KB)", "Timestamp"} + if err := w.Write(header); err != nil { + return err + } + } + + row := []string{ + testName, + strconv.Itoa(iter), + phase, + strconv.FormatUint(heapKB, 10), + strconv.FormatUint(rssKB, 10), + time.Now().Format(time.RFC3339), + } + + return w.Write(row) +} diff --git a/waku/stress_test.go b/waku/stress_test.go index b75b591..e652c26 100644 --- a/waku/stress_test.go +++ b/waku/stress_test.go @@ -1,3 +1,6 @@ + +// +build !stress + package waku import (