github.com/system-transparency/u-root@v6.0.1-0.20190919065413-ed07a650de4c+incompatible/pkg/memio/io_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  package memio
     6  
     7  import (
     8  	"fmt"
     9  	"io/ioutil"
    10  	"log"
    11  	"os"
    12  	"reflect"
    13  	"testing"
    14  )
    15  
    16  var u8 = Uint8(0x12)
    17  
    18  var tests = []struct {
    19  	name                string
    20  	addr                int64
    21  	writeData, readData UintN
    22  	err                 string
    23  }{
    24  	{
    25  		name:      "uint8",
    26  		addr:      0x10,
    27  		writeData: &[]Uint8{0x12}[0],
    28  		readData:  new(Uint8),
    29  	},
    30  	{
    31  		name:      "uint16",
    32  		addr:      0x20,
    33  		writeData: &[]Uint16{0x1234}[0],
    34  		readData:  new(Uint16),
    35  	},
    36  	{
    37  		name:      "uint32",
    38  		addr:      0x30,
    39  		writeData: &[]Uint32{0x12345678}[0],
    40  		readData:  new(Uint32),
    41  	},
    42  	{
    43  		name:      "uint64",
    44  		addr:      0x40,
    45  		writeData: &[]Uint64{0x1234567890abcdef}[0],
    46  		readData:  new(Uint64),
    47  	},
    48  	{
    49  		name:      "byte slice",
    50  		addr:      0x50,
    51  		writeData: &[]ByteSlice{[]byte("Hello")}[0],
    52  		readData:  &[]ByteSlice{make([]byte, 5)}[0],
    53  	},
    54  }
    55  
    56  func TestIO(t *testing.T) {
    57  	for _, tt := range tests {
    58  		t.Run(fmt.Sprintf(tt.name), func(t *testing.T) {
    59  			tmpFile, err := ioutil.TempFile("", "io_test")
    60  			if err != nil {
    61  				t.Fatal(err)
    62  			}
    63  			tmpFile.Write(make([]byte, 10000))
    64  			tmpFile.Close()
    65  			defer os.Remove(tmpFile.Name())
    66  			memPath = tmpFile.Name()
    67  			defer func() { memPath = "/dev/mem" }()
    68  
    69  			// Write to the file.
    70  			if err := Write(tt.addr, tt.writeData); err != nil {
    71  				if err.Error() == tt.err {
    72  					return
    73  				}
    74  				t.Fatal(err)
    75  			}
    76  
    77  			// Read back the value.
    78  			if err := Read(tt.addr, tt.readData); err != nil {
    79  				if err.Error() == tt.err {
    80  					return
    81  				}
    82  				t.Fatal(err)
    83  			}
    84  
    85  			want := tt.writeData
    86  			got := tt.readData
    87  			if !reflect.DeepEqual(want, got) {
    88  				t.Fatalf("Write(%#016x, %v) = %v; want %v",
    89  					tt.addr, want, got, want)
    90  			}
    91  		})
    92  	}
    93  }
    94  
    95  func ExampleRead() {
    96  	var data Uint32
    97  	if err := Read(0x1000000, &data); err != nil {
    98  		log.Fatal(err)
    99  	}
   100  	log.Printf("%v\n", data)
   101  }
   102  
   103  func ExampleWrite() {
   104  	data := Uint32(42)
   105  	if err := Write(0x1000000, &data); err != nil {
   106  		log.Fatal(err)
   107  	}
   108  }