| // Copyright 2017 The LUCI Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package common |
| |
| import ( |
| "testing" |
| |
| . "github.com/smartystreets/goconvey/convey" |
| ) |
| |
| func TestValidatesBlacklist(t *testing.T) { |
| type testCase struct { |
| desc string |
| blacklist []string |
| wantErr bool |
| } |
| |
| testCases := []testCase{ |
| { |
| desc: "no patterns", |
| blacklist: nil, |
| wantErr: false, |
| }, |
| { |
| desc: "good pattern", |
| blacklist: []string{"*"}, |
| wantErr: false, |
| }, |
| { |
| desc: "good patterns", |
| blacklist: []string{"a*", "b*"}, |
| wantErr: false, |
| }, |
| { |
| desc: "bad pattern", |
| blacklist: []string{"["}, |
| wantErr: true, |
| }, |
| { |
| desc: "bad first pattern", |
| blacklist: []string{"[", "*"}, |
| wantErr: true, |
| }, |
| { |
| desc: "bad last pattern", |
| blacklist: []string{"*", "["}, |
| wantErr: true, |
| }, |
| } |
| |
| for _, tc := range testCases { |
| tc := tc |
| Convey(tc.desc, t, func() { |
| _, err := NewFilesystemView("/root", tc.blacklist) |
| if tc.wantErr { |
| So(err, ShouldNotBeNil) |
| } else { |
| So(err, ShouldBeNil) |
| } |
| }) |
| } |
| |
| } |
| |
| func TestCalculatesRelativePaths(t *testing.T) { |
| type testCase struct { |
| desc string |
| root string |
| absPath string |
| wantRelPath string |
| wantErr bool |
| } |
| |
| testCases := []testCase{ |
| { |
| desc: "no trailing slash", |
| root: "/a", |
| absPath: "/a/b", |
| wantRelPath: "b", |
| wantErr: false, |
| }, |
| { |
| desc: "trailing slash", |
| root: "/a", |
| absPath: "/a/b/", |
| wantRelPath: "b", |
| wantErr: false, |
| }, |
| { |
| desc: "no common root", |
| root: "/a", |
| absPath: "/x/y", |
| wantRelPath: "../x/y", |
| wantErr: false, |
| }, |
| { |
| desc: "no computable relative path", |
| root: "/a", |
| absPath: "./x/y", |
| wantRelPath: "", |
| wantErr: true, |
| }, |
| { |
| desc: "root", |
| root: "/a", |
| absPath: "/a", |
| wantRelPath: ".", |
| wantErr: false, |
| }, |
| } |
| |
| for _, tc := range testCases { |
| tc := tc |
| Convey(tc.desc, t, func() { |
| fsView, err := NewFilesystemView(tc.root, nil) |
| |
| So(err, ShouldBeNil) |
| |
| relPath, err := fsView.RelativePath(tc.absPath) |
| So(relPath, ShouldEqual, tc.wantRelPath) |
| if tc.wantErr { |
| So(err, ShouldNotBeNil) |
| } else { |
| So(err, ShouldBeNil) |
| } |
| }) |
| } |
| } |
| |
| func TestAppliesBlacklist(t *testing.T) { |
| type testCase struct { |
| desc string |
| root string |
| blacklist []string |
| absPath string |
| wantRelPath string |
| } |
| |
| testCases := []testCase{ |
| { |
| desc: "no blacklist", |
| root: "/a", |
| blacklist: nil, |
| absPath: "/a/x/y", |
| wantRelPath: "x/y", |
| }, |
| { |
| desc: "blacklist matches relative path", |
| root: "/a", |
| blacklist: []string{"?/z"}, |
| absPath: "/a/x/z", |
| wantRelPath: "", |
| }, |
| { |
| desc: "blacklist doesn't match relative path", |
| root: "/a", |
| blacklist: []string{"?/z"}, |
| absPath: "/a/x/y", |
| wantRelPath: "x/y", |
| }, |
| { |
| desc: "blacklist matches basename", |
| root: "/a", |
| blacklist: []string{"z"}, |
| absPath: "/a/x/z", |
| wantRelPath: "", |
| }, |
| { |
| desc: "blacklist doesn't match basename", |
| root: "/a", |
| blacklist: []string{"z"}, |
| absPath: "/a/z/y", |
| wantRelPath: "z/y", |
| }, |
| { |
| desc: "root never matches blacklist", |
| root: "/a", |
| blacklist: []string{"?"}, |
| absPath: "/a", |
| wantRelPath: ".", |
| }, |
| { |
| desc: "only one blacklist need match path (1)", |
| root: "/a", |
| blacklist: []string{"z", "abc"}, |
| absPath: "/a/x/z", |
| wantRelPath: "", |
| }, |
| { |
| desc: "only one blacklist need match path (2)", |
| root: "/a", |
| blacklist: []string{"abc", "z"}, |
| absPath: "/a/x/z", |
| wantRelPath: "", |
| }, |
| } |
| |
| for _, tc := range testCases { |
| tc := tc |
| Convey(tc.desc, t, func() { |
| fsView, err := NewFilesystemView(tc.root, tc.blacklist) |
| |
| // These test cases contain only valid blacklists. |
| // Invalid blacklists are tested in TestValidatesBlacklist. |
| So(err, ShouldBeNil) |
| |
| relPath, err := fsView.RelativePath(tc.absPath) |
| // These test cases contain only valid relative paths. |
| // non-computable relative paths are tested in TestCalculatesRelativePaths. |
| So(err, ShouldBeNil) |
| So(relPath, ShouldEqual, tc.wantRelPath) |
| }) |
| } |
| } |