aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorkegsay <kegan@matrix.org>2022-05-09 17:23:02 +0100
committerGitHub <noreply@github.com>2022-05-09 17:23:02 +0100
commit236b16aa6c97bc0894388dce7f6b420ef7a1fd88 (patch)
tree9b9879b068eb45541730da203d75fed0631800d1 /test
parenta443d1e5f3796942f68067741f4bdd482548bfd7 (diff)
Begin adding syncapi component tests (#2442)
* Add very basic syncapi tests * Add a way to inject jetstream messages * implement add_state_ids * bugfixes * Unbreak tests * Remove now un-needed API call * Linting
Diffstat (limited to 'test')
-rw-r--r--test/base.go72
-rw-r--r--test/http.go45
-rw-r--r--test/jetstream.go35
3 files changed, 152 insertions, 0 deletions
diff --git a/test/base.go b/test/base.go
index 32fc8dc5..664442c0 100644
--- a/test/base.go
+++ b/test/base.go
@@ -1,11 +1,83 @@
+// Copyright 2022 The Matrix.org Foundation C.I.C.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package test
import (
+ "errors"
+ "fmt"
+ "io/fs"
+ "os"
+ "strings"
+ "testing"
+
"github.com/matrix-org/dendrite/setup/base"
"github.com/matrix-org/dendrite/setup/config"
"github.com/nats-io/nats.go"
)
+func CreateBaseDendrite(t *testing.T, dbType DBType) (*base.BaseDendrite, func()) {
+ var cfg config.Dendrite
+ cfg.Defaults(false)
+ cfg.Global.JetStream.InMemory = true
+
+ switch dbType {
+ case DBTypePostgres:
+ cfg.Global.Defaults(true) // autogen a signing key
+ cfg.MediaAPI.Defaults(true) // autogen a media path
+ // use a distinct prefix else concurrent postgres/sqlite runs will clash since NATS will use
+ // the file system event with InMemory=true :(
+ cfg.Global.JetStream.TopicPrefix = fmt.Sprintf("Test_%d_", dbType)
+ connStr, close := PrepareDBConnectionString(t, dbType)
+ cfg.Global.DatabaseOptions = config.DatabaseOptions{
+ ConnectionString: config.DataSource(connStr),
+ MaxOpenConnections: 10,
+ MaxIdleConnections: 2,
+ ConnMaxLifetimeSeconds: 60,
+ }
+ return base.NewBaseDendrite(&cfg, "Test", base.DisableMetrics), close
+ case DBTypeSQLite:
+ cfg.Defaults(true) // sets a sqlite db per component
+ // use a distinct prefix else concurrent postgres/sqlite runs will clash since NATS will use
+ // the file system event with InMemory=true :(
+ cfg.Global.JetStream.TopicPrefix = fmt.Sprintf("Test_%d_", dbType)
+ return base.NewBaseDendrite(&cfg, "Test", base.DisableMetrics), func() {
+ // cleanup db files. This risks getting out of sync as we add more database strings :(
+ dbFiles := []config.DataSource{
+ cfg.AppServiceAPI.Database.ConnectionString,
+ cfg.FederationAPI.Database.ConnectionString,
+ cfg.KeyServer.Database.ConnectionString,
+ cfg.MSCs.Database.ConnectionString,
+ cfg.MediaAPI.Database.ConnectionString,
+ cfg.RoomServer.Database.ConnectionString,
+ cfg.SyncAPI.Database.ConnectionString,
+ cfg.UserAPI.AccountDatabase.ConnectionString,
+ }
+ for _, fileURI := range dbFiles {
+ path := strings.TrimPrefix(string(fileURI), "file:")
+ err := os.Remove(path)
+ if err != nil && !errors.Is(err, fs.ErrNotExist) {
+ t.Fatalf("failed to cleanup sqlite db '%s': %s", fileURI, err)
+ }
+ }
+ }
+ default:
+ t.Fatalf("unknown db type: %v", dbType)
+ }
+ return nil, nil
+}
+
func Base(cfg *config.Dendrite) (*base.BaseDendrite, nats.JetStreamContext, *nats.Conn) {
if cfg == nil {
cfg = &config.Dendrite{}
diff --git a/test/http.go b/test/http.go
new file mode 100644
index 00000000..a458a338
--- /dev/null
+++ b/test/http.go
@@ -0,0 +1,45 @@
+package test
+
+import (
+ "bytes"
+ "encoding/json"
+ "io"
+ "net/http"
+ "net/url"
+ "testing"
+)
+
+type HTTPRequestOpt func(req *http.Request)
+
+func WithJSONBody(t *testing.T, body interface{}) HTTPRequestOpt {
+ t.Helper()
+ b, err := json.Marshal(body)
+ if err != nil {
+ t.Fatalf("WithJSONBody: %s", err)
+ }
+ return func(req *http.Request) {
+ req.Body = io.NopCloser(bytes.NewBuffer(b))
+ }
+}
+
+func WithQueryParams(qps map[string]string) HTTPRequestOpt {
+ var vals url.Values = map[string][]string{}
+ for k, v := range qps {
+ vals.Set(k, v)
+ }
+ return func(req *http.Request) {
+ req.URL.RawQuery = vals.Encode()
+ }
+}
+
+func NewRequest(t *testing.T, method, path string, opts ...HTTPRequestOpt) *http.Request {
+ t.Helper()
+ req, err := http.NewRequest(method, "http://localhost"+path, nil)
+ if err != nil {
+ t.Fatalf("failed to make new HTTP request %v %v : %v", method, path, err)
+ }
+ for _, o := range opts {
+ o(req)
+ }
+ return req
+}
diff --git a/test/jetstream.go b/test/jetstream.go
new file mode 100644
index 00000000..488c22be
--- /dev/null
+++ b/test/jetstream.go
@@ -0,0 +1,35 @@
+package test
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/matrix-org/dendrite/roomserver/api"
+ "github.com/matrix-org/dendrite/setup/base"
+ "github.com/matrix-org/dendrite/setup/jetstream"
+ "github.com/nats-io/nats.go"
+)
+
+func MustPublishMsgs(t *testing.T, jsctx nats.JetStreamContext, msgs ...*nats.Msg) {
+ t.Helper()
+ for _, msg := range msgs {
+ if _, err := jsctx.PublishMsg(msg); err != nil {
+ t.Fatalf("MustPublishMsgs: failed to publish message: %s", err)
+ }
+ }
+}
+
+func NewOutputEventMsg(t *testing.T, base *base.BaseDendrite, roomID string, update api.OutputEvent) *nats.Msg {
+ t.Helper()
+ msg := &nats.Msg{
+ Subject: base.Cfg.Global.JetStream.Prefixed(jetstream.OutputRoomEvent),
+ Header: nats.Header{},
+ }
+ msg.Header.Set(jetstream.RoomID, roomID)
+ var err error
+ msg.Data, err = json.Marshal(update)
+ if err != nil {
+ t.Fatalf("failed to marshal update: %s", err)
+ }
+ return msg
+}