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  }