1package lfs
2
3import (
4 "errors"
5 "path"
6 "strconv"
7 "testing"
8)
9
10func TestReadPointer(t *testing.T) {
11 cases := []struct {
12 name string
13 content string
14 want Pointer
15 wantErr error
16 wantErrp interface{}
17 }{
18 {
19 name: "valid pointer",
20 content: `version https://git-lfs.github.com/spec/v1
21oid sha256:1234567890123456789012345678901234567890123456789012345678901234
22size 1234
23`,
24 want: Pointer{
25 Oid: "1234567890123456789012345678901234567890123456789012345678901234",
26 Size: 1234,
27 },
28 },
29 {
30 name: "invalid prefix",
31 content: `version https://foobar/spec/v2
32oid sha256:1234567890123456789012345678901234567890123456789012345678901234
33size 1234
34`,
35 wantErr: ErrMissingPrefix,
36 },
37 {
38 name: "invalid oid",
39 content: `version https://git-lfs.github.com/spec/v1
40oid sha256:&2345a78$012345678901234567890123456789012345678901234567890123
41size 1234
42`,
43 wantErr: ErrInvalidOIDFormat,
44 },
45 {
46 name: "invalid size",
47 content: `version https://git-lfs.github.com/spec/v1
48oid sha256:1234567890123456789012345678901234567890123456789012345678901234
49size abc
50`,
51 wantErrp: &strconv.NumError{},
52 },
53 {
54 name: "invalid structure",
55 content: `version https://git-lfs.github.com/spec/v1
56`,
57 wantErr: ErrInvalidStructure,
58 },
59 {
60 name: "empty pointer",
61 wantErr: ErrMissingPrefix,
62 },
63 }
64
65 for _, tc := range cases {
66 t.Run(tc.name, func(t *testing.T) {
67 p, err := ReadPointerFromBuffer([]byte(tc.content))
68 if err != tc.wantErr && !errors.As(err, &tc.wantErrp) {
69 t.Errorf("ReadPointerFromBuffer() error = %v(%T), wantErr %v(%T)", err, err, tc.wantErr, tc.wantErr)
70 return
71 }
72 if err != nil {
73 return
74 }
75
76 if err == nil {
77 if !p.IsValid() {
78 t.Errorf("Expected a valid pointer")
79 return
80 }
81 if path.Join(p.Oid[:2], p.Oid[2:4], p.Oid) != p.RelativePath() {
82 t.Errorf("Expected a valid relative path")
83 return
84 }
85 }
86
87 if p.Oid != tc.want.Oid {
88 t.Errorf("ReadPointerFromBuffer() oid = %v, want %v", p.Oid, tc.want.Oid)
89 }
90 if p.Size != tc.want.Size {
91 t.Errorf("ReadPointerFromBuffer() size = %v, want %v", p.Size, tc.want.Size)
92 }
93 })
94 }
95}