Imported Upstream version 2.3.4
[scm/test.git] / lfs / pointer_test.go
1 package lfs
2
3 import (
4         "bufio"
5         "bytes"
6         "io/ioutil"
7         "reflect"
8         "strings"
9         "testing"
10
11         "github.com/git-lfs/git-lfs/errors"
12         "github.com/stretchr/testify/assert"
13 )
14
15 func TestEncode(t *testing.T) {
16         var buf bytes.Buffer
17         pointer := NewPointer("booya", 12345, nil)
18         _, err := EncodePointer(&buf, pointer)
19         assert.Nil(t, err)
20
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")
25
26         line, err := bufReader.ReadString('\n')
27         if err == nil {
28                 t.Fatalf("More to read: %s", line)
29         }
30         assert.Equal(t, "EOF", err.Error())
31 }
32
33 func TestEncodeEmpty(t *testing.T) {
34         var buf bytes.Buffer
35         pointer := NewPointer("", 0, nil)
36         _, err := EncodePointer(&buf, pointer)
37         assert.Equal(t, nil, err)
38
39         bufReader := bufio.NewReader(&buf)
40         val, err := bufReader.ReadString('\n')
41         assert.Equal(t, "", val)
42         assert.Equal(t, "EOF", err.Error())
43 }
44
45 func TestEncodeExtensions(t *testing.T) {
46         var buf bytes.Buffer
47         exts := []*PointerExtension{
48                 NewPointerExtension("foo", 0, "foo_oid"),
49                 NewPointerExtension("bar", 1, "bar_oid"),
50                 NewPointerExtension("baz", 2, "baz_oid"),
51         }
52         pointer := NewPointer("main_oid", 12345, exts)
53         _, err := EncodePointer(&buf, pointer)
54         assert.Nil(t, err)
55
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")
63
64         line, err := bufReader.ReadString('\n')
65         if err == nil {
66                 t.Fatalf("More to read: %s", line)
67         }
68         assert.Equal(t, "EOF", err.Error())
69 }
70
71 func assertLine(t *testing.T, r *bufio.Reader, expected string) {
72         actual, err := r.ReadString('\n')
73         assert.Nil(t, err)
74         assert.Equal(t, expected, actual)
75 }
76
77 func TestDecodeTinyFile(t *testing.T) {
78         ex := "this is not a git-lfs file!"
79         p, err := DecodePointer(bytes.NewBufferString(ex))
80         if p != nil {
81                 t.Errorf("pointer was decoded: %v", p)
82         }
83
84         if !errors.IsNotAPointerError(err) {
85                 t.Errorf("error is not a NotAPointerError: %s: '%v'", reflect.TypeOf(err), err)
86         }
87 }
88
89 func TestDecode(t *testing.T) {
90         ex := `version https://git-lfs.github.com/spec/v1
91 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
92 size 12345`
93
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)
100 }
101
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
108 size 12345`
109
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)
128 }
129
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
136 size 12345`
137
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)
156 }
157
158 func TestDecodePreRelease(t *testing.T) {
159         ex := `version https://hawser.github.com/spec/v1
160 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
161 size 12345`
162
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)
169 }
170
171 func TestDecodeFromEmptyReader(t *testing.T) {
172         p, buf, err := DecodeFrom(strings.NewReader(""))
173         by, rerr := ioutil.ReadAll(buf)
174
175         assert.Nil(t, rerr)
176         assert.EqualError(t, err, "Pointer file error: invalid header")
177         assert.Nil(t, p)
178         assert.Empty(t, by)
179 }
180
181 func TestDecodeInvalid(t *testing.T) {
182         examples := []string{
183                 "invalid stuff",
184
185                 // no sha
186                 "# git-media",
187
188                 // bad oid
189                 `version https://git-lfs.github.com/spec/v1
190 oid sha256:boom
191 size 12345`,
192
193                 // bad oid type
194                 `version https://git-lfs.github.com/spec/v1
195 oid shazam:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
196 size 12345`,
197
198                 // no oid
199                 `version https://git-lfs.github.com/spec/v1
200 size 12345`,
201
202                 // bad version
203                 `version http://git-media.io/v/whatever
204 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
205 size 12345`,
206
207                 // no version
208                 `oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
209 size 12345`,
210
211                 // bad size
212                 `version https://git-lfs.github.com/spec/v1
213 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
214 size fif`,
215
216                 // no size
217                 `version https://git-lfs.github.com/spec/v1
218 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393`,
219
220                 // bad `key value` format
221                 `version=https://git-lfs.github.com/spec/v1
222 oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
223 size=fif`,
224
225                 // no git-media
226                 `version=http://wat.io/v/2
227 oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
228 size=fif`,
229
230                 // extra key
231                 `version https://git-lfs.github.com/spec/v1
232 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
233 size 12345
234 wat wat`,
235
236                 // keys out of order
237                 `version https://git-lfs.github.com/spec/v1
238 size 12345
239 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393`,
240
241                 // bad ext name
242                 `version https://git-lfs.github.com/spec/v1
243 ext-0-$$$$ sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
244 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
245 size 12345`,
246
247                 // bad ext priority
248                 `version https://git-lfs.github.com/spec/v1
249 ext-#-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
250 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
251 size 12345`,
252
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
258 size 12345`,
259
260                 // ext priority over 9
261                 `version https://git-lfs.github.com/spec/v1
262 ext-10-foo sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
263 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
264 size 12345`,
265
266                 // bad ext oid
267                 `version https://git-lfs.github.com/spec/v1
268 ext-0-foo sha256:boom
269 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
270 size 12345`,
271
272                 // bad ext oid type
273                 `version https://git-lfs.github.com/spec/v1
274 ext-0-foo boom:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
275 oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
276 size 12345`,
277         }
278
279         for _, ex := range examples {
280                 p, err := DecodePointer(bytes.NewBufferString(ex))
281                 if err == nil {
282                         t.Errorf("No error decoding: %v\nFrom:\n%s", p, strings.TrimSpace(ex))
283                 }
284         }
285 }
286
287 func assertEqualWithExample(t *testing.T, example string, expected, actual interface{}) {
288         assert.Equal(t, expected, actual, "Example:\n%s", strings.TrimSpace(example))
289 }