test(spanner/spannertest): make ARRAY_AGG test work against real Spanner (#3067)
This now means the entire integration test passes against both real
Spanner and spannertest.
Also, dramatically speed up the integration test when it runs against
real Spanner (from ~137s to ~81s) by dropping existing tables
concurrently.
diff --git a/spanner/spannertest/integration_test.go b/spanner/spannertest/integration_test.go
index 6ee0d6f..adbe329 100644
--- a/spanner/spannertest/integration_test.go
+++ b/spanner/spannertest/integration_test.go
@@ -27,6 +27,7 @@
import (
"context"
"flag"
+ "fmt"
"reflect"
"sort"
"testing"
@@ -146,7 +147,9 @@
if err != nil {
t.Fatalf("Dropping old index: %v", err)
}
- dropTable(t, adminClient, tableName)
+ if err := dropTable(t, adminClient, tableName); err != nil {
+ t.Fatal(err)
+ }
err = updateDDL(t, adminClient,
`CREATE TABLE `+tableName+` (
FirstName STRING(20) NOT NULL,
@@ -404,14 +407,28 @@
defer cancel()
// Drop any old tables.
+ // Do them all concurrently; this saves a lot of time.
allTables := []string{
"Staff",
"PlayerStats",
"JoinA", "JoinB", "JoinC", "JoinD", "JoinE", "JoinF",
"SomeStrings",
}
+ errc := make(chan error)
for _, table := range allTables {
- dropTable(t, adminClient, table)
+ go func(table string) {
+ errc <- dropTable(t, adminClient, table)
+ }(table)
+ }
+ var bad bool
+ for range allTables {
+ if err := <-errc; err != nil {
+ t.Error(err)
+ bad = true
+ }
+ }
+ if bad {
+ t.FailNow()
}
err := updateDDL(t, adminClient,
@@ -861,8 +878,7 @@
},
},
{
- // TODO: This is broken against production; does not permit ORDER BY on something not grouped/aggregated.
- `SELECT ARRAY_AGG(Cool) FROM Staff ORDER BY Name`,
+ `SELECT ARRAY_AGG(Cool) FROM Staff`,
nil,
[][]interface{}{
// Daniel, George (NULL), Jack (NULL), Sam, Teal'c
@@ -1011,6 +1027,7 @@
}
var failures int
for _, test := range tests {
+ t.Logf("Testing query: %s", test.q)
stmt := spanner.NewStatement(test.q)
stmt.Params = test.params
@@ -1031,7 +1048,7 @@
}
}
-func dropTable(t *testing.T, adminClient *dbadmin.DatabaseAdminClient, table string) {
+func dropTable(t *testing.T, adminClient *dbadmin.DatabaseAdminClient, table string) error {
t.Helper()
err := updateDDL(t, adminClient, "DROP TABLE "+table)
// NotFound is an acceptable failure mode here.
@@ -1039,8 +1056,9 @@
err = nil
}
if err != nil {
- t.Fatalf("Dropping old table %q: %v", table, err)
+ return fmt.Errorf("dropping old table %q: %v", table, err)
}
+ return nil
}
func updateDDL(t *testing.T, adminClient *dbadmin.DatabaseAdminClient, statements ...string) error {