1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage fs 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "os" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker) 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Workerfunc TestMockFs_LstatStatSymlinks(t *testing.T) { 23*333d2b36SAndroid Build Coastguard Worker // setup filesystem 24*333d2b36SAndroid Build Coastguard Worker filesystem := NewMockFs(nil) 25*333d2b36SAndroid Build Coastguard Worker Create(t, "/tmp/realdir/hi.txt", filesystem) 26*333d2b36SAndroid Build Coastguard Worker Create(t, "/tmp/realdir/ignoreme.txt", filesystem) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker Link(t, "/tmp/links/dir", "../realdir", filesystem) 29*333d2b36SAndroid Build Coastguard Worker Link(t, "/tmp/links/file", "../realdir/hi.txt", filesystem) 30*333d2b36SAndroid Build Coastguard Worker Link(t, "/tmp/links/broken", "nothingHere", filesystem) 31*333d2b36SAndroid Build Coastguard Worker Link(t, "/tmp/links/recursive", "recursive", filesystem) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker assertStat := func(t *testing.T, stat os.FileInfo, err error, wantName string, wantMode os.FileMode) { 34*333d2b36SAndroid Build Coastguard Worker t.Helper() 35*333d2b36SAndroid Build Coastguard Worker if err != nil { 36*333d2b36SAndroid Build Coastguard Worker t.Error(err) 37*333d2b36SAndroid Build Coastguard Worker return 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker if g, w := stat.Name(), wantName; g != w { 40*333d2b36SAndroid Build Coastguard Worker t.Errorf("want name %q, got %q", w, g) 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker if g, w := stat.Mode(), wantMode; g != w { 43*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: want mode %q, got %q", wantName, w, g) 44*333d2b36SAndroid Build Coastguard Worker } 45*333d2b36SAndroid Build Coastguard Worker } 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Worker assertErr := func(t *testing.T, err error, wantErr string) { 48*333d2b36SAndroid Build Coastguard Worker if err == nil || err.Error() != wantErr { 49*333d2b36SAndroid Build Coastguard Worker t.Errorf("want error %q, got %q", wantErr, err) 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker } 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker stat, err := filesystem.Lstat("/tmp/links/dir") 54*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "dir", os.ModeSymlink) 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Stat("/tmp/links/dir") 57*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "realdir", os.ModeDir) 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Lstat("/tmp/links/file") 60*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "file", os.ModeSymlink) 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Stat("/tmp/links/file") 63*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "hi.txt", 0) 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Lstat("/tmp/links/broken") 66*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "broken", os.ModeSymlink) 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Stat("/tmp/links/broken") 69*333d2b36SAndroid Build Coastguard Worker assertErr(t, err, "stat /tmp/links/nothingHere: file does not exist") 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Lstat("/tmp/links/recursive") 72*333d2b36SAndroid Build Coastguard Worker assertStat(t, stat, err, "recursive", os.ModeSymlink) 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker stat, err = filesystem.Stat("/tmp/links/recursive") 75*333d2b36SAndroid Build Coastguard Worker assertErr(t, err, "read /tmp/links/recursive: too many levels of symbolic links") 76*333d2b36SAndroid Build Coastguard Worker} 77