aboutsummaryrefslogtreecommitdiff
path: root/sqlite3_go18_test.go
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2019-06-20 10:01:18 +0900
committerGitHub <noreply@github.com>2019-06-20 10:01:18 +0900
commit5dd71670cca4bc0ee90371eabd0f1bdba1ac6f35 (patch)
tree543c80d0195a740c44ca4e560435158e98f91665 /sqlite3_go18_test.go
parentMerge pull request #725 from auxten/patch-1 (diff)
parentUpdated Ping to return ErrBadConn (diff)
downloadgolite-5dd71670cca4bc0ee90371eabd0f1bdba1ac6f35.tar.gz
golite-5dd71670cca4bc0ee90371eabd0f1bdba1ac6f35.tar.xz
Merge pull request #727 from MichaelS11/master
Updated Ping and doTestOpen. Added TestOpenContext and TestFileCopyTruncate
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)
+ }
+}