Skip to content

Commit dc9cf9e

Browse files
fix: resolve test failures and race conditions
- Fix thread-safe coverage tracking using atomic operations and sync.WaitGroup - Remove conflicting reference validation test for empty tokens - Ensure RFC 6901 compliance for JSON pointer empty tokens
1 parent d35e2ff commit dc9cf9e

File tree

2 files changed

+44
-13
lines changed

2 files changed

+44
-13
lines changed

jsonschema/oas3/tests/testsuite_test.go

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
113115
var 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+
115148
func 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
}

references/reference_test.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,6 @@ func TestReference_Validate_Error(t *testing.T) {
103103
ref: "https://example .com/api.yaml#/User",
104104
expectError: "invalid reference URI",
105105
},
106-
{
107-
name: "invalid JSON pointer - empty token after slash",
108-
ref: "#/components//User",
109-
expectError: "invalid reference JSON pointer",
110-
},
111106
}
112107

113108
for _, tt := range tests {

0 commit comments

Comments
 (0)