github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/tlf/handle_extension_test.go (about) 1 // Copyright 2016 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package tlf 6 7 import ( 8 "testing" 9 "time" 10 11 "github.com/keybase/client/go/kbfs/kbfscodec" 12 "github.com/keybase/go-codec/codec" 13 ) 14 15 func TestHandleExtension(t *testing.T) { 16 codec := kbfscodec.NewMsgpack() 17 for _, et := range []HandleExtensionType{ 18 HandleExtensionConflict, 19 HandleExtensionFinalized, 20 } { 21 e, err := NewHandleExtension(et, 1, "alice", time.Now()) 22 if err != nil { 23 t.Fatal(err) 24 } 25 exts, err := ParseHandleExtensionSuffix(e.String()) 26 if err != nil { 27 t.Fatal(err) 28 } 29 if len(exts) != 1 { 30 t.Fatalf("Expected 1 extension, got: %d", len(exts)) 31 } 32 // check that extensions can be encoded/decoded 33 buf, err := codec.Encode(exts[0]) 34 if err != nil { 35 t.Fatal(err) 36 } 37 var e2 HandleExtension 38 err = codec.Decode(buf, &e2) 39 if err != nil { 40 t.Fatal(err) 41 } 42 if e2.Number != e.Number { 43 t.Fatalf("Expected %d, got: %d", e.Number, e2.Number) 44 } 45 if e2.Date != e.Date { 46 t.Fatalf("Expected %d, got: %d", e.Date, e2.Date) 47 } 48 if e2.String() != e.String() { 49 t.Fatalf("Expected %s, got: %s", e, e2) 50 } 51 if e.Type == HandleExtensionConflict { 52 if e2.Username != "" { 53 t.Fatalf("Expected empty username got: %s", e2.Username) 54 } 55 continue 56 } 57 if e2.Username != e.Username { 58 t.Fatalf("Expected %s, got: %s", e.Username, e2.Username) 59 } 60 } 61 } 62 63 func TestHandleExtensionNumber(t *testing.T) { 64 for _, et := range []HandleExtensionType{ 65 HandleExtensionConflict, 66 HandleExtensionFinalized, 67 } { 68 e, err := NewHandleExtension(et, 2, "bob", time.Now()) 69 if err != nil { 70 t.Fatal(err) 71 } 72 exts, err := ParseHandleExtensionSuffix(e.String()) 73 if err != nil { 74 t.Fatal(err) 75 } 76 if len(exts) != 1 { 77 t.Fatalf("Expected 1 extension, got: %d", len(exts)) 78 } 79 e2 := exts[0] 80 if e2.Number != e.Number { 81 t.Fatalf("Expected %d, got: %d", e.Number, e2.Number) 82 } 83 if e2.Date != e.Date { 84 t.Fatalf("Expected %d, got: %d", e.Date, e2.Date) 85 } 86 if e2.String() != e.String() { 87 t.Fatalf("Expected %s, got: %s", e, e2) 88 } 89 if e.Type == HandleExtensionConflict { 90 continue 91 } 92 if e2.Username != e.Username { 93 t.Fatalf("Expected %s, got: %s", e.Username, e2.Username) 94 } 95 } 96 } 97 98 func TestHandleExtensionKnownTime(t *testing.T) { 99 e := &HandleExtension{ 100 Date: 1462838400, 101 Number: 1, 102 Type: HandleExtensionFinalized, 103 Username: "alice", 104 } 105 expect := "(files before alice account reset 2016-05-10)" 106 if e.String() != expect { 107 t.Fatalf("Expected %s, got: %s", expect, e) 108 } 109 e2 := &HandleExtension{ 110 Date: 1462838400, 111 Number: 12345, 112 Type: HandleExtensionConflict, 113 } 114 expect = "(conflicted copy 2016-05-10 #12345)" 115 if e2.String() != expect { 116 t.Fatalf("Expected %s, got: %s", expect, e2) 117 } 118 e3 := &HandleExtension{ 119 Date: 1462838400, 120 Number: 2, 121 Type: HandleExtensionFinalized, 122 } 123 expect = "(files before account reset 2016-05-10 #2)" 124 if e3.String() != expect { 125 t.Fatalf("Expected %s, got: %s", expect, e3) 126 } 127 } 128 129 func TestHandleExtensionErrors(t *testing.T) { 130 _, err := NewHandleExtension(HandleExtensionConflict, 0, "", time.Now()) 131 if err != errHandleExtensionInvalidNumber { 132 t.Fatalf("Expected errHandleExtensionInvalidNumber, got: %v", err) 133 } 134 _, err = ParseHandleExtensionSuffix("(conflicted copy 2016-05-10 #0)") 135 if err != errHandleExtensionInvalidNumber { 136 t.Fatalf("Expected errHandleExtensionInvalidNumber, got: %v", err) 137 } 138 _, err = ParseHandleExtensionSuffix("nope") 139 if err != errHandleExtensionInvalidString { 140 t.Fatalf("Expected errHandleExtensionInvalidString, got: %v", err) 141 } 142 _, err = ParseHandleExtensionSuffix("(conflicted copy #2)") 143 if err != errHandleExtensionInvalidString { 144 t.Fatalf("Expected errHandleExtensionInvalidString, got: %v", err) 145 } 146 _, err = ParseHandleExtensionSuffix("(conflicted copy 2016-05-10 #)") 147 if err != errHandleExtensionInvalidString { 148 t.Fatalf("Expected errHandleExtensionInvalidString, got: %v", err) 149 } 150 } 151 152 type tlfHandleExtensionFuture struct { 153 HandleExtension 154 kbfscodec.Extra 155 } 156 157 func (ci tlfHandleExtensionFuture) ToCurrentStruct() kbfscodec.CurrentStruct { 158 return ci.HandleExtension 159 } 160 161 func TestHandleExtensionUnknownFields(t *testing.T) { 162 cFuture := kbfscodec.NewMsgpack() 163 cCurrent := kbfscodec.NewMsgpack() 164 cCurrentKnownOnly := kbfscodec.NewMsgpackNoUnknownFields() 165 kbfscodec.TestStructUnknownFields(t, 166 cFuture, cCurrent, cCurrentKnownOnly, 167 tlfHandleExtensionFuture{ 168 HandleExtension{ 169 time.Now().UTC().Unix(), 170 2, 171 HandleExtensionFinalized, 172 "", 173 codec.UnknownFieldSetHandler{}, 174 }, 175 kbfscodec.MakeExtraOrBust("HandleExtension", t), 176 }) 177 } 178 179 func TestHandleExtensionMultiple(t *testing.T) { 180 e, err := NewTestHandleExtensionStaticTime(HandleExtensionConflict, 1, "") 181 if err != nil { 182 t.Fatal(err) 183 } 184 e2, err := NewTestHandleExtensionStaticTime(HandleExtensionFinalized, 2, "charlie") 185 if err != nil { 186 t.Fatal(err) 187 } 188 exts := []HandleExtension{*e, *e2} 189 suffix := newHandleExtensionSuffix(exts, false) 190 expectSuffix := " (conflicted copy 2016-03-14) (files before charlie account reset 2016-03-14 #2)" 191 if suffix != expectSuffix { 192 t.Fatalf("Expected suffix '%s', got: '%s'", expectSuffix, suffix) 193 } 194 exts2, err := ParseHandleExtensionSuffix(suffix) 195 if err != nil { 196 t.Fatal(err) 197 } 198 if len(exts2) != 2 { 199 t.Fatalf("Expected 2 extensions, got: %d", len(exts2)) 200 } 201 for i, ext := range exts2 { 202 if ext.Number != exts[i].Number { 203 t.Fatalf("Expected %d, got: %d", exts[i].Number, ext.Number) 204 } 205 if ext.Date != exts[i].Date { 206 t.Fatalf("Expected %d, got: %d", exts[i].Date, ext.Date) 207 } 208 if ext.Username != exts[i].Username { 209 t.Fatalf("Expected %s, got: %s", exts[i].Username, ext.Username) 210 } 211 if ext.String() != exts[i].String() { 212 t.Fatalf("Expected %s, got: %s", ext, exts[i]) 213 } 214 } 215 } 216 217 func TestHandleExtensionMultipleSingleUser(t *testing.T) { 218 e, err := NewTestHandleExtensionStaticTime(HandleExtensionConflict, 2, "") 219 if err != nil { 220 t.Fatal(err) 221 } 222 e2, err := NewTestHandleExtensionStaticTime(HandleExtensionFinalized, 1, "") 223 if err != nil { 224 t.Fatal(err) 225 } 226 exts := []HandleExtension{*e, *e2} 227 suffix := newHandleExtensionSuffix(exts, false) 228 expectSuffix := " (conflicted copy 2016-03-14 #2) (files before account reset 2016-03-14)" 229 if suffix != expectSuffix { 230 t.Fatalf("Expected suffix '%s', got: '%s'", expectSuffix, suffix) 231 } 232 exts2, err := ParseHandleExtensionSuffix(suffix) 233 if err != nil { 234 t.Fatal(err) 235 } 236 if len(exts2) != 2 { 237 t.Fatalf("Expected 2 extensions, got: %d", len(exts2)) 238 } 239 for i, ext := range exts2 { 240 if ext.Number != exts[i].Number { 241 t.Fatalf("Expected %d, got: %d", exts[i].Number, ext.Number) 242 } 243 if ext.Date != exts[i].Date { 244 t.Fatalf("Expected %d, got: %d", exts[i].Date, ext.Date) 245 } 246 if ext.Username != exts[i].Username { 247 t.Fatalf("Expected %s, got: %s", exts[i].Username, ext.Username) 248 } 249 if ext.String() != exts[i].String() { 250 t.Fatalf("Expected %s, got: %s", ext, exts[i]) 251 } 252 } 253 }