github.com/LazyboyChen7/engine@v17.12.1-ce-rc2+incompatible/daemon/logger/loggerutils/multireader/multireader_test.go (about)

     1  package multireader
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  	"io"
     8  	"io/ioutil"
     9  	"os"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  func TestMultiReadSeekerReadAll(t *testing.T) {
    15  	str := "hello world"
    16  	s1 := strings.NewReader(str + " 1")
    17  	s2 := strings.NewReader(str + " 2")
    18  	s3 := strings.NewReader(str + " 3")
    19  	mr := MultiReadSeeker(s1, s2, s3)
    20  
    21  	expectedSize := int64(s1.Len() + s2.Len() + s3.Len())
    22  
    23  	b, err := ioutil.ReadAll(mr)
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  
    28  	expected := "hello world 1hello world 2hello world 3"
    29  	if string(b) != expected {
    30  		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
    31  	}
    32  
    33  	size, err := mr.Seek(0, os.SEEK_END)
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	if size != expectedSize {
    38  		t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize)
    39  	}
    40  
    41  	// Reset the position and read again
    42  	pos, err := mr.Seek(0, os.SEEK_SET)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  	if pos != 0 {
    47  		t.Fatalf("expected position to be set to 0, got %d", pos)
    48  	}
    49  
    50  	b, err = ioutil.ReadAll(mr)
    51  	if err != nil {
    52  		t.Fatal(err)
    53  	}
    54  
    55  	if string(b) != expected {
    56  		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
    57  	}
    58  
    59  	// The positions of some readers are not 0
    60  	s1.Seek(0, os.SEEK_SET)
    61  	s2.Seek(0, os.SEEK_END)
    62  	s3.Seek(0, os.SEEK_SET)
    63  	mr = MultiReadSeeker(s1, s2, s3)
    64  	b, err = ioutil.ReadAll(mr)
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  
    69  	if string(b) != expected {
    70  		t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
    71  	}
    72  }
    73  
    74  func TestMultiReadSeekerReadEach(t *testing.T) {
    75  	str := "hello world"
    76  	s1 := strings.NewReader(str + " 1")
    77  	s2 := strings.NewReader(str + " 2")
    78  	s3 := strings.NewReader(str + " 3")
    79  	mr := MultiReadSeeker(s1, s2, s3)
    80  
    81  	var totalBytes int64
    82  	for i, s := range []*strings.Reader{s1, s2, s3} {
    83  		sLen := int64(s.Len())
    84  		buf := make([]byte, s.Len())
    85  		expected := []byte(fmt.Sprintf("%s %d", str, i+1))
    86  
    87  		if _, err := mr.Read(buf); err != nil && err != io.EOF {
    88  			t.Fatal(err)
    89  		}
    90  
    91  		if !bytes.Equal(buf, expected) {
    92  			t.Fatalf("expected %q to be %q", string(buf), string(expected))
    93  		}
    94  
    95  		pos, err := mr.Seek(0, os.SEEK_CUR)
    96  		if err != nil {
    97  			t.Fatalf("iteration: %d, error: %v", i+1, err)
    98  		}
    99  
   100  		// check that the total bytes read is the current position of the seeker
   101  		totalBytes += sLen
   102  		if pos != totalBytes {
   103  			t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1)
   104  		}
   105  
   106  		// This tests not only that SEEK_SET and SEEK_CUR give the same values, but that the next iteration is in the expected position as well
   107  		newPos, err := mr.Seek(pos, os.SEEK_SET)
   108  		if err != nil {
   109  			t.Fatal(err)
   110  		}
   111  		if newPos != pos {
   112  			t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos)
   113  		}
   114  	}
   115  }
   116  
   117  func TestMultiReadSeekerReadSpanningChunks(t *testing.T) {
   118  	str := "hello world"
   119  	s1 := strings.NewReader(str + " 1")
   120  	s2 := strings.NewReader(str + " 2")
   121  	s3 := strings.NewReader(str + " 3")
   122  	mr := MultiReadSeeker(s1, s2, s3)
   123  
   124  	buf := make([]byte, s1.Len()+3)
   125  	_, err := mr.Read(buf)
   126  	if err != nil {
   127  		t.Fatal(err)
   128  	}
   129  
   130  	// expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string
   131  	expected := "hello world 1hel"
   132  	if string(buf) != expected {
   133  		t.Fatalf("expected %s to be %s", string(buf), expected)
   134  	}
   135  }
   136  
   137  func TestMultiReadSeekerNegativeSeek(t *testing.T) {
   138  	str := "hello world"
   139  	s1 := strings.NewReader(str + " 1")
   140  	s2 := strings.NewReader(str + " 2")
   141  	s3 := strings.NewReader(str + " 3")
   142  	mr := MultiReadSeeker(s1, s2, s3)
   143  
   144  	s1Len := s1.Len()
   145  	s2Len := s2.Len()
   146  	s3Len := s3.Len()
   147  
   148  	s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END)
   149  	if err != nil {
   150  		t.Fatal(err)
   151  	}
   152  	if s != int64(s1Len+s2Len) {
   153  		t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len())
   154  	}
   155  
   156  	buf := make([]byte, s3Len)
   157  	if _, err := mr.Read(buf); err != nil && err != io.EOF {
   158  		t.Fatal(err)
   159  	}
   160  	expected := fmt.Sprintf("%s %d", str, 3)
   161  	if string(buf) != fmt.Sprintf("%s %d", str, 3) {
   162  		t.Fatalf("expected %q to be %q", string(buf), expected)
   163  	}
   164  }
   165  
   166  func TestMultiReadSeekerCurAfterSet(t *testing.T) {
   167  	str := "hello world"
   168  	s1 := strings.NewReader(str + " 1")
   169  	s2 := strings.NewReader(str + " 2")
   170  	s3 := strings.NewReader(str + " 3")
   171  	mr := MultiReadSeeker(s1, s2, s3)
   172  
   173  	mid := int64(s1.Len() + s2.Len()/2)
   174  
   175  	size, err := mr.Seek(mid, os.SEEK_SET)
   176  	if err != nil {
   177  		t.Fatal(err)
   178  	}
   179  	if size != mid {
   180  		t.Fatalf("reader size does not match, got %d, expected %d", size, mid)
   181  	}
   182  
   183  	size, err = mr.Seek(3, os.SEEK_CUR)
   184  	if err != nil {
   185  		t.Fatal(err)
   186  	}
   187  	if size != mid+3 {
   188  		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3)
   189  	}
   190  	size, err = mr.Seek(5, os.SEEK_CUR)
   191  	if err != nil {
   192  		t.Fatal(err)
   193  	}
   194  	if size != mid+8 {
   195  		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8)
   196  	}
   197  
   198  	size, err = mr.Seek(10, os.SEEK_CUR)
   199  	if err != nil {
   200  		t.Fatal(err)
   201  	}
   202  	if size != mid+18 {
   203  		t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18)
   204  	}
   205  }
   206  
   207  func TestMultiReadSeekerSmallReads(t *testing.T) {
   208  	readers := []io.ReadSeeker{}
   209  	for i := 0; i < 10; i++ {
   210  		integer := make([]byte, 4)
   211  		binary.BigEndian.PutUint32(integer, uint32(i))
   212  		readers = append(readers, bytes.NewReader(integer))
   213  	}
   214  
   215  	reader := MultiReadSeeker(readers...)
   216  	for i := 0; i < 10; i++ {
   217  		var integer uint32
   218  		if err := binary.Read(reader, binary.BigEndian, &integer); err != nil {
   219  			t.Fatalf("Read from NewMultiReadSeeker failed: %v", err)
   220  		}
   221  		if uint32(i) != integer {
   222  			t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer)
   223  		}
   224  	}
   225  }