Home | History | Annotate | Download | only in os
      1 // Copyright 2012 The Go 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 os_test
      6 
      7 import (
      8 	"fmt"
      9 	"io/ioutil"
     10 	"os"
     11 	"path/filepath"
     12 	"testing"
     13 )
     14 
     15 func TestErrIsExist(t *testing.T) {
     16 	f, err := ioutil.TempFile("", "_Go_ErrIsExist")
     17 	if err != nil {
     18 		t.Fatalf("open ErrIsExist tempfile: %s", err)
     19 		return
     20 	}
     21 	defer os.Remove(f.Name())
     22 	defer f.Close()
     23 	f2, err := os.OpenFile(f.Name(), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
     24 	if err == nil {
     25 		f2.Close()
     26 		t.Fatal("Open should have failed")
     27 		return
     28 	}
     29 	if s := checkErrorPredicate("os.IsExist", os.IsExist, err); s != "" {
     30 		t.Fatal(s)
     31 		return
     32 	}
     33 }
     34 
     35 func testErrNotExist(name string) string {
     36 	f, err := os.Open(name)
     37 	if err == nil {
     38 		f.Close()
     39 		return "Open should have failed"
     40 	}
     41 	if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
     42 		return s
     43 	}
     44 
     45 	err = os.Chdir(name)
     46 	if err == nil {
     47 		return "Chdir should have failed"
     48 	}
     49 	if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
     50 		return s
     51 	}
     52 	return ""
     53 }
     54 
     55 func TestErrIsNotExist(t *testing.T) {
     56 	tmpDir, err := ioutil.TempDir("", "_Go_ErrIsNotExist")
     57 	if err != nil {
     58 		t.Fatalf("create ErrIsNotExist tempdir: %s", err)
     59 		return
     60 	}
     61 	defer os.RemoveAll(tmpDir)
     62 
     63 	name := filepath.Join(tmpDir, "NotExists")
     64 	if s := testErrNotExist(name); s != "" {
     65 		t.Fatal(s)
     66 		return
     67 	}
     68 
     69 	name = filepath.Join(name, "NotExists2")
     70 	if s := testErrNotExist(name); s != "" {
     71 		t.Fatal(s)
     72 		return
     73 	}
     74 }
     75 
     76 func checkErrorPredicate(predName string, pred func(error) bool, err error) string {
     77 	if !pred(err) {
     78 		return fmt.Sprintf("%s does not work as expected for %#v", predName, err)
     79 	}
     80 	return ""
     81 }
     82 
     83 var isExistTests = []struct {
     84 	err   error
     85 	is    bool
     86 	isnot bool
     87 }{
     88 	{&os.PathError{Err: os.ErrInvalid}, false, false},
     89 	{&os.PathError{Err: os.ErrPermission}, false, false},
     90 	{&os.PathError{Err: os.ErrExist}, true, false},
     91 	{&os.PathError{Err: os.ErrNotExist}, false, true},
     92 	{&os.LinkError{Err: os.ErrInvalid}, false, false},
     93 	{&os.LinkError{Err: os.ErrPermission}, false, false},
     94 	{&os.LinkError{Err: os.ErrExist}, true, false},
     95 	{&os.LinkError{Err: os.ErrNotExist}, false, true},
     96 	{nil, false, false},
     97 }
     98 
     99 func TestIsExist(t *testing.T) {
    100 	for _, tt := range isExistTests {
    101 		if is := os.IsExist(tt.err); is != tt.is {
    102 			t.Errorf("os.IsExist(%T %v) = %v, want %v", tt.err, tt.err, is, tt.is)
    103 		}
    104 		if isnot := os.IsNotExist(tt.err); isnot != tt.isnot {
    105 			t.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt.err, tt.err, isnot, tt.isnot)
    106 		}
    107 	}
    108 }
    109 
    110 func TestErrPathNUL(t *testing.T) {
    111 	f, err := ioutil.TempFile("", "_Go_ErrPathNUL\x00")
    112 	if err == nil {
    113 		f.Close()
    114 		t.Fatal("TempFile should have failed")
    115 	}
    116 	f, err = ioutil.TempFile("", "_Go_ErrPathNUL")
    117 	if err != nil {
    118 		t.Fatalf("open ErrPathNUL tempfile: %s", err)
    119 	}
    120 	defer os.Remove(f.Name())
    121 	defer f.Close()
    122 	f2, err := os.OpenFile(f.Name(), os.O_RDWR, 0600)
    123 	if err != nil {
    124 		t.Fatalf("open ErrPathNUL: %s", err)
    125 	}
    126 	f2.Close()
    127 	f2, err = os.OpenFile(f.Name()+"\x00", os.O_RDWR, 0600)
    128 	if err == nil {
    129 		f2.Close()
    130 		t.Fatal("Open should have failed")
    131 	}
    132 }
    133