mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 11:23:11 -06:00
153 lines
3.5 KiB
Go
153 lines
3.5 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/matrix-org/dendrite/roomserver/api"
|
|
"github.com/matrix-org/gomatrixserverlib"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var dataSource string
|
|
var insideCi = false
|
|
var insideDocker = false
|
|
|
|
const dbName = "dendrite_syncapi"
|
|
|
|
func init() {
|
|
for _, val := range os.Environ() {
|
|
tokens := strings.Split(val, "=")
|
|
if tokens[0] == "CI" && tokens[1] == "true" {
|
|
insideCi = true
|
|
}
|
|
}
|
|
if !insideCi {
|
|
if _, err := os.Open("/.dockerenv"); err == nil {
|
|
insideDocker = true
|
|
}
|
|
}
|
|
|
|
if insideCi {
|
|
dataSource = fmt.Sprintf("postgres://postgres@localhost/%s?sslmode=disable", dbName)
|
|
} else if insideDocker {
|
|
dataSource = fmt.Sprintf("postgres://dendrite:itsasecret@postgres/%s?sslmode=disable", dbName)
|
|
} else {
|
|
dataSource = fmt.Sprintf("postgres://dendrite:itsasecret@localhost:15432/%s?sslmode=disable", dbName)
|
|
}
|
|
|
|
if insideCi {
|
|
database := "dendrite_syncapi"
|
|
cmd := exec.Command("psql", "postgres")
|
|
cmd.Stdin = strings.NewReader(
|
|
fmt.Sprintf("DROP DATABASE IF EXISTS %s; CREATE DATABASE %s;", database, database),
|
|
)
|
|
// Send stdout and stderr to our stderr so that we see error messages from
|
|
// the psql process
|
|
cmd.Stdout = os.Stderr
|
|
cmd.Stderr = os.Stderr
|
|
_ = cmd.Run()
|
|
}
|
|
}
|
|
|
|
const testEventID = "$test-event-id:test-domain.example.com"
|
|
|
|
func Test_sanityCheckOutputRoomEvents(t *testing.T) {
|
|
db, err := NewSyncServerDatasource(dataSource)
|
|
assert.Nil(t, err)
|
|
|
|
err = db.events.prepare(db.db)
|
|
assert.Nil(t, err)
|
|
|
|
truncateTable(t, db)
|
|
insertTestEvent(t, db)
|
|
selectTestEvent(t, db)
|
|
truncateTable(t, db)
|
|
}
|
|
|
|
func TestSyncServerDatasource_selectEventsWithEventIDs(t *testing.T) {
|
|
db, err := NewSyncServerDatasource(dataSource)
|
|
assert.Nil(t, err)
|
|
truncateTable(t, db)
|
|
insertTestEvent(t, db)
|
|
ctx := context.Background()
|
|
txn, err := db.db.Begin()
|
|
assert.Nil(t, err)
|
|
|
|
var eventIDs = []string{testEventID}
|
|
events, err := db.fetchMissingStateEvents(ctx, txn, eventIDs)
|
|
assert.Nil(t, err)
|
|
assert.NotNil(t, events)
|
|
assert.Condition(t, func() bool {
|
|
return len(events) > 0
|
|
})
|
|
|
|
err = txn.Commit()
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func insertTestEvent(t *testing.T, db *SyncServerDatasource) {
|
|
txn, err := db.db.Begin()
|
|
assert.Nil(t, err)
|
|
|
|
keyBytes := []byte("1122334455667788112233445566778811223344556677881122334455667788")
|
|
eventBuilder := gomatrixserverlib.EventBuilder{
|
|
RoomID: "!test_room_id:test-domain.example.com",
|
|
Content: []byte(`{"RawContent": "test-raw-content"}`),
|
|
Sender: "@test-user:test-domain.example.com",
|
|
}
|
|
event, err := eventBuilder.Build(
|
|
testEventID,
|
|
time.Now(),
|
|
"test-domain.example.com",
|
|
"test-key-id",
|
|
keyBytes)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
var addState, removeState []string
|
|
transactionID := api.TransactionID{
|
|
SessionID: 0x11223344,
|
|
TransactionID: "test-transaction-id",
|
|
}
|
|
|
|
newEventID, err := db.events.insertEvent(
|
|
context.Background(),
|
|
txn,
|
|
&event,
|
|
addState,
|
|
removeState,
|
|
&transactionID)
|
|
|
|
assert.Nil(t, err)
|
|
err = txn.Commit()
|
|
assert.Nil(t, err)
|
|
|
|
assert.Condition(t, func() bool {
|
|
return newEventID > 0
|
|
})
|
|
}
|
|
|
|
func selectTestEvent(t *testing.T, db *SyncServerDatasource) {
|
|
ctx := context.Background()
|
|
|
|
var eventIDs = []string{testEventID}
|
|
res, err := db.Events(ctx, eventIDs)
|
|
assert.Nil(t, err)
|
|
assert.NotNil(t, res)
|
|
|
|
assert.Condition(t, func() bool {
|
|
return len(res) > 0
|
|
})
|
|
}
|
|
|
|
func truncateTable(t *testing.T, db *SyncServerDatasource) {
|
|
_, err := db.db.Exec("TRUNCATE syncapi_output_room_events")
|
|
assert.Nil(t, err)
|
|
}
|