/sqlite3_go113_test.go

https://github.com/mutecomm/go-sqlcipher · Go · 78 lines · 60 code · 10 blank · 8 comment · 17 complexity · 5c7772a2b816ca21b6750f60f61d5d67 MD5 · raw file

  1. // Copyright (C) 2019 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
  2. //
  3. // Use of this source code is governed by an MIT-style
  4. // license that can be found in the LICENSE file.
  5. // +build go1.13,cgo
  6. package sqlite3
  7. import (
  8. "context"
  9. "database/sql"
  10. "database/sql/driver"
  11. "os"
  12. "testing"
  13. )
  14. func TestBeginTxCancel(t *testing.T) {
  15. srcTempFilename := TempFilename(t)
  16. defer os.Remove(srcTempFilename)
  17. db, err := sql.Open("sqlite3", srcTempFilename)
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. db.SetMaxOpenConns(10)
  22. db.SetMaxIdleConns(5)
  23. defer db.Close()
  24. initDatabase(t, db, 100)
  25. // create several go-routines to expose racy issue
  26. for i := 0; i < 1000; i++ {
  27. func() {
  28. ctx, cancel := context.WithCancel(context.Background())
  29. conn, err := db.Conn(ctx)
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. defer func() {
  34. if err := conn.Close(); err != nil {
  35. t.Error(err)
  36. }
  37. }()
  38. err = conn.Raw(func(driverConn interface{}) error {
  39. d, ok := driverConn.(driver.ConnBeginTx)
  40. if !ok {
  41. t.Fatal("unexpected: wrong type")
  42. }
  43. // checks that conn.Raw can be used to get *SQLiteConn
  44. if _, ok = driverConn.(*SQLiteConn); !ok {
  45. t.Fatalf("conn.Raw() driverConn type=%T, expected *SQLiteConn", driverConn)
  46. }
  47. go cancel() // make it cancel concurrently with exec("BEGIN");
  48. tx, err := d.BeginTx(ctx, driver.TxOptions{})
  49. switch err {
  50. case nil:
  51. switch err := tx.Rollback(); err {
  52. case nil, sql.ErrTxDone:
  53. default:
  54. return err
  55. }
  56. case context.Canceled:
  57. default:
  58. // must not fail with "cannot start a transaction within a transaction"
  59. return err
  60. }
  61. return nil
  62. })
  63. if err != nil {
  64. t.Fatal(err)
  65. }
  66. }()
  67. }
  68. }