aboutsummaryrefslogtreecommitdiff
path: root/sqlite3_go18_test.go
diff options
context:
space:
mode:
authorMichaelS11 <MichaelS11@users.noreply.github.com>2019-06-18 13:33:26 -0700
committerMichaelS11 <MichaelS11@users.noreply.github.com>2019-06-19 16:50:49 -0700
commit57484d0899f89fc920d4437059f0caeb9579c9a1 (patch)
tree543c80d0195a740c44ca4e560435158e98f91665 /sqlite3_go18_test.go
parentMerge pull request #725 from auxten/patch-1 (diff)
downloadgolite-57484d0899f89fc920d4437059f0caeb9579c9a1.tar.gz
golite-57484d0899f89fc920d4437059f0caeb9579c9a1.tar.xz
Updated Ping to return ErrBadConn
Added TestOpenContext Added TestFileCopyTruncate Added ping to doTestOpen
Diffstat (limited to 'sqlite3_go18_test.go')
-rw-r--r--sqlite3_go18_test.go215
1 files changed, 215 insertions, 0 deletions
diff --git a/sqlite3_go18_test.go b/sqlite3_go18_test.go
index 741ed90..c9e79e7 100644
--- a/sqlite3_go18_test.go
+++ b/sqlite3_go18_test.go
@@ -11,6 +11,7 @@ import (
"context"
"database/sql"
"fmt"
+ "io/ioutil"
"math/rand"
"os"
"testing"
@@ -154,3 +155,217 @@ func TestExecCancel(t *testing.T) {
}
}
}
+
+func doTestOpenContext(t *testing.T, option string) (string, error) {
+ tempFilename := TempFilename(t)
+ url := tempFilename + option
+
+ defer func() {
+ err := os.Remove(tempFilename)
+ if err != nil {
+ t.Error("temp file remove error:", err)
+ }
+ }()
+
+ db, err := sql.Open("sqlite3", url)
+ if err != nil {
+ return "Failed to open database:", err
+ }
+
+ defer func() {
+ err = db.Close()
+ if err != nil {
+ t.Error("db close error:", err)
+ }
+ }()
+
+ ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second)
+ err = db.PingContext(ctx)
+ cancel()
+ if err != nil {
+ return "ping error:", err
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "drop table foo")
+ cancel()
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "create table foo (id integer)")
+ cancel()
+ if err != nil {
+ return "Failed to create table:", err
+ }
+
+ if stat, err := os.Stat(tempFilename); err != nil || stat.IsDir() {
+ return "Failed to create ./foo.db", nil
+ }
+
+ return "", nil
+}
+
+func TestOpenContext(t *testing.T) {
+ cases := map[string]bool{
+ "": true,
+ "?_txlock=immediate": true,
+ "?_txlock=deferred": true,
+ "?_txlock=exclusive": true,
+ "?_txlock=bogus": false,
+ }
+ for option, expectedPass := range cases {
+ result, err := doTestOpenContext(t, option)
+ if result == "" {
+ if !expectedPass {
+ errmsg := fmt.Sprintf("_txlock error not caught at dbOpen with option: %s", option)
+ t.Fatal(errmsg)
+ }
+ } else if expectedPass {
+ if err == nil {
+ t.Fatal(result)
+ } else {
+ t.Fatal(result, err)
+ }
+ }
+ }
+}
+
+func TestFileCopyTruncate(t *testing.T) {
+ var err error
+ tempFilename := TempFilename(t)
+
+ defer func() {
+ err = os.Remove(tempFilename)
+ if err != nil {
+ t.Error("temp file remove error:", err)
+ }
+ }()
+
+ db, err := sql.Open("sqlite3", tempFilename)
+ if err != nil {
+ t.Fatal("open error:", err)
+ }
+
+ defer func() {
+ err = db.Close()
+ if err != nil {
+ t.Error("db close error:", err)
+ }
+ }()
+
+ ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second)
+ err = db.PingContext(ctx)
+ cancel()
+ if err != nil {
+ t.Fatal("ping error:", err)
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "drop table foo")
+ cancel()
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "create table foo (id integer)")
+ cancel()
+ if err != nil {
+ t.Fatal("create table error:", err)
+ }
+
+ // copy db to new file
+ var data []byte
+ data, err = ioutil.ReadFile(tempFilename)
+ if err != nil {
+ t.Fatal("read file error:", err)
+ }
+
+ var f *os.File
+ f, err = os.Create(tempFilename + "-db-copy")
+ if err != nil {
+ t.Fatal("create file error:", err)
+ }
+
+ defer func() {
+ err = os.Remove(tempFilename + "-db-copy")
+ if err != nil {
+ t.Error("temp file moved remove error:", err)
+ }
+ }()
+
+ _, err = f.Write(data)
+ if err != nil {
+ f.Close()
+ t.Fatal("write file error:", err)
+ }
+ err = f.Close()
+ if err != nil {
+ t.Fatal("close file error:", err)
+ }
+
+ // truncate current db file
+ f, err = os.OpenFile(tempFilename, os.O_WRONLY|os.O_TRUNC, 0666)
+ if err != nil {
+ t.Fatal("open file error:", err)
+ }
+ err = f.Close()
+ if err != nil {
+ t.Fatal("close file error:", err)
+ }
+
+ // test db after file truncate
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ err = db.PingContext(ctx)
+ cancel()
+ if err != nil {
+ t.Fatal("ping error:", err)
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "drop table foo")
+ cancel()
+ if err == nil {
+ t.Fatal("drop table no error")
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "create table foo (id integer)")
+ cancel()
+ if err != nil {
+ t.Fatal("create table error:", err)
+ }
+
+ err = db.Close()
+ if err != nil {
+ t.Error("db close error:", err)
+ }
+
+ // test copied file
+ db, err = sql.Open("sqlite3", tempFilename+"-db-copy")
+ if err != nil {
+ t.Fatal("open error:", err)
+ }
+
+ defer func() {
+ err = db.Close()
+ if err != nil {
+ t.Error("db close error:", err)
+ }
+ }()
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ err = db.PingContext(ctx)
+ cancel()
+ if err != nil {
+ t.Fatal("ping error:", err)
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "drop table foo")
+ cancel()
+ if err != nil {
+ t.Fatal("drop table error:", err)
+ }
+
+ ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second)
+ _, err = db.ExecContext(ctx, "create table foo (id integer)")
+ cancel()
+ if err != nil {
+ t.Fatal("create table error:", err)
+ }
+}