github.com/hashicorp/vault/sdk@v0.13.0/database/helper/credsutil/usernames_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package credsutil 5 6 import ( 7 "regexp" 8 "testing" 9 ) 10 11 func TestGenerateUsername(t *testing.T) { 12 type testCase struct { 13 displayName string 14 displayNameLen int 15 16 roleName string 17 roleNameLen int 18 19 usernameLen int 20 separator string 21 caseOp CaseOp 22 23 regex string 24 } 25 tests := map[string]testCase{ 26 "all opts": { 27 displayName: "abcdefghijklmonpqrstuvwxyz", 28 displayNameLen: 10, 29 roleName: "zyxwvutsrqpnomlkjihgfedcba", 30 roleNameLen: 10, 31 usernameLen: 45, 32 separator: ".", 33 caseOp: KeepCase, 34 35 regex: "^v.abcdefghij.zyxwvutsrq.[a-zA-Z0-9]{20}.$", 36 }, 37 "no separator": { 38 displayName: "abcdefghijklmonpqrstuvwxyz", 39 displayNameLen: 10, 40 roleName: "zyxwvutsrqpnomlkjihgfedcba", 41 roleNameLen: 10, 42 usernameLen: 45, 43 separator: "", 44 caseOp: KeepCase, 45 46 regex: "^vabcdefghijzyxwvutsrq[a-zA-Z0-9]{20}[0-9]{4}$", 47 }, 48 "lowercase": { 49 displayName: "abcdefghijklmonpqrstuvwxyz", 50 displayNameLen: 10, 51 roleName: "zyxwvutsrqpnomlkjihgfedcba", 52 roleNameLen: 10, 53 usernameLen: 45, 54 separator: "_", 55 caseOp: Lowercase, 56 57 regex: "^v_abcdefghij_zyxwvutsrq_[a-z0-9]{20}_$", 58 }, 59 "uppercase": { 60 displayName: "abcdefghijklmonpqrstuvwxyz", 61 displayNameLen: 10, 62 roleName: "zyxwvutsrqpnomlkjihgfedcba", 63 roleNameLen: 10, 64 usernameLen: 45, 65 separator: "_", 66 caseOp: Uppercase, 67 68 regex: "^V_ABCDEFGHIJ_ZYXWVUTSRQ_[A-Z0-9]{20}_$", 69 }, 70 "short username": { 71 displayName: "abcdefghijklmonpqrstuvwxyz", 72 displayNameLen: 5, 73 roleName: "zyxwvutsrqpnomlkjihgfedcba", 74 roleNameLen: 5, 75 usernameLen: 15, 76 separator: "_", 77 caseOp: KeepCase, 78 79 regex: "^v_abcde_zyxwv_[a-zA-Z0-9]{1}$", 80 }, 81 "long username": { 82 displayName: "abcdefghijklmonpqrstuvwxyz", 83 displayNameLen: 0, 84 roleName: "zyxwvutsrqpnomlkjihgfedcba", 85 roleNameLen: 0, 86 usernameLen: 100, 87 separator: "_", 88 caseOp: KeepCase, 89 90 regex: "^v_abcdefghijklmonpqrstuvwxyz_zyxwvutsrqpnomlkjihgfedcba_[a-zA-Z0-9]{20}_[0-9]{1,23}$", 91 }, 92 "zero max length": { 93 displayName: "abcdefghijklmonpqrstuvwxyz", 94 displayNameLen: 0, 95 roleName: "zyxwvutsrqpnomlkjihgfedcba", 96 roleNameLen: 0, 97 usernameLen: 0, 98 separator: "_", 99 caseOp: KeepCase, 100 101 regex: "^v_abcdefghijklmonpqrstuvwxyz_zyxwvutsrqpnomlkjihgfedcba_[a-zA-Z0-9]{20}_[0-9]+$", 102 }, 103 "no display name": { 104 displayName: "abcdefghijklmonpqrstuvwxyz", 105 displayNameLen: NoneLength, 106 roleName: "zyxwvutsrqpnomlkjihgfedcba", 107 roleNameLen: 15, 108 usernameLen: 100, 109 separator: "_", 110 caseOp: KeepCase, 111 112 regex: "^v_zyxwvutsrqpnoml_[a-zA-Z0-9]{20}_[0-9]+$", 113 }, 114 "no role name": { 115 displayName: "abcdefghijklmonpqrstuvwxyz", 116 displayNameLen: 15, 117 roleName: "zyxwvutsrqpnomlkjihgfedcba", 118 roleNameLen: NoneLength, 119 usernameLen: 100, 120 separator: "_", 121 caseOp: KeepCase, 122 123 regex: "^v_abcdefghijklmon_[a-zA-Z0-9]{20}_[0-9]+$", 124 }, 125 } 126 127 for name, test := range tests { 128 t.Run(name, func(t *testing.T) { 129 re := regexp.MustCompile(test.regex) 130 131 username, err := GenerateUsername( 132 DisplayName(test.displayName, test.displayNameLen), 133 RoleName(test.roleName, test.roleNameLen), 134 Separator(test.separator), 135 MaxLength(test.usernameLen), 136 Case(test.caseOp), 137 ) 138 if err != nil { 139 t.Fatalf("no error expected, got: %s", err) 140 } 141 142 if !re.MatchString(username) { 143 t.Fatalf("username %q does not match regex %q", username, test.regex) 144 } 145 }) 146 } 147 }