mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-21 13:03:09 -06:00
Add initial test for forward_async federation endpoint
This commit is contained in:
parent
efe28db631
commit
b9d5fd942f
24
federationapi/routing/forwardasync.go
Normal file
24
federationapi/routing/forwardasync.go
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
package routing
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/federationapi/api"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
"github.com/matrix-org/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ForwardAsync implements /_matrix/federation/v1/forward_async/{txnID}/{userID}
|
||||||
|
func ForwardAsync(
|
||||||
|
httpReq *http.Request,
|
||||||
|
fedReq *gomatrixserverlib.FederationRequest,
|
||||||
|
fedAPI api.FederationInternalAPI,
|
||||||
|
txnId gomatrixserverlib.TransactionID,
|
||||||
|
userID gomatrixserverlib.UserID,
|
||||||
|
) util.JSONResponse {
|
||||||
|
|
||||||
|
// TODO: wrap in fedAPI call
|
||||||
|
// fedAPI.db.AssociateAsyncTransactionWithDestinations(context.TODO(), userID, nil)
|
||||||
|
|
||||||
|
return util.JSONResponse{Code: 200}
|
||||||
|
}
|
||||||
64
federationapi/routing/forwardasync_test.go
Normal file
64
federationapi/routing/forwardasync_test.go
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
package routing_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
// "context"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/federationapi/internal"
|
||||||
|
"github.com/matrix-org/dendrite/federationapi/routing"
|
||||||
|
// "github.com/matrix-org/dendrite/federationapi/storage/shared"
|
||||||
|
// "github.com/matrix-org/dendrite/setup/config"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEmptyForwardReturnsOk(t *testing.T) {
|
||||||
|
httpReq := &http.Request{}
|
||||||
|
request := &gomatrixserverlib.FederationRequest{}
|
||||||
|
fedAPI := internal.FederationInternalAPI{}
|
||||||
|
userID, err := gomatrixserverlib.NewUserID("@local:domain", false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Invalid userID: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
response := routing.ForwardAsync(httpReq, request, &fedAPI, "1", *userID)
|
||||||
|
|
||||||
|
expected := 200
|
||||||
|
if response.Code != expected {
|
||||||
|
t.Fatalf("Expected: %v, Actual: %v", expected, response.Code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// func TestUniqueTransactionStoredInDatabase(t *testing.T) {
|
||||||
|
// db := shared.Database{}
|
||||||
|
// httpReq := &http.Request{}
|
||||||
|
// inputTransaction := gomatrixserverlib.Transaction{}
|
||||||
|
// request := &gomatrixserverlib.FederationRequest{}
|
||||||
|
// fedAPI := internal.NewFederationInternalAPI(
|
||||||
|
// &db, &config.FederationAPI{}, nil, nil, nil, nil, nil, nil,
|
||||||
|
// )
|
||||||
|
// userID, err := gomatrixserverlib.NewUserID("@local:domain", false)
|
||||||
|
// if err != nil {
|
||||||
|
// t.Fatalf("Invalid userID: %s", err.Error())
|
||||||
|
// }
|
||||||
|
|
||||||
|
// response := routing.ForwardAsync(httpReq, request, fedAPI, "1", *userID)
|
||||||
|
// transaction, err := db.GetAsyncTransaction(context.TODO(), *userID)
|
||||||
|
// transactionCount, err := db.GetAsyncTransactionCount(context.TODO(), *userID)
|
||||||
|
|
||||||
|
// expected := 200
|
||||||
|
// if response.Code != expected {
|
||||||
|
// t.Fatalf("Expected Return Code: %v, Actual: %v", expected, response.Code)
|
||||||
|
// }
|
||||||
|
// if transactionCount != 1 {
|
||||||
|
// t.Fatalf("Expected count of 1, Actual: %d", transactionCount)
|
||||||
|
// }
|
||||||
|
// if transaction.TransactionID != inputTransaction.TransactionID {
|
||||||
|
// t.Fatalf("Expected Transaction ID: %s, Actual: %s",
|
||||||
|
// inputTransaction.TransactionID, transaction.TransactionID)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func TestDuplicateTransactionNotStoredInDatabase(t *testing.T) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
@ -51,6 +51,10 @@ type Database interface {
|
||||||
GetPendingPDUServerNames(ctx context.Context) ([]gomatrixserverlib.ServerName, error)
|
GetPendingPDUServerNames(ctx context.Context) ([]gomatrixserverlib.ServerName, error)
|
||||||
GetPendingEDUServerNames(ctx context.Context) ([]gomatrixserverlib.ServerName, error)
|
GetPendingEDUServerNames(ctx context.Context) ([]gomatrixserverlib.ServerName, error)
|
||||||
|
|
||||||
|
GetAsyncTransaction(ctx context.Context, userID gomatrixserverlib.UserID) (gomatrixserverlib.Transaction, error)
|
||||||
|
GetAsyncTransactionCount(ctx context.Context, userID gomatrixserverlib.UserID) (int64, error)
|
||||||
|
AssociateAsyncTransactionWithDestinations(ctx context.Context, destinations map[gomatrixserverlib.UserID]struct{}, receipt *shared.Receipt) error
|
||||||
|
|
||||||
// these don't have contexts passed in as we want things to happen regardless of the request context
|
// these don't have contexts passed in as we want things to happen regardless of the request context
|
||||||
AddServerToBlacklist(serverName gomatrixserverlib.ServerName) error
|
AddServerToBlacklist(serverName gomatrixserverlib.ServerName) error
|
||||||
RemoveServerFromBlacklist(serverName gomatrixserverlib.ServerName) error
|
RemoveServerFromBlacklist(serverName gomatrixserverlib.ServerName) error
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,11 @@ import (
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type transactionEntry struct {
|
||||||
|
transaction gomatrixserverlib.Transaction
|
||||||
|
userID []gomatrixserverlib.UserID
|
||||||
|
}
|
||||||
|
|
||||||
type Database struct {
|
type Database struct {
|
||||||
DB *sql.DB
|
DB *sql.DB
|
||||||
IsLocalServerName func(gomatrixserverlib.ServerName) bool
|
IsLocalServerName func(gomatrixserverlib.ServerName) bool
|
||||||
|
|
@ -42,6 +47,7 @@ type Database struct {
|
||||||
NotaryServerKeysJSON tables.FederationNotaryServerKeysJSON
|
NotaryServerKeysJSON tables.FederationNotaryServerKeysJSON
|
||||||
NotaryServerKeysMetadata tables.FederationNotaryServerKeysMetadata
|
NotaryServerKeysMetadata tables.FederationNotaryServerKeysMetadata
|
||||||
ServerSigningKeys tables.FederationServerSigningKeys
|
ServerSigningKeys tables.FederationServerSigningKeys
|
||||||
|
transactionDB map[Receipt]transactionEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
// An Receipt contains the NIDs of a call to GetNextTransactionPDUs/EDUs.
|
// An Receipt contains the NIDs of a call to GetNextTransactionPDUs/EDUs.
|
||||||
|
|
@ -257,3 +263,42 @@ func (d *Database) GetNotaryKeys(
|
||||||
})
|
})
|
||||||
return sks, err
|
return sks, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Database) AssociateAsyncTransactionWithDestinations(
|
||||||
|
ctx context.Context,
|
||||||
|
destinations map[gomatrixserverlib.UserID]struct{},
|
||||||
|
receipt *Receipt,
|
||||||
|
) error {
|
||||||
|
if transaction, ok := d.transactionDB[*receipt]; ok {
|
||||||
|
for k := range destinations {
|
||||||
|
transaction.userID = append(transaction.userID, k)
|
||||||
|
}
|
||||||
|
d.transactionDB[*receipt] = transaction
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("No transactions exist with that NID")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Database) GetAsyncTransaction(
|
||||||
|
ctx context.Context,
|
||||||
|
userID gomatrixserverlib.UserID,
|
||||||
|
) (gomatrixserverlib.Transaction, error) {
|
||||||
|
return gomatrixserverlib.Transaction{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Database) GetAsyncTransactionCount(
|
||||||
|
ctx context.Context,
|
||||||
|
userID gomatrixserverlib.UserID,
|
||||||
|
) (int64, error) {
|
||||||
|
count := int64(0)
|
||||||
|
for _, transaction := range d.transactionDB {
|
||||||
|
for _, user := range transaction.userID {
|
||||||
|
if user == userID {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue