//go:build !libsqlite3 || sqlite_serialize // +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 any) 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 any) 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") } }