diff --git a/cmd/reviewGOOSE/main_test.go b/cmd/reviewGOOSE/main_test.go index 2b15995..2e622fd 100644 --- a/cmd/reviewGOOSE/main_test.go +++ b/cmd/reviewGOOSE/main_test.go @@ -10,6 +10,7 @@ import ( "runtime" "strings" "sync" + "sync/atomic" "testing" "time" @@ -887,7 +888,8 @@ func TestNewlyBlockedPRAfterGracePeriod(t *testing.T) { // TestAuthRetryLoopStopsOnSuccess tests that the auth retry loop stops when auth succeeds. func TestAuthRetryLoopStopsOnSuccess(t *testing.T) { - ctx := t.Context() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() app := &App{ mu: sync.RWMutex{}, @@ -895,30 +897,36 @@ func TestAuthRetryLoopStopsOnSuccess(t *testing.T) { systrayInterface: &MockSystray{}, } - // Track how many times we check authError - checkCount := 0 + // Track how many times we check authError (use atomic for thread safety) + var checkCount atomic.Int32 done := make(chan struct{}) + exitReason := make(chan string, 1) // Start a goroutine that simulates the auth retry loop behavior go func() { defer close(done) + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + for { select { case <-ctx.Done(): + exitReason <- "context canceled" return - case <-time.After(10 * time.Millisecond): // Fast ticker for testing + case <-ticker.C: app.mu.RLock() hasError := app.authError != "" app.mu.RUnlock() - checkCount++ + count := checkCount.Add(1) if !hasError { + exitReason <- fmt.Sprintf("auth succeeded after %d checks", count) return // Loop should exit when auth succeeds } // Simulate clearing auth error on 3rd attempt - if checkCount >= 3 { + if count >= 3 { app.mu.Lock() app.authError = "" app.mu.Unlock() @@ -931,8 +939,14 @@ func TestAuthRetryLoopStopsOnSuccess(t *testing.T) { select { case <-done: // Success - loop exited - case <-time.After(1 * time.Second): - t.Fatal("Auth retry loop did not stop after auth succeeded") + reason := "unknown" + select { + case reason = <-exitReason: + default: + } + t.Logf("Goroutine exited: %s", reason) + case <-time.After(2 * time.Second): + t.Fatalf("Auth retry loop did not stop after auth succeeded (checkCount=%d)", checkCount.Load()) } // Verify auth error was cleared @@ -944,8 +958,9 @@ func TestAuthRetryLoopStopsOnSuccess(t *testing.T) { t.Errorf("Expected auth error to be cleared, got: %s", finalError) } - if checkCount < 3 { - t.Errorf("Expected at least 3 retry attempts, got: %d", checkCount) + finalCount := checkCount.Load() + if finalCount < 3 { + t.Errorf("Expected at least 3 retry attempts, got: %d", finalCount) } } diff --git a/go.mod b/go.mod index 637fdea..312456b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/codeGROOVE-dev/goose go 1.25.4 require ( - github.com/codeGROOVE-dev/retry v1.3.0 + github.com/codeGROOVE-dev/retry v1.3.1 github.com/codeGROOVE-dev/sprinkler v0.0.0-20251113030909-5962af625370 github.com/codeGROOVE-dev/turnclient v0.0.0-20251210023051-bbb7e1943ebd github.com/energye/systray v1.0.2 @@ -16,14 +16,17 @@ require ( require ( git.sr.ht/~jackmordaunt/go-toast v1.1.2 // indirect - github.com/codeGROOVE-dev/prx v0.0.0-20251210004018-f65fe8849ded // indirect - github.com/codeGROOVE-dev/sfcache v1.4.2 // indirect - github.com/codeGROOVE-dev/sfcache/pkg/store/localfs v1.4.2 // indirect + github.com/codeGROOVE-dev/fido v1.10.0 // indirect + github.com/codeGROOVE-dev/fido/pkg/store/compress v1.10.0 // indirect + github.com/codeGROOVE-dev/fido/pkg/store/localfs v1.10.0 // indirect + github.com/codeGROOVE-dev/prx v0.0.0-20260106161606-c98f36600fa9 // indirect github.com/esiqveland/notify v0.13.3 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-querystring v1.2.0 // indirect github.com/jackmordaunt/icns/v3 v3.0.1 // indirect + github.com/klauspost/compress v1.18.2 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/puzpuzpuz/xsync/v4 v4.2.0 // indirect github.com/sergeymakinen/go-bmp v1.0.0 // indirect github.com/sergeymakinen/go-ico v1.0.0 // indirect github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect diff --git a/go.sum b/go.sum index ba6a525..9894763 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,15 @@ git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= -github.com/codeGROOVE-dev/prx v0.0.0-20251210004018-f65fe8849ded h1:d5pL5z1e/N0FFTPvgkkqwMposglQkNCBPi40XQ7CrWs= -github.com/codeGROOVE-dev/prx v0.0.0-20251210004018-f65fe8849ded/go.mod h1:tBh77XZQxCyzMUB+6yjlayMbE9g6JRpBjGbAntfzk0M= -github.com/codeGROOVE-dev/retry v1.3.0 h1:/+ipAWRJLL6y1R1vprYo0FSjSBvH6fE5j9LKXjpD54g= -github.com/codeGROOVE-dev/retry v1.3.0/go.mod h1:8OgefgV1XP7lzX2PdKlCXILsYKuz6b4ZpHa/20iLi8E= -github.com/codeGROOVE-dev/sfcache v1.4.2 h1:F1fXicO/B2O2N7KuJRkaHqJCHgxYXls7aQtSH8wUxH0= -github.com/codeGROOVE-dev/sfcache v1.4.2/go.mod h1:ksV5Y1RwKmOPZZiV0zXpsBOENGUCgO0fVgr/P8f/DJM= -github.com/codeGROOVE-dev/sfcache/pkg/store/localfs v1.4.2 h1:EF0RxIee8DvugvTmwinSqt5OHFEykol3kZcxzcS62uE= -github.com/codeGROOVE-dev/sfcache/pkg/store/localfs v1.4.2/go.mod h1:D/Y1sYT1m3VXHZRkQjHjFwtKQOsb587QZP/GtfJEDSE= +github.com/codeGROOVE-dev/fido v1.10.0 h1:i4Wb6LDd5nD/4Fnp47KAVUVhG1O1mN5jSRbCYPpBYjw= +github.com/codeGROOVE-dev/fido v1.10.0/go.mod h1:/mqfMeKCTYTGt/Y0cWm6gh8gYBKG1w8xBsTDmu+A/pU= +github.com/codeGROOVE-dev/fido/pkg/store/compress v1.10.0 h1:W3AYtR6eyPHQ8QhTsuqjNZYWk/Fev0cJiAiuw04uhlk= +github.com/codeGROOVE-dev/fido/pkg/store/compress v1.10.0/go.mod h1:0hFYQ8Y6jfrYuJb8eBimYz66tg7DDuVWbZqaI944LQM= +github.com/codeGROOVE-dev/fido/pkg/store/localfs v1.10.0 h1:oaPwuHHBuzhsWnPm7UCxgwjz7+jG3O0JenSSgPSwqv8= +github.com/codeGROOVE-dev/fido/pkg/store/localfs v1.10.0/go.mod h1:zUGzODSWykosAod0IHycxdxUOMcd2eVqd6eUdOsU73E= +github.com/codeGROOVE-dev/prx v0.0.0-20260106161606-c98f36600fa9 h1:sAfFmbmeZVM15XkhIIUEosyO3kfcTmwAnH9b/YDqe2E= +github.com/codeGROOVE-dev/prx v0.0.0-20260106161606-c98f36600fa9/go.mod h1:pAsjPLE2zHbj5mcM9CGa5AIxpxcjklSJvLbK5yQY7UM= +github.com/codeGROOVE-dev/retry v1.3.1 h1:BAkfDzs6FssxLCGWGgM97bb+6/8GTa40Cs147vXkJOg= +github.com/codeGROOVE-dev/retry v1.3.1/go.mod h1:+b3huqYGY1+ZJyuCmR8nBVLjd3WJ7qAFss+sI4s6FSc= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251113030909-5962af625370 h1:uYXBDnaRRf4q6X/IWOm6O/cOj57tVkpjfVvwn+SfHp0= github.com/codeGROOVE-dev/sprinkler v0.0.0-20251113030909-5962af625370/go.mod h1:sOvKRad1kRPAOIUm7spNR3aeVQjtk9VoS8uo6NL4kus= github.com/codeGROOVE-dev/turnclient v0.0.0-20251210023051-bbb7e1943ebd h1:Baps/A2EaaMlZlTseAO9/ig0oWFmqUGLtNRJm9bEDXA= @@ -27,19 +29,24 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v57 v57.0.0 h1:L+Y3UPTY8ALM8x+TV0lg+IEBI+upibemtBD8Q9u7zHs= github.com/google/go-github/v57 v57.0.0/go.mod h1:s0omdnye0hvK/ecLvpsGfJMiRt85PimQh4oygmLIxHw= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= +github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= github.com/jackmordaunt/icns/v3 v3.0.1 h1:xxot6aNuGrU+lNgxz5I5H0qSeCjNKp8uTXB1j8D4S3o= github.com/jackmordaunt/icns/v3 v3.0.1/go.mod h1:5sHL59nqTd2ynTnowxB/MDQFhKNqkK8X687uKNygaSQ= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/puzpuzpuz/xsync/v4 v4.2.0 h1:dlxm77dZj2c3rxq0/XNvvUKISAmovoXF4a4qM6Wvkr0= +github.com/puzpuzpuz/xsync/v4 v4.2.0/go.mod h1:VJDmTCJMBt8igNxnkQd86r+8KUeN1quSfNKu5bLYFQo= github.com/sergeymakinen/go-bmp v1.0.0 h1:SdGTzp9WvCV0A1V0mBeaS7kQAwNLdVJbmHlqNWq0R+M= github.com/sergeymakinen/go-bmp v1.0.0/go.mod h1:/mxlAQZRLxSvJFNIEGGLBE/m40f3ZnUifpgVDlcUIEY= github.com/sergeymakinen/go-ico v1.0.0 h1:uL3khgvKkY6WfAetA+RqsguClBuu7HpvBB/nq/Jvr80= @@ -67,7 +74,6 @@ golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=