github.com/urjitbhatia/afero@v1.1.0/match_test.go (about)

     1  // Copyright © 2014 Steve Francia <spf@spf13.com>.
     2  // Copyright 2009 The Go Authors. All rights reserved.
     3  //
     4  // Licensed under the Apache License, Version 2.0 (the "License");
     5  // you may not use this file except in compliance with the License.
     6  // You may obtain a copy of the License at
     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 afero
    16  
    17  import (
    18  	"os"
    19  	"path/filepath"
    20  	"runtime"
    21  	"testing"
    22  )
    23  
    24  // contains returns true if vector contains the string s.
    25  func contains(vector []string, s string) bool {
    26  	for _, elem := range vector {
    27  		if elem == s {
    28  			return true
    29  		}
    30  	}
    31  	return false
    32  }
    33  
    34  func setupGlobDirRoot(t *testing.T, fs Fs) string {
    35  	path := testDir(fs)
    36  	setupGlobFiles(t, fs, path)
    37  	return path
    38  }
    39  
    40  func setupGlobDirReusePath(t *testing.T, fs Fs, path string) string {
    41  	testRegistry[fs] = append(testRegistry[fs], path)
    42  	return setupGlobFiles(t, fs, path)
    43  }
    44  
    45  func setupGlobFiles(t *testing.T, fs Fs, path string) string {
    46  	testSubDir := filepath.Join(path, "globs", "bobs")
    47  	err := fs.MkdirAll(testSubDir, 0700)
    48  	if err != nil && !os.IsExist(err) {
    49  		t.Fatal(err)
    50  	}
    51  
    52  	f, err := fs.Create(filepath.Join(testSubDir, "/matcher"))
    53  	if err != nil {
    54  		t.Fatal(err)
    55  	}
    56  	f.WriteString("Testfile 1 content")
    57  	f.Close()
    58  
    59  	f, err = fs.Create(filepath.Join(testSubDir, "/../submatcher"))
    60  	if err != nil {
    61  		t.Fatal(err)
    62  	}
    63  	f.WriteString("Testfile 2 content")
    64  	f.Close()
    65  
    66  	f, err = fs.Create(filepath.Join(testSubDir, "/../../match"))
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  	f.WriteString("Testfile 3 content")
    71  	f.Close()
    72  
    73  	return testSubDir
    74  }
    75  
    76  func TestGlob(t *testing.T) {
    77  	defer removeAllTestFiles(t)
    78  	var testDir string
    79  	for i, fs := range Fss {
    80  		if i == 0 {
    81  			testDir = setupGlobDirRoot(t, fs)
    82  		} else {
    83  			setupGlobDirReusePath(t, fs, testDir)
    84  		}
    85  	}
    86  
    87  	var globTests = []struct {
    88  		pattern, result string
    89  	}{
    90  		{testDir + "/globs/bobs/matcher", testDir + "/globs/bobs/matcher"},
    91  		{testDir + "/globs/*/mat?her", testDir + "/globs/bobs/matcher"},
    92  		{testDir + "/globs/bobs/../*", testDir + "/globs/submatcher"},
    93  		{testDir + "/match", testDir + "/match"},
    94  	}
    95  
    96  	for _, fs := range Fss {
    97  
    98  		for _, tt := range globTests {
    99  			pattern := tt.pattern
   100  			result := tt.result
   101  			if runtime.GOOS == "windows" {
   102  				pattern = filepath.Clean(pattern)
   103  				result = filepath.Clean(result)
   104  			}
   105  			matches, err := Glob(fs, pattern)
   106  			if err != nil {
   107  				t.Errorf("Glob error for %q: %s", pattern, err)
   108  				continue
   109  			}
   110  			if !contains(matches, result) {
   111  				t.Errorf("Glob(%#q) = %#v want %v", pattern, matches, result)
   112  			}
   113  		}
   114  		for _, pattern := range []string{"no_match", "../*/no_match"} {
   115  			matches, err := Glob(fs, pattern)
   116  			if err != nil {
   117  				t.Errorf("Glob error for %q: %s", pattern, err)
   118  				continue
   119  			}
   120  			if len(matches) != 0 {
   121  				t.Errorf("Glob(%#q) = %#v want []", pattern, matches)
   122  			}
   123  		}
   124  
   125  	}
   126  }
   127  
   128  func TestGlobSymlink(t *testing.T) {
   129  	defer removeAllTestFiles(t)
   130  
   131  	fs := &OsFs{}
   132  	testDir := setupGlobDirRoot(t, fs)
   133  
   134  	err := os.Symlink("target", filepath.Join(testDir, "symlink"))
   135  	if err != nil {
   136  		t.Skipf("skipping on %s", runtime.GOOS)
   137  	}
   138  
   139  	var globSymlinkTests = []struct {
   140  		path, dest string
   141  		brokenLink bool
   142  	}{
   143  		{"test1", "link1", false},
   144  		{"test2", "link2", true},
   145  	}
   146  
   147  	for _, tt := range globSymlinkTests {
   148  		path := filepath.Join(testDir, tt.path)
   149  		dest := filepath.Join(testDir, tt.dest)
   150  		f, err := fs.Create(path)
   151  		if err != nil {
   152  			t.Fatal(err)
   153  		}
   154  		if err := f.Close(); err != nil {
   155  			t.Fatal(err)
   156  		}
   157  		err = os.Symlink(path, dest)
   158  		if err != nil {
   159  			t.Fatal(err)
   160  		}
   161  		if tt.brokenLink {
   162  			// Break the symlink.
   163  			fs.Remove(path)
   164  		}
   165  		matches, err := Glob(fs, dest)
   166  		if err != nil {
   167  			t.Errorf("GlobSymlink error for %q: %s", dest, err)
   168  		}
   169  		if !contains(matches, dest) {
   170  			t.Errorf("Glob(%#q) = %#v want %v", dest, matches, dest)
   171  		}
   172  	}
   173  }
   174  
   175  
   176  func TestGlobError(t *testing.T) {
   177  	for _, fs := range Fss {
   178  		_, err := Glob(fs, "[7]")
   179  		if err != nil {
   180  			t.Error("expected error for bad pattern; got none")
   181  		}
   182  	}
   183  }