github.com/hashicorp/vault/sdk@v0.11.0/helper/pathmanager/pathmanager_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package pathmanager 5 6 import ( 7 "reflect" 8 "testing" 9 ) 10 11 func TestPathManager(t *testing.T) { 12 m := New() 13 14 if m.Len() != 0 { 15 t.Fatalf("bad: path length expect 0, got %d", len(m.Paths())) 16 } 17 18 paths := []string{ 19 "path1/", 20 "path2/", 21 "path3/", 22 } 23 24 for _, path := range paths { 25 if m.HasPath(path) { 26 t.Fatalf("path should not exist in filtered paths %q", path) 27 } 28 } 29 30 // add paths 31 m.AddPaths(paths) 32 if m.Len() != 3 { 33 t.Fatalf("bad: path length expect 3, got %d", len(m.Paths())) 34 } 35 if !reflect.DeepEqual(paths, m.Paths()) { 36 t.Fatalf("mismatch in paths") 37 } 38 for _, path := range paths { 39 if !m.HasPath(path) { 40 t.Fatalf("path should exist in filtered paths %q", path) 41 } 42 } 43 44 // remove the paths 45 m.RemovePaths(paths) 46 47 for _, path := range paths { 48 if m.HasPath(path) { 49 t.Fatalf("path should not exist in filtered paths %q", path) 50 } 51 } 52 } 53 54 func TestPathManager_RemovePrefix(t *testing.T) { 55 m := New() 56 57 if m.Len() != 0 { 58 t.Fatalf("bad: path length expect 0, got %d", len(m.Paths())) 59 } 60 61 paths := []string{ 62 "path1/", 63 "path2/", 64 "path3/", 65 } 66 67 for _, path := range paths { 68 if m.HasPath(path) { 69 t.Fatalf("path should not exist in filtered paths %q", path) 70 } 71 } 72 73 // add paths 74 m.AddPaths(paths) 75 if m.Len() != 3 { 76 t.Fatalf("bad: path length expect 3, got %d", len(m.Paths())) 77 } 78 if !reflect.DeepEqual(paths, m.Paths()) { 79 t.Fatalf("mismatch in paths") 80 } 81 for _, path := range paths { 82 if !m.HasPath(path) { 83 t.Fatalf("path should exist in filtered paths %q", path) 84 } 85 } 86 87 // remove the paths 88 m.RemovePathPrefix("path") 89 90 if m.Len() != 0 { 91 t.Fatalf("bad: path length expect 0, got %d", len(m.Paths())) 92 } 93 94 for _, path := range paths { 95 if m.HasPath(path) { 96 t.Fatalf("path should not exist in filtered paths %q", path) 97 } 98 } 99 } 100 101 func TestPathManager_HasExactPath(t *testing.T) { 102 m := New() 103 paths := []string{ 104 "path1/key1", 105 "path1/key1/subkey1", 106 "path1/key1/subkey2", 107 "path1/key1/subkey3", 108 "path2/*", 109 "path3/", 110 "!path4/key1", 111 "!path5/*", 112 } 113 m.AddPaths(paths) 114 if m.Len() != len(paths) { 115 t.Fatalf("path count does not match: expected %d, got %d", len(paths), m.Len()) 116 } 117 118 type tCase struct { 119 key string 120 expect bool 121 } 122 123 tcases := []tCase{ 124 {"path1/key1", true}, 125 {"path2/key1", true}, 126 {"path3/key1", true}, 127 {"path1/key1/subkey1", true}, 128 {"path1/key1/subkey99", false}, 129 {"path2/key1/subkey1", true}, 130 {"path1/key1/subkey1/subkey1", false}, 131 {"nonexistentpath/key1", false}, 132 {"path4/key1", false}, 133 {"path5/key1/subkey1", false}, 134 } 135 136 for _, tc := range tcases { 137 if match := m.HasExactPath(tc.key); match != tc.expect { 138 t.Fatalf("incorrect match: key %q", tc.key) 139 } 140 } 141 142 m.RemovePaths(paths) 143 if len(m.Paths()) != 0 { 144 t.Fatalf("removing all paths did not clear manager: paths %v", m.Paths()) 145 } 146 } 147 148 func TestPathManager_HasPath(t *testing.T) { 149 m := New() 150 151 m.AddPaths([]string{"a/b/c/"}) 152 if m.HasPath("a/") { 153 t.Fatal("should not have path 'a/'") 154 } 155 if m.HasPath("a/b/") { 156 t.Fatal("should not have path 'a/b/'") 157 } 158 if !m.HasPath("a/b/c/") { 159 t.Fatal("should have path 'a/b/c'") 160 } 161 162 m.AddPaths([]string{"a/"}) 163 if !m.HasPath("a/") { 164 t.Fatal("should have path 'a/'") 165 } 166 if !m.HasPath("a/b/") { 167 t.Fatal("should have path 'a/b/'") 168 } 169 if !m.HasPath("a/b/c/") { 170 t.Fatal("should have path 'a/b/c'") 171 } 172 173 m.RemovePaths([]string{"a/"}) 174 if m.HasPath("a/") { 175 t.Fatal("should not have path 'a/'") 176 } 177 if m.HasPath("a/b/") { 178 t.Fatal("should not have path 'a/b/'") 179 } 180 if !m.HasPath("a/b/c/") { 181 t.Fatal("should have path 'a/b/c'") 182 } 183 }