Mercurial > go > multipass
comparison file/auth_test.go @ 18:00d30c67b56d
Put all the library stuff into multipass/file.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Sun, 01 Nov 2015 12:16:51 -0500 |
| parents | auth/auth_test.go@bfc035bd5132 |
| children |
comparison
equal
deleted
inserted
replaced
| 17:342f63116bfd | 18:00d30c67b56d |
|---|---|
| 1 package file | |
| 2 | |
| 3 import ( | |
| 4 "regexp" | |
| 5 "testing" | |
| 6 ) | |
| 7 | |
| 8 var passPattern *regexp.Regexp = regexp.MustCompile(`^(?:[a-z]{4}-){3}[a-z]{4}$`) | |
| 9 | |
| 10 const basicShadow = "9999:$2a$12$tcv2MrtXgibAJHsSwVfHiOevXBFmiGy0HTNoOB8QzIhEh46iWS1uC:YW55dGhpbmcgbW9yZSB0aGFuIDUgcmVwcyBpcyBjYXJkaW8=" | |
| 11 const anotherShadow = "1:$2a$12$lINQdYWHOcLKoqhNOr3mNOpZSAu5JOBS2F7T/VDfYn2rvv6qUJehG:" | |
| 12 | |
| 13 func TestEntryFromShadow(t *testing.T) { | |
| 14 cases := []struct { | |
| 15 shadow string | |
| 16 wantErr bool | |
| 17 username string | |
| 18 id uint64 | |
| 19 hash string | |
| 20 description string | |
| 21 rest []string | |
| 22 }{ | |
| 23 { | |
| 24 shadow: "1234:$2a$12$apFtWGXKtWBavVy5eo.22Ohs43GudT5IYTqyQkIBX9LpS7YtvKBpa:", | |
| 25 id: 1234, | |
| 26 hash: "$2a$12$apFtWGXKtWBavVy5eo.22Ohs43GudT5IYTqyQkIBX9LpS7YtvKBpa", | |
| 27 }, | |
| 28 { | |
| 29 shadow: basicShadow, | |
| 30 id: 9999, | |
| 31 hash: "$2a$12$tcv2MrtXgibAJHsSwVfHiOevXBFmiGy0HTNoOB8QzIhEh46iWS1uC", | |
| 32 description: "anything more than 5 reps is cardio", | |
| 33 }, | |
| 34 { | |
| 35 shadow: anotherShadow, | |
| 36 id: 1, | |
| 37 hash: "$2a$12$lINQdYWHOcLKoqhNOr3mNOpZSAu5JOBS2F7T/VDfYn2rvv6qUJehG", | |
| 38 }, | |
| 39 { | |
| 40 shadow: "one:bogushash:", | |
| 41 wantErr: true, | |
| 42 }, | |
| 43 { | |
| 44 shadow: "-1:bogushash:", | |
| 45 wantErr: true, | |
| 46 }, | |
| 47 { | |
| 48 shadow: "0:tooshort", | |
| 49 wantErr: true, | |
| 50 }, | |
| 51 { | |
| 52 shadow: "0:bogushash:invalid base64", | |
| 53 wantErr: true, | |
| 54 }, | |
| 55 { | |
| 56 shadow: "1:bogushash::more things", | |
| 57 wantErr: true, | |
| 58 }, | |
| 59 } | |
| 60 for _, c := range cases { | |
| 61 entry, err := EntryFromShadow(c.shadow) | |
| 62 if c.wantErr { | |
| 63 if err == nil { | |
| 64 t.Errorf("EntryFromShadow(%q) == _, nil; want non-nil err", c.shadow) | |
| 65 } | |
| 66 continue | |
| 67 } | |
| 68 if err != nil { | |
| 69 t.Errorf("EntryFromShadow(%q) == _, %q; want nil err", c.shadow, err) | |
| 70 } | |
| 71 if c.id != entry.id { | |
| 72 t.Errorf("EntryFromShadow(%q).id = %q; want %q", c.shadow, entry.id, c.id) | |
| 73 } | |
| 74 if c.hash != string(entry.hash) { | |
| 75 t.Errorf("EntryFromShadow(%q).password = %q; want %q", c.shadow, entry.hash, c.hash) | |
| 76 } | |
| 77 if c.description != entry.description { | |
| 78 t.Errorf("EntryFromShadow(%q).description = %q; want %q", c.shadow, entry.description, c.description) | |
| 79 } | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 func TestNewEntry(t *testing.T) { | |
| 84 cases := []struct { | |
| 85 description string | |
| 86 wantErr bool | |
| 87 }{ | |
| 88 {"one", false}, | |
| 89 {"the other", false}, | |
| 90 {string(make([]byte, 1000)), true}, | |
| 91 } | |
| 92 for _, c := range cases { | |
| 93 entry, password, err := NewEntry(c.description) | |
| 94 if c.wantErr { | |
| 95 if err == nil { | |
| 96 t.Errorf("NewEntry(%q) = _, _, nil; want non-nil err", c.description) | |
| 97 } | |
| 98 continue | |
| 99 } | |
| 100 if err != nil { | |
| 101 t.Errorf("NewEntry(%q) = _, _, %q; want nil err", c.description, err) | |
| 102 } | |
| 103 if entry.id == 0 { | |
| 104 // This test has a 1/(2**64) chance of failing! :o | |
| 105 t.Errorf("NewEntry(_).id == 0, want nonzero") | |
| 106 } | |
| 107 if c.description != entry.description { | |
| 108 t.Errorf("NewEntry(%q).description = %q, want %q", | |
| 109 c.description, entry.description, c.description) | |
| 110 } | |
| 111 if !passPattern.MatchString(password) { | |
| 112 t.Errorf("NewEntry(_) = _, %q, _; wanted to match xxxx-xxxx-xxxx-xxxx", password) | |
| 113 } | |
| 114 if !entry.Authenticate(password) { | |
| 115 t.Errorf("NewEntry(%q).Authenticate(%q) failed", | |
| 116 c.description, password) | |
| 117 } | |
| 118 } | |
| 119 } | |
| 120 | |
| 121 func TestGenPassword(t *testing.T) { | |
| 122 p := genPassword() | |
| 123 if !passPattern.MatchString(string(p)) { | |
| 124 t.Errorf("genPassword() = %q; wanted to match xxxx-xxxx-xxxx-xxxx", p) | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 func TestAuthenticate(t *testing.T) { | |
| 129 entry, password, err := NewEntry("") | |
| 130 if err != nil { | |
| 131 t.Errorf("Error building entry") | |
| 132 } | |
| 133 type testcase struct { | |
| 134 password string | |
| 135 want bool | |
| 136 } | |
| 137 | |
| 138 cases := []testcase{ | |
| 139 {password, true}, | |
| 140 {"not the password", false}, | |
| 141 } | |
| 142 for _, c := range cases { | |
| 143 got := entry.Authenticate(c.password) | |
| 144 if got != c.want { | |
| 145 t.Errorf("entry.Authenticate(%q) == %v, want %v", | |
| 146 c.password, got, c.want) | |
| 147 } | |
| 148 } | |
| 149 | |
| 150 entry, err = EntryFromShadow(basicShadow) | |
| 151 if err != nil { | |
| 152 t.Errorf("Error loading valid shadow") | |
| 153 } | |
| 154 | |
| 155 cases = []testcase{ | |
| 156 {"nocardio", true}, | |
| 157 {"not the password", false}, | |
| 158 } | |
| 159 for _, c := range cases { | |
| 160 got := entry.Authenticate(c.password) | |
| 161 if got != c.want { | |
| 162 t.Errorf("entry.Authenticate(%q) == %v, want %v", | |
| 163 c.password, got, c.want) | |
| 164 } | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 func TestEncode(t *testing.T) { | |
| 169 // Crafted entry | |
| 170 shadowed, err := EntryFromShadow(basicShadow) | |
| 171 if err != nil { | |
| 172 t.Errorf("Error loading valid shadow") | |
| 173 } | |
| 174 anotherShadowed, err := EntryFromShadow(anotherShadow) | |
| 175 if err != nil { | |
| 176 t.Errorf("Error loading valid shadow") | |
| 177 } | |
| 178 cases := []struct { | |
| 179 entry *Entry | |
| 180 want string | |
| 181 }{ | |
| 182 { | |
| 183 &Entry{ | |
| 184 id: 6775, | |
| 185 hash: "bogushash", | |
| 186 description: "something", | |
| 187 }, | |
| 188 "6775:bogushash:c29tZXRoaW5n", | |
| 189 }, | |
| 190 {shadowed, basicShadow}, | |
| 191 {anotherShadowed, anotherShadow}, | |
| 192 } | |
| 193 for _, c := range cases { | |
| 194 got := string(c.entry.Encode()) | |
| 195 if got != c.want { | |
| 196 t.Errorf("entry.Encode() = %q, want %q", got, c.want) | |
| 197 } | |
| 198 } | |
| 199 } |
