github.com/pbberlin/tools@v0.0.0-20160910141205-7aa5421c2169/os/fsi/tests/suite2_test.go (about)

     1  // +build suite2
     2  // go test -tags=suite2
     3  
     4  package tests
     5  
     6  // Copyright © 2014 Steve Francia <spf@spf13.com>.
     7  // Copyright 2009 The Go Authors. All rights reserved.
     8  //
     9  // Licensed under the Apache License, Version 2.0 (the "License");
    10  // you may not use this file except in compliance with the License.
    11  // You may obtain a copy of the License at
    12  // http://www.apache.org/licenses/LICENSE-2.0
    13  //
    14  // Unless required by applicable law or agreed to in writing, software
    15  // distributed under the License is distributed on an "AS IS" BASIS,
    16  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    17  // See the License for the specific language governing permissions and
    18  // limitations under the License.
    19  
    20  import (
    21  	"bytes"
    22  	"io"
    23  	"os"
    24  	"syscall"
    25  	"testing"
    26  )
    27  
    28  func TestTruncate(t *testing.T) {
    29  
    30  	Fss, c := initFileSystems()
    31  	defer c.Close()
    32  	for _, fs := range Fss {
    33  		f := newFile("TestTruncate", fs, t)
    34  		defer fs.Remove(f.Name())
    35  		defer f.Close()
    36  
    37  		checkSize(t, f, 0)
    38  		f.Write([]byte("hello, world\n"))
    39  		checkSize(t, f, 13)
    40  		f.Truncate(10)
    41  		checkSize(t, f, 10)
    42  		f.Truncate(1024)
    43  		checkSize(t, f, 1024)
    44  		f.Truncate(0)
    45  		checkSize(t, f, 0)
    46  		_, err := f.Write([]byte("surprise!"))
    47  		if err == nil {
    48  			checkSize(t, f, 13+9) // wrote at offset past where hello, world was.
    49  		}
    50  	}
    51  }
    52  
    53  func TestSeek(t *testing.T) {
    54  
    55  	Fss, c := initFileSystems()
    56  	defer c.Close()
    57  	for _, fs := range Fss {
    58  		f := newFile("TestSeek", fs, t)
    59  		defer fs.Remove(f.Name())
    60  		defer f.Close()
    61  
    62  		const data = "hello, world\n"
    63  		io.WriteString(f, data)
    64  
    65  		type test struct {
    66  			in     int64
    67  			whence int
    68  			out    int64
    69  		}
    70  		var tests = []test{
    71  			{0, 1, int64(len(data))},
    72  			{0, 0, 0},
    73  			{5, 0, 5},
    74  			{0, 2, int64(len(data))},
    75  			{0, 0, 0},
    76  			{-1, 2, int64(len(data)) - 1},
    77  			{1 << 33, 0, 1 << 33},
    78  			{1 << 33, 2, 1<<33 + int64(len(data))},
    79  		}
    80  		for i, tt := range tests {
    81  			off, err := f.Seek(tt.in, tt.whence)
    82  			if off != tt.out || err != nil {
    83  				if e, ok := err.(*os.PathError); ok && e.Err == syscall.EINVAL && tt.out > 1<<32 {
    84  					// Reiserfs rejects the big seeks.
    85  					// http://code.google.com/p/go/issues/detail?id=91
    86  					break
    87  				}
    88  				t.Errorf("#%d: Seek(%v, %v) = %v, %v want %v, nil", i, tt.in, tt.whence, off, err, tt.out)
    89  			}
    90  		}
    91  	}
    92  }
    93  
    94  func TestReadAt(t *testing.T) {
    95  
    96  	Fss, c := initFileSystems()
    97  	defer c.Close()
    98  	for _, fs := range Fss {
    99  		f := newFile("TestReadAt", fs, t)
   100  		defer fs.Remove(f.Name())
   101  		defer f.Close()
   102  
   103  		const data = "hello, world\n"
   104  		io.WriteString(f, data)
   105  
   106  		b := make([]byte, 5)
   107  		n, err := f.ReadAt(b, 7)
   108  		if err != nil || n != len(b) {
   109  			t.Fatalf("ReadAt 7: %d, %v", n, err)
   110  		}
   111  		if string(b) != "world" {
   112  			t.Fatalf("ReadAt 7: have %q want %q", string(b), "world")
   113  		}
   114  	}
   115  }
   116  
   117  func TestWriteAt(t *testing.T) {
   118  
   119  	Fss, c := initFileSystems()
   120  	defer c.Close()
   121  	for _, fs := range Fss {
   122  
   123  		f := newFile("TestWriteAt", fs, t)
   124  		defer fs.Remove(f.Name())
   125  		defer f.Close()
   126  
   127  		const data = "hello, world\n"
   128  		io.WriteString(f, data)
   129  
   130  		n, err := f.WriteAt([]byte("WORLD"), 7)
   131  		if err != nil || n != 5 {
   132  			t.Fatalf("WriteAt 7: %d, %v", n, err)
   133  		}
   134  
   135  		err = f.Close()
   136  		if err != nil {
   137  			t.Fatalf("Closing file %v: %v", f.Name(), err)
   138  		}
   139  		// log.Printf(" Saved file %v", f.Name())
   140  
   141  		f2, err := fs.Open(f.Name())
   142  		if err != nil {
   143  			t.Fatalf("Reopening file %v: %v", f.Name(), err)
   144  		}
   145  		defer f2.Close()
   146  
   147  		// log.Printf("so far 4 %v", fs.Name())
   148  
   149  		buf := new(bytes.Buffer)
   150  		buf.ReadFrom(f2)
   151  		b := buf.Bytes()
   152  
   153  		if err != nil {
   154  			t.Fatalf("%v: ReadFile %s: %v", fs.Name(), f.Name(), err)
   155  		}
   156  		if string(b) != "hello, WORLD\n" {
   157  			t.Fatalf("after write: have %q want %q", string(b), "hello, WORLD\n")
   158  		}
   159  
   160  	}
   161  }
   162  
   163  //func TestReaddirnames(t *testing.T) {
   164  //for _, fs := range Fss {
   165  //testReaddirnames(fs, ".", dot, t)
   166  ////testReaddirnames(sysdir.name, fs, sysdir.files, t)
   167  //}
   168  //}
   169  
   170  //func TestReaddir(t *testing.T) {
   171  //for _, fs := range Fss {
   172  //testReaddir(fs, ".", dot, t)
   173  ////testReaddir(sysdir.name, fs, sysdir.files, t)
   174  //}
   175  //}