blob: 18d65e0713d85d98de69c7c72c9536efb6e2e628 [file] [log] [blame] [edit]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package servo
import (
"regexp"
"testing"
)
func TestPDStateRegex(t *testing.T) {
for idx, tc := range []struct {
version TCPMVersion
input string
PortNumber string
CCPolarity string
Connection string
PowerRole string
DataRole string
VConn string
TCState string
TCFlags string
PEState string
PEFlags string
}{
{version: TCPMv1, input: "Port C0 CC1, Ena - Role: SNK-DFP State: 8(), Flags: 0x16946\n",
PortNumber: "0", CCPolarity: "CC1", Connection: "Ena", PowerRole: "SNK", DataRole: "DFP", PEState: "SNK_READY", PEFlags: "16946"},
{version: TCPMv1, input: "Port C0 CC1, Ena - Role: SNK-DFP State: 8(A_STATE_NAME), Flags: 0x16946\n",
PortNumber: "0", CCPolarity: "CC1", Connection: "Ena", PowerRole: "SNK", DataRole: "DFP", PEState: "A_STATE_NAME", PEFlags: "16946"},
{version: TCPMv1, input: "Port C0 CC1, Ena - Role: SNK-DFP State: SNK_READY, Flags: 0x4946\n",
PortNumber: "0", CCPolarity: "CC1", Connection: "Ena", PowerRole: "SNK", DataRole: "DFP", PEState: "SNK_READY", PEFlags: "4946"},
{version: TCPMv2, input: "Port C0 CC1, Enable - Role: SNK-DFP TC State: Attached.SNK, Flags: 0x9012 PE State: PE_SNK_Ready, Flags: 0x0201 SPR\n",
PortNumber: "0", CCPolarity: "CC1", Connection: "Enable", PowerRole: "SNK", DataRole: "DFP", TCState: "Attached.SNK", TCFlags: "9012", PEState: "PE_SNK_Ready", PEFlags: "0201"},
} {
testRe := pdStateCmdRegexp[tc.version] + "|" + pdStateInvalidPortRegexp
re := regexp.MustCompile(testRe)
m := re.FindStringSubmatch(tc.input)
if m == nil {
t.Errorf("[%d]Input did not match regex", idx)
continue
}
tokens := pdStateTokens(m)
if m[pdStateFieldIndex[tc.version]["PortNumber"]] != tc.PortNumber {
t.Errorf("[%d]PortNumber incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["PortNumber"]], tc.PortNumber)
}
if m[pdStateFieldIndex[tc.version]["CCPolarity"]] != tc.CCPolarity {
t.Errorf("[%d]CCPolarity incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["CCPolarity"]], tc.CCPolarity)
}
if m[pdStateFieldIndex[tc.version]["Connection"]] != tc.Connection {
t.Errorf("[%d]Connection incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["Connection"]], tc.Connection)
}
if m[pdStateFieldIndex[tc.version]["PowerRole"]] != tc.PowerRole {
t.Errorf("[%d]PowerRole incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["PowerRole"]], tc.PowerRole)
}
if m[pdStateFieldIndex[tc.version]["DataRole"]] != tc.DataRole {
t.Errorf("[%d]DataRole incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["DataRole"]], tc.DataRole)
}
if m[pdStateFieldIndex[tc.version]["VConn"]] != tc.VConn {
t.Errorf("[%d]VConn incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["VConn"]], tc.VConn)
}
if tc.version == TCPMv2 && m[pdStateFieldIndex[tc.version]["TCState"]] != tc.TCState {
t.Errorf("[%d]TCState incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["TCState"]], tc.TCState)
}
if tc.version == TCPMv2 && m[pdStateFieldIndex[tc.version]["TCFlags"]] != tc.TCFlags {
t.Errorf("[%d]TCFlags incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["TCFlags"]], tc.TCFlags)
}
if peStateName, err := tokens.peStateName(tc.version); err != nil {
t.Errorf("[%d]peStateName failed: %v", idx, err)
} else if peStateName != tc.PEState {
t.Errorf("[%d]PEState incorrect, got %q, want %q", idx, peStateName, tc.PEState)
}
if m[pdStateFieldIndex[tc.version]["PEFlags"]] != tc.PEFlags {
t.Errorf("[%d]PEFlags incorrect, got %q, want %q", idx, m[pdStateFieldIndex[tc.version]["PEFlags"]], tc.PEFlags)
}
}
}