11 "github.com/git-lfs/git-lfs/errors"
12 "github.com/stretchr/testify/assert"
15 func TestEncode(t *testing.T) {
17 pointer := NewPointer("booya", 12345, nil)
18 _, err := EncodePointer(&buf, pointer)
21 bufReader := bufio.NewReader(&buf)
22 assertLine(t, bufReader, "version https://git-lfs.github.com/spec/v1\n")
23 assertLine(t, bufReader, "oid sha256:booya\n")
24 assertLine(t, bufReader, "size 12345\n")
26 line, err := bufReader.ReadString('\n')
28 t.Fatalf("More to read: %s", line)
30 assert.Equal(t, "EOF", err.Error())
33 func TestEncodeEmpty(t *testing.T) {
35 pointer := NewPointer("", 0, nil)
36 _, err := EncodePointer(&buf, pointer)
37 assert.Equal(t, nil, err)
39 bufReader := bufio.NewReader(&buf)
40 val, err := bufReader.ReadString('\n')
41 assert.Equal(t, "", val)
42 assert.Equal(t, "EOF", err.Error())
45 func TestEncodeExtensions(t *testing.T) {
47 exts := []*PointerExtension{
48 NewPointerExtension("foo", 0, "foo_oid"),
49 NewPointerExtension("bar", 1, "bar_oid"),
50 NewPointerExtension("baz", 2, "baz_oid"),
52 pointer := NewPointer("main_oid", 12345, exts)
53 _, err := EncodePointer(&buf, pointer)
56 bufReader := bufio.NewReader(&buf)
57 assertLine(t, bufReader, "version https://git-lfs.github.com/spec/v1\n")
58 assertLine(t, bufReader, "ext-0-foo sha256:foo_oid\n")
59 assertLine(t, bufReader, "ext-1-bar sha256:bar_oid\n")
60 assertLine(t, bufReader, "ext-2-baz sha256:baz_oid\n")
61 assertLine(t, bufReader, "oid sha256:main_oid\n")
62 assertLine(t, bufReader, "size 12345\n")
64 line, err := bufReader.ReadString('\n')
66 t.Fatalf("More to read: %s", line)
68 assert.Equal(t, "EOF", err.Error())
71 func assertLine(t *testing.T, r *bufio.Reader, expected string) {
72 actual, err := r.ReadString('\n')
74 assert.Equal(t, expected, actual)
77 func TestDecodeTinyFile(t *testing.T) {
78 ex := "this is not a git-lfs file!"
79 p, err := DecodePointer(bytes.NewBufferString(ex))
81 t.Errorf("pointer was decoded: %v", p)
84 if !errors.IsNotAPointerError(err) {
85 t.Errorf("error is not a NotAPointerError: %s: '%v'", reflect.TypeOf(err), err)
89 func TestDecode(t *testing.T) {
90 ex := `version https://git-lfs.github.com/spec/v1
91 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
94 p, err := DecodePointer(bytes.NewBufferString(ex))
95 assertEqualWithExample(t, ex, nil, err)
96 assertEqualWithExample(t, ex, latest, p.Version)
97 assertEqualWithExample(t, ex, "4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393", p.Oid)
98 assertEqualWithExample(t, ex, "sha256", p.OidType)
99 assertEqualWithExample(t, ex, int64(12345), p.Size)
102 func TestDecodeExtensions(t *testing.T) {
103 ex := `version https://git-lfs.github.com/spec/v1
104 ext-0-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
105 ext-1-bar sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
106 ext-2-baz sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
107 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
110 p, err := DecodePointer(bytes.NewBufferString(ex))
111 assertEqualWithExample(t, ex, nil, err)
112 assertEqualWithExample(t, ex, latest, p.Version)
113 assertEqualWithExample(t, ex, "4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393", p.Oid)
114 assertEqualWithExample(t, ex, int64(12345), p.Size)
115 assertEqualWithExample(t, ex, "sha256", p.OidType)
116 assertEqualWithExample(t, ex, "foo", p.Extensions[0].Name)
117 assertEqualWithExample(t, ex, 0, p.Extensions[0].Priority)
118 assertEqualWithExample(t, ex, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", p.Extensions[0].Oid)
119 assertEqualWithExample(t, ex, "sha256", p.Extensions[0].OidType)
120 assertEqualWithExample(t, ex, "bar", p.Extensions[1].Name)
121 assertEqualWithExample(t, ex, 1, p.Extensions[1].Priority)
122 assertEqualWithExample(t, ex, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", p.Extensions[1].Oid)
123 assertEqualWithExample(t, ex, "sha256", p.Extensions[1].OidType)
124 assertEqualWithExample(t, ex, "baz", p.Extensions[2].Name)
125 assertEqualWithExample(t, ex, 2, p.Extensions[2].Priority)
126 assertEqualWithExample(t, ex, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", p.Extensions[2].Oid)
127 assertEqualWithExample(t, ex, "sha256", p.Extensions[2].OidType)
130 func TestDecodeExtensionsSort(t *testing.T) {
131 ex := `version https://git-lfs.github.com/spec/v1
132 ext-2-baz sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
133 ext-0-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
134 ext-1-bar sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
135 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
138 p, err := DecodePointer(bytes.NewBufferString(ex))
139 assertEqualWithExample(t, ex, nil, err)
140 assertEqualWithExample(t, ex, latest, p.Version)
141 assertEqualWithExample(t, ex, "4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393", p.Oid)
142 assertEqualWithExample(t, ex, int64(12345), p.Size)
143 assertEqualWithExample(t, ex, "sha256", p.OidType)
144 assertEqualWithExample(t, ex, "foo", p.Extensions[0].Name)
145 assertEqualWithExample(t, ex, 0, p.Extensions[0].Priority)
146 assertEqualWithExample(t, ex, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", p.Extensions[0].Oid)
147 assertEqualWithExample(t, ex, "sha256", p.Extensions[0].OidType)
148 assertEqualWithExample(t, ex, "bar", p.Extensions[1].Name)
149 assertEqualWithExample(t, ex, 1, p.Extensions[1].Priority)
150 assertEqualWithExample(t, ex, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", p.Extensions[1].Oid)
151 assertEqualWithExample(t, ex, "sha256", p.Extensions[1].OidType)
152 assertEqualWithExample(t, ex, "baz", p.Extensions[2].Name)
153 assertEqualWithExample(t, ex, 2, p.Extensions[2].Priority)
154 assertEqualWithExample(t, ex, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", p.Extensions[2].Oid)
155 assertEqualWithExample(t, ex, "sha256", p.Extensions[2].OidType)
158 func TestDecodePreRelease(t *testing.T) {
159 ex := `version https://hawser.github.com/spec/v1
160 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
163 p, err := DecodePointer(bytes.NewBufferString(ex))
164 assertEqualWithExample(t, ex, nil, err)
165 assertEqualWithExample(t, ex, latest, p.Version)
166 assertEqualWithExample(t, ex, "4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393", p.Oid)
167 assertEqualWithExample(t, ex, "sha256", p.OidType)
168 assertEqualWithExample(t, ex, int64(12345), p.Size)
171 func TestDecodeFromEmptyReader(t *testing.T) {
172 p, buf, err := DecodeFrom(strings.NewReader(""))
173 by, rerr := ioutil.ReadAll(buf)
176 assert.EqualError(t, err, "Pointer file error: invalid header")
181 func TestDecodeInvalid(t *testing.T) {
182 examples := []string{
189 `version https://git-lfs.github.com/spec/v1
194 `version https://git-lfs.github.com/spec/v1
195 oid shazam:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
199 `version https://git-lfs.github.com/spec/v1
203 `version http://git-media.io/v/whatever
204 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
208 `oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
212 `version https://git-lfs.github.com/spec/v1
213 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
217 `version https://git-lfs.github.com/spec/v1
218 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393`,
220 // bad `key value` format
221 `version=https://git-lfs.github.com/spec/v1
222 oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
226 `version=http://wat.io/v/2
227 oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
231 `version https://git-lfs.github.com/spec/v1
232 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
237 `version https://git-lfs.github.com/spec/v1
239 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393`,
242 `version https://git-lfs.github.com/spec/v1
243 ext-0-$$$$ sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
244 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
248 `version https://git-lfs.github.com/spec/v1
249 ext-#-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
250 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
253 // duplicate ext priority
254 `version https://git-lfs.github.com/spec/v1
255 ext-0-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
256 ext-0-bar sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
257 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
260 // ext priority over 9
261 `version https://git-lfs.github.com/spec/v1
262 ext-10-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
263 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
267 `version https://git-lfs.github.com/spec/v1
268 ext-0-foo sha256:boom
269 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
273 `version https://git-lfs.github.com/spec/v1
274 ext-0-foo boom:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
275 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
279 for _, ex := range examples {
280 p, err := DecodePointer(bytes.NewBufferString(ex))
282 t.Errorf("No error decoding: %v\nFrom:\n%s", p, strings.TrimSpace(ex))
287 func assertEqualWithExample(t *testing.T, example string, expected, actual interface{}) {
288 assert.Equal(t, expected, actual, "Example:\n%s", strings.TrimSpace(example))