1// Copyright 2020 Google Inc. All rights reserved. 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 15package fs 16 17import ( 18 "os" 19 "testing" 20) 21 22func TestMockFs_LstatStatSymlinks(t *testing.T) { 23 // setup filesystem 24 filesystem := NewMockFs(nil) 25 Create(t, "/tmp/realdir/hi.txt", filesystem) 26 Create(t, "/tmp/realdir/ignoreme.txt", filesystem) 27 28 Link(t, "/tmp/links/dir", "../realdir", filesystem) 29 Link(t, "/tmp/links/file", "../realdir/hi.txt", filesystem) 30 Link(t, "/tmp/links/broken", "nothingHere", filesystem) 31 Link(t, "/tmp/links/recursive", "recursive", filesystem) 32 33 assertStat := func(t *testing.T, stat os.FileInfo, err error, wantName string, wantMode os.FileMode) { 34 t.Helper() 35 if err != nil { 36 t.Error(err) 37 return 38 } 39 if g, w := stat.Name(), wantName; g != w { 40 t.Errorf("want name %q, got %q", w, g) 41 } 42 if g, w := stat.Mode(), wantMode; g != w { 43 t.Errorf("%s: want mode %q, got %q", wantName, w, g) 44 } 45 } 46 47 assertErr := func(t *testing.T, err error, wantErr string) { 48 if err == nil || err.Error() != wantErr { 49 t.Errorf("want error %q, got %q", wantErr, err) 50 } 51 } 52 53 stat, err := filesystem.Lstat("/tmp/links/dir") 54 assertStat(t, stat, err, "dir", os.ModeSymlink) 55 56 stat, err = filesystem.Stat("/tmp/links/dir") 57 assertStat(t, stat, err, "realdir", os.ModeDir) 58 59 stat, err = filesystem.Lstat("/tmp/links/file") 60 assertStat(t, stat, err, "file", os.ModeSymlink) 61 62 stat, err = filesystem.Stat("/tmp/links/file") 63 assertStat(t, stat, err, "hi.txt", 0) 64 65 stat, err = filesystem.Lstat("/tmp/links/broken") 66 assertStat(t, stat, err, "broken", os.ModeSymlink) 67 68 stat, err = filesystem.Stat("/tmp/links/broken") 69 assertErr(t, err, "stat /tmp/links/nothingHere: file does not exist") 70 71 stat, err = filesystem.Lstat("/tmp/links/recursive") 72 assertStat(t, stat, err, "recursive", os.ModeSymlink) 73 74 stat, err = filesystem.Stat("/tmp/links/recursive") 75 assertErr(t, err, "read /tmp/links/recursive: too many levels of symbolic links") 76} 77