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  }