Skip to content

Commit 945eed2

Browse files
committed
Add ut for fake database transactions
Signed-off-by: Spike Curtis <spike@coder.com>
1 parent fa3a3db commit 945eed2

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

coderd/database/databasefake/databasefake_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,67 @@
11
package databasefake_test
22

33
import (
4+
"context"
5+
"database/sql"
46
"fmt"
57
"reflect"
68
"testing"
9+
"time"
10+
11+
"github.com/stretchr/testify/assert"
712

813
"github.com/coder/coder/coderd/database"
914

1015
"github.com/coder/coder/coderd/database/databasefake"
1116
)
1217

18+
// test that transactions don't deadlock, and that we don't see intermediate state.
19+
func TestInTx(t *testing.T) {
20+
t.Parallel()
21+
22+
uut := databasefake.New()
23+
24+
inTx := make(chan any)
25+
queriesDone := make(chan any)
26+
queriesStarted := make(chan any)
27+
go func() {
28+
err := uut.InTx(func(tx database.Store) error {
29+
close(inTx)
30+
_, err := tx.InsertOrganization(context.Background(), database.InsertOrganizationParams{
31+
Name: "1",
32+
})
33+
assert.NoError(t, err)
34+
<-queriesStarted
35+
time.Sleep(5 * time.Millisecond)
36+
_, err = tx.InsertOrganization(context.Background(), database.InsertOrganizationParams{
37+
Name: "2",
38+
})
39+
assert.NoError(t, err)
40+
return nil
41+
})
42+
assert.NoError(t, err)
43+
}()
44+
var nums []int
45+
go func() {
46+
<-inTx
47+
for i := 0; i < 20; i++ {
48+
orgs, err := uut.GetOrganizations(context.Background())
49+
if err != nil {
50+
assert.ErrorIs(t, err, sql.ErrNoRows)
51+
}
52+
nums = append(nums, len(orgs))
53+
time.Sleep(time.Millisecond)
54+
}
55+
close(queriesDone)
56+
}()
57+
close(queriesStarted)
58+
<-queriesDone
59+
// ensure we never saw 1 org, only 0 or 2.
60+
for i := 0; i < 20; i++ {
61+
assert.NotEqual(t, 1, nums[i])
62+
}
63+
}
64+
1365
// TestExactMethods will ensure the fake database does not hold onto excessive
1466
// functions. The fake database is a manual implementation, so it is possible
1567
// we forget to delete functions that we remove. This unit test just ensures

0 commit comments

Comments
 (0)