feat(protocol): negotiate display and native input
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package protocol_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -22,6 +23,83 @@ func TestManifestRejectsForbiddenAndUnknownFields(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDisplayModeIsOptionalStrictAndBounded(t *testing.T) {
|
||||
displayType := reflect.TypeOf(protocol.DisplayMode{})
|
||||
for _, field := range []struct {
|
||||
owner reflect.Type
|
||||
name string
|
||||
}{
|
||||
{reflect.TypeOf(protocol.SessionRequest{}), "RequestedDisplayMode"},
|
||||
{reflect.TypeOf(protocol.BrokerSession{}), "RequestedDisplayMode"},
|
||||
{reflect.TypeOf(protocol.BrokerSession{}), "EffectiveDisplayMode"},
|
||||
{reflect.TypeOf(protocol.ManifestProfile{}), "DisplayMode"},
|
||||
} {
|
||||
actual, ok := field.owner.FieldByName(field.name)
|
||||
if !ok || actual.Type.Kind() != reflect.Pointer || actual.Type.Elem() != displayType {
|
||||
t.Fatalf("%s.%s must be *DisplayMode, got %v", field.owner, field.name, actual.Type)
|
||||
}
|
||||
}
|
||||
|
||||
request := protocol.SessionRequest{
|
||||
ClientDeviceID: "device-1", DeviceKeyID: "key-1", PoolID: "pool-1", IdempotencyKey: "request-1",
|
||||
PolicySnapshot: protocol.AllocationPolicy{
|
||||
MinimumKbps: 1000, TargetKbps: 2000, MaximumKbps: 3000, Tier: "standard",
|
||||
Audience: "versevdi-gateway", Protocol: "verse", ProtocolVersion: 1,
|
||||
GrantTTLSeconds: 60, ReservationLeaseSeconds: 300,
|
||||
},
|
||||
}
|
||||
legacy, err := protocol.EncodeSessionRequest(request)
|
||||
if err != nil {
|
||||
t.Fatalf("EncodeSessionRequest legacy request: %v", err)
|
||||
}
|
||||
if bytes.Contains(legacy, []byte("requested_display_mode")) {
|
||||
t.Fatalf("legacy request disclosed an absent display mode: %s", legacy)
|
||||
}
|
||||
|
||||
mode := protocol.DisplayMode{ResolutionWidth: 2560, ResolutionHeight: 1440, Fps: 120}
|
||||
request.RequestedDisplayMode = &mode
|
||||
aware, err := protocol.EncodeSessionRequest(request)
|
||||
if err != nil || !bytes.Contains(aware, []byte(`"requested_display_mode":{"resolution_width":2560,"resolution_height":1440,"fps":120}`)) {
|
||||
t.Fatalf("display-aware request = %s, err = %v", aware, err)
|
||||
}
|
||||
decoded, err := protocol.DecodeSessionRequest(aware)
|
||||
if err != nil || decoded.RequestedDisplayMode == nil || *decoded.RequestedDisplayMode != mode {
|
||||
t.Fatalf("DecodeSessionRequest display mode = %+v, err = %v", decoded.RequestedDisplayMode, err)
|
||||
}
|
||||
nullMode := bytes.Replace(aware, []byte(`{"resolution_width":2560,"resolution_height":1440,"fps":120}`), []byte("null"), 1)
|
||||
if _, err := protocol.DecodeSessionRequest(nullMode); err == nil {
|
||||
t.Fatalf("DecodeSessionRequest accepted explicit null display mode: %s", nullMode)
|
||||
}
|
||||
|
||||
profile := protocol.ManifestProfile{
|
||||
ID: "standard",
|
||||
Bounds: protocol.ManifestBounds{MinimumKbps: 1000, TargetKbps: 2000, MaximumKbps: 3000},
|
||||
}
|
||||
legacyProfile, err := protocol.EncodeManifestProfile(profile)
|
||||
if err != nil || bytes.Contains(legacyProfile, []byte("display_mode")) {
|
||||
t.Fatalf("legacy profile = %s, err = %v", legacyProfile, err)
|
||||
}
|
||||
profile.DisplayMode = &mode
|
||||
awareProfile, err := protocol.EncodeManifestProfile(profile)
|
||||
if err != nil || !bytes.Contains(awareProfile, []byte(`"display_mode":{"resolution_width":2560,"resolution_height":1440,"fps":120}`)) {
|
||||
t.Fatalf("display-aware profile = %s, err = %v", awareProfile, err)
|
||||
}
|
||||
|
||||
for _, invalid := range []string{
|
||||
`{"resolution_width":319,"resolution_height":1440,"fps":120}`,
|
||||
`{"resolution_width":16385,"resolution_height":1440,"fps":120}`,
|
||||
`{"resolution_width":2560,"resolution_height":199,"fps":120}`,
|
||||
`{"resolution_width":2560,"resolution_height":8641,"fps":120}`,
|
||||
`{"resolution_width":2560,"resolution_height":1440,"fps":0}`,
|
||||
`{"resolution_width":2560,"resolution_height":1440,"fps":241}`,
|
||||
`{"resolution_width":2560,"resolution_height":1440,"fps":120,"unknown":true}`,
|
||||
} {
|
||||
if _, err := protocol.DecodeDisplayMode([]byte(invalid)); err == nil {
|
||||
t.Fatalf("DecodeDisplayMode accepted %s", invalid)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestPageInfoRejectsOutOfBoundsLimit(t *testing.T) {
|
||||
if _, err := protocol.DecodePageInfo([]byte(`{"limit":101,"next_cursor":""}`)); err == nil {
|
||||
t.Fatal("DecodePageInfo accepted limit above the contract maximum")
|
||||
|
||||
Reference in New Issue
Block a user