diff options
Diffstat (limited to 'sqlite3_opt_serialize_test.go')
-rw-r--r-- | sqlite3_opt_serialize_test.go | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/sqlite3_opt_serialize_test.go b/sqlite3_opt_serialize_test.go new file mode 100644 index 0000000..624c5a9 --- /dev/null +++ b/sqlite3_opt_serialize_test.go @@ -0,0 +1,99 @@ +// +build !libsqlite3 sqlite_serialize + +package sqlite3 + +import ( + "context" + "database/sql" + "os" + "testing" +) + +func TestSerializeDeserialize(t *testing.T) { + // Connect to the source database. + srcTempFilename := TempFilename(t) + defer os.Remove(srcTempFilename) + srcDb, err := sql.Open(driverName, srcTempFilename) + if err != nil { + t.Fatal("Failed to open the source database:", err) + } + defer srcDb.Close() + err = srcDb.Ping() + if err != nil { + t.Fatal("Failed to connect to the source database:", err) + } + + // Connect to the destination database. + destTempFilename := TempFilename(t) + defer os.Remove(destTempFilename) + destDb, err := sql.Open(driverName, destTempFilename) + if err != nil { + t.Fatal("Failed to open the destination database:", err) + } + defer destDb.Close() + err = destDb.Ping() + if err != nil { + t.Fatal("Failed to connect to the destination database:", err) + } + + // Write data to source database. + _, err = srcDb.Exec(`CREATE TABLE foo (name string)`) + if err != nil { + t.Fatal("Failed to create table in source database:", err) + } + _, err = srcDb.Exec(`INSERT INTO foo(name) VALUES("alice")`) + if err != nil { + t.Fatal("Failed to insert data into source database", err) + } + + // Serialize the source database + srcConn, err := srcDb.Conn(context.Background()) + if err != nil { + t.Fatal("Failed to get connection to source database:", err) + } + defer srcConn.Close() + + var serialized []byte + if err := srcConn.Raw(func(raw interface{}) error { + var err error + serialized, err = raw.(*SQLiteConn).Serialize("") + return err + }); err != nil { + t.Fatal("Failed to serialize source database:", err) + } + srcConn.Close() + + // Confirm that the destination database is initially empty. + var destTableCount int + err = destDb.QueryRow("SELECT COUNT(*) FROM sqlite_master WHERE type = 'table'").Scan(&destTableCount) + if err != nil { + t.Fatal("Failed to check the destination table count:", err) + } + if destTableCount != 0 { + t.Fatalf("The destination database is not empty; %v table(s) found.", destTableCount) + } + + // Deserialize to destination database + destConn, err := destDb.Conn(context.Background()) + if err != nil { + t.Fatal("Failed to get connection to destination database:", err) + } + defer destConn.Close() + + if err := destConn.Raw(func(raw interface{}) error { + return raw.(*SQLiteConn).Deserialize(serialized, "") + }); err != nil { + t.Fatal("Failed to deserialize source database:", err) + } + destConn.Close() + + // Confirm that destination database has been loaded correctly. + var destRowCount int + err = destDb.QueryRow(`SELECT COUNT(*) FROM foo`).Scan(&destRowCount) + if err != nil { + t.Fatal("Failed to count rows in destination database table", err) + } + if destRowCount != 1 { + t.Fatalf("Destination table does not have the expected records") + } +} |