package displayctl import ( "context" "testing" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" manager "edge-infra.dev/pkg/sds/display/displaymanager/manager/example" v1 "edge-infra.dev/pkg/sds/display/k8s/apis/v1" v2 "edge-infra.dev/pkg/sds/display/k8s/apis/v2" ) var ( hostname = "upgrade" card0HDMI1 = v2.DisplayPort("card0-HDMI1") card0DP1 = v2.DisplayPort("card0-DP1") disconnected = v2.NewDisplayPort(v2.UnknownCard, "disconnected-1") elo4098 = v2.MPID("ELO-4098") vsc9365 = v2.MPID("VSC-9365") ncr1234 = v2.MPID("NCR-1234") v1NotPrimary = v1.Primary(false) v2NotPrimary = v2.Primary(false) disabled = false thirtySeconds = 30 sixtySeconds = 60 ninetySeconds = 90 oneTwentySeconds = 120 ) func TestUpgradeNodeDisplayConfig(t *testing.T) { c := &NodeDisplayConfigController{ DisplayManager: manager.NewExampleDisplayManager(hostname, false), } tcs := []struct { nodeDisplayConfig *v2.NodeDisplayConfig expectedNodeDisplayConfig *v2.NodeDisplayConfig expectedUpgraded bool }{ { // test case 1: // empty spec is not upgraded nodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{}, }, expectedNodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{}, }, expectedUpgraded: false, }, { // test case 2: // already-upgraded spec is unchanged nodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ Displays: v2.Displays{ { DisplayPort: card0DP1, MPID: &vsc9365, Primary: &v2NotPrimary, Orientation: &v2.InvertedOrientation, Resolution: &v2.Resolution{ Width: 1280, Height: 1084, }, }, { DisplayPort: card0HDMI1, MPID: &elo4098, Orientation: &v2.NormalOrientation, Resolution: &v2.Resolution{ Width: 1260, Height: 720, }, }, }, DPMS: &v2.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v2.Layout{card0HDMI1, card0DP1}, }, }, expectedNodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ Displays: v2.Displays{ { DisplayPort: card0DP1, MPID: &vsc9365, Primary: &v2NotPrimary, Orientation: &v2.InvertedOrientation, Resolution: &v2.Resolution{ Width: 1280, Height: 1084, }, }, { DisplayPort: card0HDMI1, MPID: &elo4098, Orientation: &v2.NormalOrientation, Resolution: &v2.Resolution{ Width: 1260, Height: 720, }, }, }, DPMS: &v2.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v2.Layout{card0HDMI1, card0DP1}, }, }, expectedUpgraded: false, }, { // test case 3: // v1 spec upgraded to v2 // disconnected displays marked disconnected nodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ V1: &v1.DisplayConfig{ Displays: v1.Displays{ v1.MPID(vsc9365): v1.Display{ Primary: &v1NotPrimary, Orientation: &v1.InvertedOrientation, Resolution: &v1.Resolution{ Width: 1280, Height: 1084, }, }, v1.MPID(elo4098): { Orientation: &v1.NormalOrientation, Resolution: &v1.Resolution{ Width: 1260, Height: 720, }, }, v1.MPID(ncr1234): { Resolution: &v1.Resolution{ Width: 1920, Height: 1080, }, }, }, DPMS: &v1.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v1.Layout{v1.MPID(elo4098), v1.MPID(vsc9365), v1.MPID(ncr1234)}, }, }, }, expectedNodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ Displays: v2.Displays{ { DisplayPort: card0HDMI1, Orientation: &v2.NormalOrientation, Resolution: &v2.Resolution{ Width: 1260, Height: 720, }, }, { DisplayPort: disconnected, Resolution: &v2.Resolution{ Width: 1920, Height: 1080, }, }, { DisplayPort: card0DP1, Primary: &v2NotPrimary, Orientation: &v2.InvertedOrientation, Resolution: &v2.Resolution{ Width: 1280, Height: 1084, }, }, }, DPMS: &v2.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v2.Layout{card0HDMI1, card0DP1, disconnected}, }, Status: v2.NodeDisplayConfigStatus{ Upgrade: v2.UpgradeStatus{ DisconnectedDisplays: map[v2.DisplayPort]v2.MPID{ disconnected: ncr1234, }, }, }, }, expectedUpgraded: true, }, { // test case 4: // displays disconnected during upgrade are identified once connected nodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ Displays: v2.Displays{ { DisplayPort: card0HDMI1, Orientation: &v2.NormalOrientation, Resolution: &v2.Resolution{ Width: 1260, Height: 720, }, }, { DisplayPort: disconnected, Primary: &v2NotPrimary, Orientation: &v2.InvertedOrientation, Resolution: &v2.Resolution{ Width: 1280, Height: 1084, }, }, }, DPMS: &v2.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v2.Layout{card0HDMI1, disconnected}, }, Status: v2.NodeDisplayConfigStatus{ Upgrade: v2.UpgradeStatus{ DisconnectedDisplays: map[v2.DisplayPort]v2.MPID{ disconnected: vsc9365, }, }, }, }, expectedNodeDisplayConfig: &v2.NodeDisplayConfig{ ObjectMeta: metav1.ObjectMeta{ Name: hostname, }, Spec: &v2.DisplayConfig{ Displays: v2.Displays{ { DisplayPort: card0HDMI1, Orientation: &v2.NormalOrientation, Resolution: &v2.Resolution{ Width: 1260, Height: 720, }, }, { DisplayPort: card0DP1, Primary: &v2NotPrimary, Orientation: &v2.InvertedOrientation, Resolution: &v2.Resolution{ Width: 1280, Height: 1084, }, }, }, DPMS: &v2.DPMS{ Enabled: &disabled, BlankTime: &thirtySeconds, StandbyTime: &sixtySeconds, SuspendTime: &ninetySeconds, OffTime: &oneTwentySeconds, }, Layout: v2.Layout{card0HDMI1, card0DP1}, }, Status: v2.NodeDisplayConfigStatus{}, }, expectedUpgraded: true, }, } for idx, tc := range tcs { nodeDisplayConfig := tc.nodeDisplayConfig.DeepCopy() upgraded, err := c.upgradeNodeDisplayConfig(context.Background(), nodeDisplayConfig) require.NoError(t, err, "test case %d failed", idx+1) require.Equal(t, tc.expectedUpgraded, upgraded, "test case %d failed", idx+1) require.Equal(t, tc.expectedNodeDisplayConfig, nodeDisplayConfig, "test case %d failed", idx+1) } }