@@ -10,6 +10,8 @@ import (
1010 "os"
1111 "path/filepath"
1212 "strings"
13+ "sync"
14+ "sync/atomic"
1315 "testing"
1416
1517 "github.com/speakeasy-api/openapi/jsonschema/oas3"
@@ -112,6 +114,37 @@ const testSuiteDir = "testsuite/tests/draft2020-12"
112114// Global variable to hold the remote server instance
113115var remoteServer * RemoteServer
114116
117+ // Thread-safe coverage tracking
118+ type CoverageTracker struct {
119+ totalFiles int64
120+ skippedFiles int64
121+ totalCases int64
122+ skippedCases int64
123+ passedCases int64
124+ }
125+
126+ func (c * CoverageTracker ) AddFile () {
127+ atomic .AddInt64 (& c .totalFiles , 1 )
128+ }
129+
130+ func (c * CoverageTracker ) AddSkippedFile () {
131+ atomic .AddInt64 (& c .skippedFiles , 1 )
132+ }
133+
134+ func (c * CoverageTracker ) AddCases (total , skipped , passed int64 ) {
135+ atomic .AddInt64 (& c .totalCases , total )
136+ atomic .AddInt64 (& c .skippedCases , skipped )
137+ atomic .AddInt64 (& c .passedCases , passed )
138+ }
139+
140+ func (c * CoverageTracker ) GetStats () (int , int , int , int , int ) {
141+ return int (atomic .LoadInt64 (& c .totalFiles )),
142+ int (atomic .LoadInt64 (& c .skippedFiles )),
143+ int (atomic .LoadInt64 (& c .totalCases )),
144+ int (atomic .LoadInt64 (& c .skippedCases )),
145+ int (atomic .LoadInt64 (& c .passedCases ))
146+ }
147+
115148func TestMain (m * testing.M ) {
116149 // Check if the git submodule is initialized
117150 if ! isSubmoduleInitialized (testSuiteDir ) {
@@ -148,32 +181,35 @@ func TestJSONSchemaTestSuite_RoundTrip(t *testing.T) {
148181 // Get all test files
149182 testFiles := getAllTestFiles (t , testSuiteDir )
150183
151- // Track coverage statistics
152- var totalFiles , skippedFiles , totalCases , skippedCases , passedCases int
184+ // Thread-safe coverage tracking
185+ tracker := & CoverageTracker {}
186+ var wg sync.WaitGroup
153187
154188 for _ , testFile := range testFiles {
155- totalFiles ++
189+ tracker . AddFile ()
156190
157191 // Check if this file is blacklisted
158192 if reason , isBlacklisted := blacklistedFiles [testFile ]; isBlacklisted {
159- skippedFiles ++
193+ tracker . AddSkippedFile ()
160194 t .Run (testFile , func (t * testing.T ) {
161195 t .Skipf ("Skipping blacklisted file: %s" , reason )
162196 })
163197 continue
164198 }
165199
200+ wg .Add (1 )
166201 t .Run (testFile , func (t * testing.T ) {
202+ defer wg .Done ()
167203 t .Parallel ()
168204 fileCases , fileSkipped , filePassed := runRoundTripTestFile (t , filepath .Join (testSuiteDir , testFile ))
169- totalCases += fileCases
170- skippedCases += fileSkipped
171- passedCases += filePassed
205+ tracker .AddCases (int64 (fileCases ), int64 (fileSkipped ), int64 (filePassed ))
172206 })
173207 }
174208
175- // Print coverage summary
209+ // Print coverage summary after all tests complete
176210 t .Cleanup (func () {
211+ wg .Wait () // Wait for all parallel tests to complete
212+ totalFiles , skippedFiles , totalCases , skippedCases , passedCases := tracker .GetStats ()
177213 printCoverageSummary (t , totalFiles , skippedFiles , totalCases , skippedCases , passedCases )
178214 })
179215}
0 commit comments