Steps
Result
There appears to be a race condition
==================
WARNING: DATA RACE
Write at 0x00c0001a3730 by goroutine 10:
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:105 +0x5a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous read at 0x00c0001a3730 by goroutine 9:
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:80 +0x1fb
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001a3508 by goroutine 10:
github.com/fumeapp/taskin.TestDisableUI.func1()
/home/sk/Code/taskin/config_test.go:67 +0x28
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:109 +0xab
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous read at 0x00c0001a3508 by goroutine 9:
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:80 +0x1fb
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x0000008db7b0 by goroutine 10:
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:127 +0x37b
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x0000008db7b0 by goroutine 9:
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x379
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001ae6a0 by goroutine 10:
github.com/charmbracelet/bubbletea.(*Program).Send()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3bb
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:128 +0x38a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x00c0001ae6a0 by goroutine 9:
github.com/charmbracelet/bubbletea.NewProgram()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:181 +0x69
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x365
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001d22e8 by goroutine 10:
sync/atomic.LoadInt64()
/home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:208 +0xb
sync/atomic.LoadPointer()
<autogenerated>:1 +0x10
context.(*cancelCtx).Done()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:449 +0x4c
github.com/charmbracelet/bubbletea.(*Program).Send()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:128 +0x38a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x00c0001d22e8 by goroutine 9:
context.withCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
context.WithCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
github.com/charmbracelet/bubbletea.NewProgram()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x365
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001d22e0 by goroutine 10:
sync/atomic.CompareAndSwapInt32()
/home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:361 +0xb
sync/atomic.CompareAndSwapInt32()
<autogenerated>:1 +0x18
sync.(*Mutex).Lock()
/home/sk/.local/share/mise/installs/go/1.26.1/src/sync/mutex.go:46 +0x28
context.(*cancelCtx).Done()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:453 +0xa5
github.com/charmbracelet/bubbletea.(*Program).Send()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:128 +0x38a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x00c0001d22e0 by goroutine 9:
context.withCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
context.WithCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
github.com/charmbracelet/bubbletea.NewProgram()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x365
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001d22f0 by goroutine 10:
sync/atomic.StoreInt64()
/home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:237 +0xb
sync/atomic.StorePointer()
/home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/atomic_pointer.go:92 +0x44
context.(*cancelCtx).Done()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:458 +0x124
github.com/charmbracelet/bubbletea.(*Program).Send()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:128 +0x38a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x00c0001d22f0 by goroutine 9:
context.withCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
context.WithCancel()
/home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
github.com/charmbracelet/bubbletea.NewProgram()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x365
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001ae6b8 by goroutine 10:
github.com/charmbracelet/bubbletea.(*Program).Send()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:606 +0x3e4
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:128 +0x38a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Previous write at 0x00c0001ae6b8 by goroutine 9:
github.com/charmbracelet/bubbletea.NewProgram()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:181 +0x69
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x365
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:86 +0x2de
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 10 (running) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestDisableUI()
/home/sk/Code/taskin/config_test.go:77 +0x18d
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Goroutine 9 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
==================
✔ Test task completed
--- FAIL: TestDisableUI (0.00s)
testing.go:1712: race detected during execution of test
==================
WARNING: DATA RACE
Write at 0x0000008db7b0 by goroutine 25:
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:81 +0x379
github.com/fumeapp/taskin.TestRunnersRun()
/home/sk/Code/taskin/taskin_test.go:41 +0x1c4
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Previous read at 0x0000008db7b0 by goroutine 26:
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:127 +0x37b
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Goroutine 25 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
Goroutine 26 (finished) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestRunnersRun()
/home/sk/Code/taskin/taskin_test.go:39 +0x19a
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
==================
==================
WARNING: DATA RACE
Read at 0x00c0002f25b0 by goroutine 25:
github.com/fumeapp/taskin.(*Model).View()
/home/sk/Code/taskin/mvc.go:102 +0xae
github.com/charmbracelet/bubbletea.(*Program).Run()
/home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:531 +0xbfd
github.com/fumeapp/taskin.(*Runners).Run()
/home/sk/Code/taskin/taskin.go:82 +0x3c6
github.com/fumeapp/taskin.TestRunnersRun()
/home/sk/Code/taskin/taskin_test.go:41 +0x1c4
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
Previous write at 0x00c0002f25b0 by goroutine 26:
github.com/fumeapp/taskin.New.func1()
/home/sk/Code/taskin/taskin.go:105 +0x5a
github.com/fumeapp/taskin.New.func2()
/home/sk/Code/taskin/taskin.go:142 +0x196
Goroutine 25 (running) created at:
testing.(*T).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.runTests()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:64 +0x164
Goroutine 26 (finished) created at:
github.com/fumeapp/taskin.New()
/home/sk/Code/taskin/taskin.go:133 +0x76a
github.com/fumeapp/taskin.TestRunnersRun()
/home/sk/Code/taskin/taskin_test.go:39 +0x19a
testing.tRunner()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
==================
✔ Test Task
--- FAIL: TestRunnersRun (0.00s)
testing.go:1712: race detected during execution of test
First race
taskin.New starts a goroutine immediately:
- taskin.go:133-147 starts task execution in the background.
- That goroutine mutates shared runner/task state:
- runner.State = Running at taskin.go:105
- runner.Task.Title = ... at taskin.go:111
- runner.State = Failed/Completed at taskin.go:112, taskin.go:126
- user task callbacks can call Task.Progress, which mutates Task.ShowProgress and Task.Bar at taskin.go:45-56
At the same time, Run passes the same runner slice into Bubble Tea:
- taskin.go:73: m := &Model{Runners: *r, ...}
Bubble Tea then reads that same state while rendering/updating:
- mvc.go:100-120: View reads runners/tasks.
- mvc.go:42-81: Update reads runner state and updates spinners.
So one goroutine writes Runner / Task fields while another goroutine reads them. There is no mutex, channel handoff, or other happens-before relationship.
Second Race
There is also a race around the package-global program:
- taskin.go:16: var program *tea.Program
- taskin.go:81: Run assigns it.
- taskin.go:127-128 and taskin.go:143-144: the task goroutine reads it and calls program.Send.
Because New starts the goroutine before Run initializes program, the goroutine can read program while another goroutine is assigning it.
Steps
go test -race ./...Result
There appears to be a race condition
First race
taskin.New starts a goroutine immediately:
At the same time, Run passes the same runner slice into Bubble Tea:
Bubble Tea then reads that same state while rendering/updating:
So one goroutine writes Runner / Task fields while another goroutine reads them. There is no mutex, channel handoff, or other happens-before relationship.
Second Race
There is also a race around the package-global program:
Because New starts the goroutine before Run initializes program, the goroutine can read program while another goroutine is assigning it.