From 05e956f9dda91639305da4d178d49b2cd6c209f7 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Thu, 10 Dec 2020 17:17:02 +0000 Subject: [PATCH] Update types, sytest-whitelist --- syncapi/types/types.go | 36 +++++++++++++++++++++++++----------- syncapi/types/types_test.go | 36 ++++++++++++++++++------------------ sytest-whitelist | 1 + 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/syncapi/types/types.go b/syncapi/types/types.go index cdd9409b8..70eab8fbf 100644 --- a/syncapi/types/types.go +++ b/syncapi/types/types.go @@ -128,7 +128,7 @@ func (t *StreamingToken) Log(name string) *LogPosition { return l } -func (t *StreamingToken) String() string { +func (t StreamingToken) String() string { posStr := fmt.Sprintf( "s%d_%d_%d_%d", t.PDUPosition, t.TypingPosition, @@ -201,17 +201,16 @@ func (t *StreamingToken) WithUpdates(other StreamingToken) (ret StreamingToken) } type TopologyToken struct { - Depth StreamPosition - PDUPosition StreamPosition - ReceiptPosition StreamPosition + Depth StreamPosition + PDUPosition StreamPosition } func (t *TopologyToken) StreamToken() StreamingToken { - return NewStreamToken(t.PDUPosition, 0, t.ReceiptPosition, 0, nil) + return NewStreamToken(t.PDUPosition, 0, 0, 0, nil) } -func (t *TopologyToken) String() string { - return fmt.Sprintf("t%d_%d_%d", t.Depth, t.PDUPosition, t.ReceiptPosition) +func (t TopologyToken) String() string { + return fmt.Sprintf("t%d_%d", t.Depth, t.PDUPosition) } // Decrement the topology token to one event earlier. @@ -248,24 +247,31 @@ func NewTopologyToken(depth, pduPos StreamPosition) TopologyToken { } func NewTopologyTokenFromString(tok string) (token TopologyToken, err error) { + if len(tok) < 1 { + err = fmt.Errorf("empty topology token") + return + } if tok[0] != SyncTokenTypeTopology[0] { err = fmt.Errorf("topology token must start with 't'") return } parts := strings.Split(tok[1:], "_") - var positions [3]StreamPosition + var positions [2]StreamPosition for i, p := range parts { if i > len(positions) { break } + if len(p) == 0 { + err = fmt.Errorf("empty position %d not allowed", i) + return + } if pos, perr := strconv.Atoi(p); perr == nil { positions[i] = StreamPosition(pos) } } token = TopologyToken{ - Depth: positions[0], - PDUPosition: positions[1], - ReceiptPosition: positions[2], + Depth: positions[0], + PDUPosition: positions[1], } return } @@ -288,6 +294,10 @@ func NewStreamToken( } func NewStreamTokenFromString(tok string) (token StreamingToken, err error) { + if len(tok) < 1 { + err = fmt.Errorf("empty stream token") + return + } if tok[0] != SyncTokenTypeStream[0] { err = fmt.Errorf("stream token must start with 's'") return @@ -299,6 +309,10 @@ func NewStreamTokenFromString(tok string) (token StreamingToken, err error) { if i > len(positions) { break } + if len(p) == 0 { + err = fmt.Errorf("empty position %d not allowed", i) + return + } if pos, perr := strconv.Atoi(p); perr == nil { positions[i] = StreamPosition(pos) } diff --git a/syncapi/types/types_test.go b/syncapi/types/types_test.go index dae3526ec..419d46ec0 100644 --- a/syncapi/types/types_test.go +++ b/syncapi/types/types_test.go @@ -56,17 +56,22 @@ func TestNewSyncTokenWithLogs(t *testing.T) { } } -/* -func TestNewSyncTokenFromString(t *testing.T) { - shouldPass := map[string]syncToken{ - "s4_0": NewStreamToken(4, 0, nil).syncToken, - "s3_1": NewStreamToken(3, 1, nil).syncToken, - "t3_1": NewTopologyToken(3, 1).syncToken, +func TestSyncTokens(t *testing.T) { + shouldPass := map[string]string{ + "s4_0_0_0": NewStreamToken(4, 0, 0, 0, nil).String(), + "s3_1_0_0": NewStreamToken(3, 1, 0, 0, nil).String(), + "s3_1_2_3": NewStreamToken(3, 1, 2, 3, nil).String(), + "t3_1": NewTopologyToken(3, 1).String(), + } + + for a, b := range shouldPass { + if a != b { + t.Errorf("expected %q, got %q", a, b) + } } shouldFail := []string{ "", - "s_1", "s_", "a3_4", "b", @@ -75,23 +80,18 @@ func TestNewSyncTokenFromString(t *testing.T) { "2", } - for test, expected := range shouldPass { - result, _, err := newSyncTokenFromString(test) - if err != nil { - t.Error(err) - } - if result.String() != expected.String() { - t.Errorf("%s expected %v but got %v", test, expected.String(), result.String()) + for _, f := range append(shouldFail, "t1_2") { + if _, err := NewStreamTokenFromString(f); err == nil { + t.Errorf("NewStreamTokenFromString %q should have failed", f) } } - for _, test := range shouldFail { - if _, _, err := newSyncTokenFromString(test); err == nil { - t.Errorf("input '%v' should have errored but didn't", test) + for _, f := range append(shouldFail, "s1_2_3_4") { + if _, err := NewTopologyTokenFromString(f); err == nil { + t.Errorf("NewTopologyTokenFromString %q should have failed", f) } } } -*/ func TestNewInviteResponse(t *testing.T) { event := `{"auth_events":["$SbSsh09j26UAXnjd3RZqf2lyA3Kw2sY_VZJVZQAV9yA","$EwL53onrLwQ5gL8Dv3VrOOCvHiueXu2ovLdzqkNi3lo","$l2wGmz9iAwevBDGpHT_xXLUA5O8BhORxWIGU1cGi1ZM","$GsWFJLXgdlF5HpZeyWkP72tzXYWW3uQ9X28HBuTztHE"],"content":{"avatar_url":"","displayname":"neilalexander","membership":"invite"},"depth":9,"hashes":{"sha256":"8p+Ur4f8vLFX6mkIXhxI0kegPG7X3tWy56QmvBkExAg"},"origin":"matrix.org","origin_server_ts":1602087113066,"prev_events":["$1v-O6tNwhOZcA8bvCYY-Dnj1V2ZDE58lLPxtlV97S28"],"prev_state":[],"room_id":"!XbeXirGWSPXbEaGokF:matrix.org","sender":"@neilalexander:matrix.org","signatures":{"dendrite.neilalexander.dev":{"ed25519:BMJi":"05KQ5lPw0cSFsE4A0x1z7vi/3cc8bG4WHUsFWYkhxvk/XkXMGIYAYkpNThIvSeLfdcHlbm/k10AsBSKH8Uq4DA"},"matrix.org":{"ed25519:a_RXGa":"jeovuHr9E/x0sHbFkdfxDDYV/EyoeLi98douZYqZ02iYddtKhfB7R3WLay/a+D3V3V7IW0FUmPh/A404x5sYCw"}},"state_key":"@neilalexander:dendrite.neilalexander.dev","type":"m.room.member","unsigned":{"age":2512,"invite_room_state":[{"content":{"join_rule":"invite"},"sender":"@neilalexander:matrix.org","state_key":"","type":"m.room.join_rules"},{"content":{"avatar_url":"mxc://matrix.org/BpDaozLwgLnlNStxDxvLzhPr","displayname":"neilalexander","membership":"join"},"sender":"@neilalexander:matrix.org","state_key":"@neilalexander:matrix.org","type":"m.room.member"},{"content":{"name":"Test room"},"sender":"@neilalexander:matrix.org","state_key":"","type":"m.room.name"}]},"_room_version":"5"}` diff --git a/sytest-whitelist b/sytest-whitelist index da4b201ce..eb1634367 100644 --- a/sytest-whitelist +++ b/sytest-whitelist @@ -503,3 +503,4 @@ Forgetting room does not show up in v2 /sync Can forget room you've been kicked from /whois /joined_members return joined members +A next_batch token can be used in the v1 messages API