jet/tests/postgres/lock_test.go

75 lines
1.5 KiB
Go
Raw Normal View History

2019-07-30 11:45:10 +02:00
package postgres
import (
"context"
2019-07-29 18:08:53 +02:00
"github.com/go-jet/jet/internal/testutils"
"github.com/stretchr/testify/require"
"testing"
"time"
2019-08-03 14:10:47 +02:00
. "github.com/go-jet/jet/postgres"
2019-07-20 14:09:44 +02:00
. "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/table"
)
func TestLockTable(t *testing.T) {
expectedSQL := `
LOCK TABLE dvds.address IN`
2019-08-11 09:52:02 +02:00
var testData = []TableLockMode{
LOCK_ACCESS_SHARE,
LOCK_ROW_SHARE,
LOCK_ROW_EXCLUSIVE,
LOCK_SHARE_UPDATE_EXCLUSIVE,
LOCK_SHARE,
LOCK_SHARE_ROW_EXCLUSIVE,
LOCK_EXCLUSIVE,
LOCK_ACCESS_EXCLUSIVE,
}
for _, lockMode := range testData {
query := Address.LOCK().IN(lockMode)
2019-07-30 11:18:12 +02:00
testutils.AssertDebugStatementSql(t, query, expectedSQL+" "+string(lockMode)+" MODE;\n")
tx, _ := db.Begin()
_, err := query.Exec(tx)
require.NoError(t, err)
err = tx.Rollback()
require.NoError(t, err)
}
for _, lockMode := range testData {
query := Address.LOCK().IN(lockMode).NOWAIT()
2019-07-30 11:18:12 +02:00
testutils.AssertDebugStatementSql(t, query, expectedSQL+" "+string(lockMode)+" MODE NOWAIT;\n")
tx, _ := db.Begin()
_, err := query.Exec(tx)
require.NoError(t, err)
err = tx.Rollback()
require.NoError(t, err)
}
}
func TestLockExecContext(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Microsecond)
defer cancel()
2019-07-20 14:23:42 +02:00
time.Sleep(10 * time.Millisecond)
tx, _ := db.Begin()
defer tx.Rollback()
_, err := Address.LOCK().IN(LOCK_ACCESS_SHARE).ExecContext(ctx, tx)
require.Error(t, err, "context deadline exceeded")
}