github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/memio/ports_linux_test.go (about) 1 // Copyright 2012-2019 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build (linux && amd64) || (linux && 386) 6 // +build linux,amd64 linux,386 7 8 package memio 9 10 import ( 11 "errors" 12 "os" 13 "strings" 14 "testing" 15 ) 16 17 func newPortMock(f *os.File) (PortReadWriter, error) { 18 memPort := NewMemIOPort(f) 19 return &LinuxPort{ 20 ReadWriteCloser: memPort, 21 }, nil 22 } 23 24 func TestLinuxPort(t *testing.T) { 25 tmpDir := t.TempDir() 26 f, err := os.CreateTemp(tmpDir, "testMem-file-") 27 if err != nil { 28 t.Errorf("TestPortDev failed: %q", err) 29 } 30 fdata := make([]byte, 10000) 31 if _, err := f.Write(fdata); err != nil { 32 t.Errorf("TestPortDev failed: %q", err) 33 } 34 port, err := newPortMock(f) 35 if err != nil { 36 t.Fatalf("TestPortDev failed: %q", err) 37 } 38 for _, tt := range []struct { 39 name string 40 valueUint8 Uint8 41 valueUint16 Uint16 42 expValue uint8 43 wantErr string 44 }{ 45 { 46 name: "Uint8", 47 valueUint8: Uint8(23), 48 expValue: 23, 49 }, 50 { 51 name: "Uint16", 52 valueUint16: Uint16(42), 53 wantErr: "/dev/port data must be 8 bits on Linux", 54 }, 55 } { 56 t.Run(tt.name, func(t *testing.T) { 57 var data Uint8 58 if err := port.Out(0x3f8, &tt.valueUint8); err != nil { 59 t.Errorf("%q failed at port.Out: %q", tt.name, err) 60 } 61 62 if err := port.In(0x3f8, &data); !errors.Is(err, nil) { 63 t.Errorf("%q failed at port.In: %q", tt.name, err) 64 } 65 66 if data != Uint8(tt.expValue) { 67 t.Errorf("%q failed. Got: %d, Want: %d", tt.name, data, tt.expValue) 68 } 69 }) 70 71 t.Run(tt.name+"16Bit_fail", func(t *testing.T) { 72 var data Uint16 73 if err := port.Out(0x3f8, &tt.valueUint16); err != nil { 74 if !strings.Contains(err.Error(), tt.wantErr) { 75 t.Errorf("%q failed at port.Out: %q", tt.name, err) 76 } 77 } 78 if err := port.In(0x3f8, &data); err != nil { 79 if !strings.Contains(err.Error(), tt.wantErr) { 80 t.Errorf("%q failed at port.Out: %q", tt.name, err) 81 } 82 } 83 }) 84 85 t.Run(tt.name+"_Deprecated", func(t *testing.T) { 86 linuxPath = f.Name() 87 defer func() { linuxPath = "/dev/port" }() 88 data := Uint8(34) 89 if err := In(0x23, &data); !errors.Is(err, nil) { 90 t.Errorf("%q_Deprecated failed at port.In(): %q", tt.name, err) 91 } 92 if err := Out(0x23, &data); !errors.Is(err, nil) { 93 t.Errorf("%q_Deprecated failed at port.In(): %q", tt.name, err) 94 } 95 }) 96 t.Run(tt.name+"_DeprecatedFail", func(t *testing.T) { 97 linuxPath = "file-does-not-exist" 98 defer func() { linuxPath = "/dev/port" }() 99 data := Uint8(34) 100 if err := In(0x23, &data); !errors.Is(err, os.ErrNotExist) { 101 t.Errorf("%q_Deprecated failed at port.In(): %q", tt.name, err) 102 } 103 }) 104 t.Run(tt.name+"_DeprecatedFail", func(t *testing.T) { 105 linuxPath = "file-does-not-exist" 106 defer func() { linuxPath = "/dev/port" }() 107 data := Uint8(34) 108 if err := Out(0x23, &data); !errors.Is(err, os.ErrNotExist) { 109 t.Errorf("%q_Deprecated failed at port.In(): %q", tt.name, err) 110 } 111 }) 112 } 113 port.Close() 114 } 115 116 func TestNewPortFail(t *testing.T) { 117 linuxPath = "file-does-not-exist" 118 defer func() { linuxPath = "/dev/port" }() 119 if _, err := NewPort(); !errors.Is(err, os.ErrNotExist) { 120 t.Errorf("TestNewPortFail failed: %q", err) 121 } 122 } 123 124 func TestNewPortSucceed(t *testing.T) { 125 tmpDir := t.TempDir() 126 file, err := os.CreateTemp(tmpDir, "tmpfile-") 127 if err != nil { 128 t.Errorf("TestNewPortSucceed failed: %q", err) 129 } 130 fdata := make([]byte, 10000) 131 if _, err := file.Write(fdata); err != nil { 132 t.Errorf("TestPortDev failed: %q", err) 133 } 134 135 linuxPath = file.Name() 136 defer func() { linuxPath = "/dev/port" }() 137 port, err := NewPort() 138 if !errors.Is(err, nil) { 139 t.Errorf("TestNewPortFail failed: %q", err) 140 } 141 defer port.Close() 142 143 }