...

Source file src/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil_test.go

Documentation: go.etcd.io/etcd/client/pkg/v3/fileutil

     1  // Copyright 2015 The etcd Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package fileutil
    16  
    17  import (
    18  	"fmt"
    19  	"io"
    20  	"io/ioutil"
    21  	"math/rand"
    22  	"os"
    23  	"os/user"
    24  	"path/filepath"
    25  	"runtime"
    26  	"strings"
    27  	"testing"
    28  	"time"
    29  
    30  	"go.uber.org/zap/zaptest"
    31  )
    32  
    33  func TestIsDirWriteable(t *testing.T) {
    34  	tmpdir, err := ioutil.TempDir("", "")
    35  	if err != nil {
    36  		t.Fatalf("unexpected ioutil.TempDir error: %v", err)
    37  	}
    38  	defer os.RemoveAll(tmpdir)
    39  	if err = IsDirWriteable(tmpdir); err != nil {
    40  		t.Fatalf("unexpected IsDirWriteable error: %v", err)
    41  	}
    42  	if err = os.Chmod(tmpdir, 0444); err != nil {
    43  		t.Fatalf("unexpected os.Chmod error: %v", err)
    44  	}
    45  	me, err := user.Current()
    46  	if err != nil {
    47  		// err can be non-nil when cross compiled
    48  		// http://stackoverflow.com/questions/20609415/cross-compiling-user-current-not-implemented-on-linux-amd64
    49  		t.Skipf("failed to get current user: %v", err)
    50  	}
    51  	if me.Name == "root" || runtime.GOOS == "windows" {
    52  		// ideally we should check CAP_DAC_OVERRIDE.
    53  		// but it does not matter for tests.
    54  		// Chmod is not supported under windows.
    55  		t.Skipf("running as a superuser or in windows")
    56  	}
    57  	if err := IsDirWriteable(tmpdir); err == nil {
    58  		t.Fatalf("expected IsDirWriteable to error")
    59  	}
    60  }
    61  
    62  func TestCreateDirAll(t *testing.T) {
    63  	tmpdir, err := ioutil.TempDir(os.TempDir(), "foo")
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  	defer os.RemoveAll(tmpdir)
    68  
    69  	tmpdir2 := filepath.Join(tmpdir, "testdir")
    70  	if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err != nil {
    71  		t.Fatal(err)
    72  	}
    73  
    74  	if err = ioutil.WriteFile(filepath.Join(tmpdir2, "text.txt"), []byte("test text"), PrivateFileMode); err != nil {
    75  		t.Fatal(err)
    76  	}
    77  
    78  	if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err == nil || !strings.Contains(err.Error(), "to be empty, got") {
    79  		t.Fatalf("unexpected error %v", err)
    80  	}
    81  }
    82  
    83  func TestExist(t *testing.T) {
    84  	fdir := filepath.Join(os.TempDir(), fmt.Sprint(time.Now().UnixNano()+rand.Int63n(1000)))
    85  	os.RemoveAll(fdir)
    86  	if err := os.Mkdir(fdir, 0666); err != nil {
    87  		t.Skip(err)
    88  	}
    89  	defer os.RemoveAll(fdir)
    90  	if !Exist(fdir) {
    91  		t.Fatalf("expected Exist true, got %v", Exist(fdir))
    92  	}
    93  
    94  	f, err := ioutil.TempFile(os.TempDir(), "fileutil")
    95  	if err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	f.Close()
    99  
   100  	if g := Exist(f.Name()); !g {
   101  		t.Errorf("exist = %v, want true", g)
   102  	}
   103  
   104  	os.Remove(f.Name())
   105  	if g := Exist(f.Name()); g {
   106  		t.Errorf("exist = %v, want false", g)
   107  	}
   108  }
   109  
   110  func TestDirEmpty(t *testing.T) {
   111  	dir, err := ioutil.TempDir(os.TempDir(), "empty_dir")
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  	defer os.RemoveAll(dir)
   116  
   117  	if !DirEmpty(dir) {
   118  		t.Fatalf("expected DirEmpty true, got %v", DirEmpty(dir))
   119  	}
   120  
   121  	file, err := ioutil.TempFile(dir, "new_file")
   122  	if err != nil {
   123  		t.Fatal(err)
   124  	}
   125  	file.Close()
   126  
   127  	if DirEmpty(dir) {
   128  		t.Fatalf("expected DirEmpty false, got %v", DirEmpty(dir))
   129  	}
   130  	if DirEmpty(file.Name()) {
   131  		t.Fatalf("expected DirEmpty false, got %v", DirEmpty(file.Name()))
   132  	}
   133  }
   134  
   135  func TestZeroToEnd(t *testing.T) {
   136  	f, err := ioutil.TempFile(os.TempDir(), "fileutil")
   137  	if err != nil {
   138  		t.Fatal(err)
   139  	}
   140  	defer os.Remove(f.Name())
   141  	defer f.Close()
   142  
   143  	// Ensure 0 size is a nop so zero-to-end on an empty file won't give EINVAL.
   144  	if err = ZeroToEnd(f); err != nil {
   145  		t.Fatal(err)
   146  	}
   147  
   148  	b := make([]byte, 1024)
   149  	for i := range b {
   150  		b[i] = 12
   151  	}
   152  	if _, err = f.Write(b); err != nil {
   153  		t.Fatal(err)
   154  	}
   155  	if _, err = f.Seek(512, io.SeekStart); err != nil {
   156  		t.Fatal(err)
   157  	}
   158  	if err = ZeroToEnd(f); err != nil {
   159  		t.Fatal(err)
   160  	}
   161  	off, serr := f.Seek(0, io.SeekCurrent)
   162  	if serr != nil {
   163  		t.Fatal(serr)
   164  	}
   165  	if off != 512 {
   166  		t.Fatalf("expected offset 512, got %d", off)
   167  	}
   168  
   169  	b = make([]byte, 512)
   170  	if _, err = f.Read(b); err != nil {
   171  		t.Fatal(err)
   172  	}
   173  	for i := range b {
   174  		if b[i] != 0 {
   175  			t.Errorf("expected b[%d] = 0, got %d", i, b[i])
   176  		}
   177  	}
   178  }
   179  
   180  func TestDirPermission(t *testing.T) {
   181  	tmpdir, err := ioutil.TempDir(os.TempDir(), "foo")
   182  	if err != nil {
   183  		t.Fatal(err)
   184  	}
   185  	defer os.RemoveAll(tmpdir)
   186  
   187  	tmpdir2 := filepath.Join(tmpdir, "testpermission")
   188  	// create a new dir with 0700
   189  	if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err != nil {
   190  		t.Fatal(err)
   191  	}
   192  	// check dir permission with mode different than created dir
   193  	if err = CheckDirPermission(tmpdir2, 0600); err == nil {
   194  		t.Errorf("expected error, got nil")
   195  	}
   196  }
   197  
   198  func TestRemoveMatchFile(t *testing.T) {
   199  	tmpdir := t.TempDir()
   200  	defer os.RemoveAll(tmpdir)
   201  	f, err := ioutil.TempFile(tmpdir, "tmp")
   202  	if err != nil {
   203  		t.Fatal(err)
   204  	}
   205  	f.Close()
   206  	f, err = ioutil.TempFile(tmpdir, "foo.tmp")
   207  	if err != nil {
   208  		t.Fatal(err)
   209  	}
   210  	f.Close()
   211  
   212  	err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
   213  		return strings.HasPrefix(fileName, "tmp")
   214  	})
   215  	if err != nil {
   216  		t.Errorf("expected nil, got error")
   217  	}
   218  	fnames, err := ReadDir(tmpdir)
   219  	if err != nil {
   220  		t.Fatal(err)
   221  	}
   222  	if len(fnames) != 1 {
   223  		t.Errorf("expected exist 1 files, got %d", len(fnames))
   224  	}
   225  
   226  	f, err = ioutil.TempFile(tmpdir, "tmp")
   227  	if err != nil {
   228  		t.Fatal(err)
   229  	}
   230  	f.Close()
   231  	err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
   232  		os.Remove(filepath.Join(tmpdir, fileName))
   233  		return strings.HasPrefix(fileName, "tmp")
   234  	})
   235  	if err == nil {
   236  		t.Errorf("expected error, got nil")
   237  	}
   238  }
   239  

View as plain text