aboutsummaryrefslogtreecommitdiff
path: root/syncapi/storage/tables/topology_test.go
diff options
context:
space:
mode:
authorkegsay <kegan@matrix.org>2022-04-08 17:53:24 +0100
committerGitHub <noreply@github.com>2022-04-08 17:53:24 +0100
commit6d25bd6ca57f518404000c47d69bcbfadb4fd2ef (patch)
tree14246daf0644ccbafd255b930887695382bbe8f8 /syncapi/storage/tables/topology_test.go
parent986d27a1287e9d86fe16a6152f2457657513a6dd (diff)
syncapi: add more tests; fix more bugs (#2338)
* syncapi: add more tests; fix more bugs bugfixes: - The postgres impl of TopologyTable.SelectEventIDsInRange did not use the provided txn - The postgres impl of EventsTable.SelectEvents did not preserve the ordering of the input event IDs in the output events slice - The sqlite impl of EventsTable.SelectEvents did not use a bulk `IN ($1)` query. Added tests: - `TestGetEventsInRangeWithTopologyToken` - `TestOutputRoomEventsTable` - `TestTopologyTable` * -p 1 for now
Diffstat (limited to 'syncapi/storage/tables/topology_test.go')
-rw-r--r--syncapi/storage/tables/topology_test.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/syncapi/storage/tables/topology_test.go b/syncapi/storage/tables/topology_test.go
new file mode 100644
index 00000000..b6ece0b0
--- /dev/null
+++ b/syncapi/storage/tables/topology_test.go
@@ -0,0 +1,91 @@
+package tables_test
+
+import (
+ "context"
+ "database/sql"
+ "fmt"
+ "testing"
+
+ "github.com/matrix-org/dendrite/internal/sqlutil"
+ "github.com/matrix-org/dendrite/setup/config"
+ "github.com/matrix-org/dendrite/syncapi/storage/postgres"
+ "github.com/matrix-org/dendrite/syncapi/storage/sqlite3"
+ "github.com/matrix-org/dendrite/syncapi/storage/tables"
+ "github.com/matrix-org/dendrite/syncapi/types"
+ "github.com/matrix-org/dendrite/test"
+)
+
+func newTopologyTable(t *testing.T, dbType test.DBType) (tables.Topology, *sql.DB, func()) {
+ t.Helper()
+ connStr, close := test.PrepareDBConnectionString(t, dbType)
+ db, err := sqlutil.Open(&config.DatabaseOptions{
+ ConnectionString: config.DataSource(connStr),
+ })
+ if err != nil {
+ t.Fatalf("failed to open db: %s", err)
+ }
+
+ var tab tables.Topology
+ switch dbType {
+ case test.DBTypePostgres:
+ tab, err = postgres.NewPostgresTopologyTable(db)
+ case test.DBTypeSQLite:
+ tab, err = sqlite3.NewSqliteTopologyTable(db)
+ }
+ if err != nil {
+ t.Fatalf("failed to make new table: %s", err)
+ }
+ return tab, db, close
+}
+
+func TestTopologyTable(t *testing.T) {
+ ctx := context.Background()
+ alice := test.NewUser()
+ room := test.NewRoom(t, alice)
+ test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
+ tab, db, close := newTopologyTable(t, dbType)
+ defer close()
+ events := room.Events()
+ err := sqlutil.WithTransaction(db, func(txn *sql.Tx) error {
+ var highestPos types.StreamPosition
+ for i, ev := range events {
+ topoPos, err := tab.InsertEventInTopology(ctx, txn, ev, types.StreamPosition(i))
+ if err != nil {
+ return fmt.Errorf("failed to InsertEventInTopology: %s", err)
+ }
+ // topo pos = depth, depth starts at 1, hence 1+i
+ if topoPos != types.StreamPosition(1+i) {
+ return fmt.Errorf("got topo pos %d want %d", topoPos, 1+i)
+ }
+ highestPos = topoPos + 1
+ }
+ // check ordering works without limit
+ eventIDs, err := tab.SelectEventIDsInRange(ctx, txn, room.ID, 0, highestPos, highestPos, 100, true)
+ if err != nil {
+ return fmt.Errorf("failed to SelectEventIDsInRange: %s", err)
+ }
+ test.AssertEventIDsEqual(t, eventIDs, events[:])
+ eventIDs, err = tab.SelectEventIDsInRange(ctx, txn, room.ID, 0, highestPos, highestPos, 100, false)
+ if err != nil {
+ return fmt.Errorf("failed to SelectEventIDsInRange: %s", err)
+ }
+ test.AssertEventIDsEqual(t, eventIDs, test.Reversed(events[:]))
+ // check ordering works with limit
+ eventIDs, err = tab.SelectEventIDsInRange(ctx, txn, room.ID, 0, highestPos, highestPos, 3, true)
+ if err != nil {
+ return fmt.Errorf("failed to SelectEventIDsInRange: %s", err)
+ }
+ test.AssertEventIDsEqual(t, eventIDs, events[:3])
+ eventIDs, err = tab.SelectEventIDsInRange(ctx, txn, room.ID, 0, highestPos, highestPos, 3, false)
+ if err != nil {
+ return fmt.Errorf("failed to SelectEventIDsInRange: %s", err)
+ }
+ test.AssertEventIDsEqual(t, eventIDs, test.Reversed(events[len(events)-3:]))
+
+ return nil
+ })
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+ })
+}