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  }