1// Copyright 2021 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package git
5
6import (
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11)
12
13func TestParseTreeEntriesLong(t *testing.T) {
14 testCases := []struct {
15 Input string
16 Expected []*TreeEntry
17 }{
18 {
19 Input: `100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af 8218 README.md
20100644 blob 037f27dc9d353ae4fd50f0474b2194c593914e35 4681 README_ZH.md
21100644 blob 9846a94f7e8350a916632929d0fda38c90dd2ca8 429 SECURITY.md
22040000 tree 84b90550547016f73c5dd3f50dea662389e67b6d - assets
23`,
24 Expected: []*TreeEntry{
25 {
26 ID: MustIDFromString("ea0d83c9081af9500ac9f804101b3fd0a5c293af"),
27 name: "README.md",
28 entryMode: EntryModeBlob,
29 size: 8218,
30 sized: true,
31 },
32 {
33 ID: MustIDFromString("037f27dc9d353ae4fd50f0474b2194c593914e35"),
34 name: "README_ZH.md",
35 entryMode: EntryModeBlob,
36 size: 4681,
37 sized: true,
38 },
39 {
40 ID: MustIDFromString("9846a94f7e8350a916632929d0fda38c90dd2ca8"),
41 name: "SECURITY.md",
42 entryMode: EntryModeBlob,
43 size: 429,
44 sized: true,
45 },
46 {
47 ID: MustIDFromString("84b90550547016f73c5dd3f50dea662389e67b6d"),
48 name: "assets",
49 entryMode: EntryModeTree,
50 sized: true,
51 },
52 },
53 },
54 }
55 for _, testCase := range testCases {
56 entries, err := ParseTreeEntries([]byte(testCase.Input))
57 require.NoError(t, err)
58 assert.Len(t, entries, len(testCase.Expected))
59 for i, entry := range entries {
60 assert.Equal(t, testCase.Expected[i], entry)
61 }
62 }
63}
64
65func TestParseTreeEntriesShort(t *testing.T) {
66 testCases := []struct {
67 Input string
68 Expected []*TreeEntry
69 }{
70 {
71 Input: `100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af README.md
72040000 tree 84b90550547016f73c5dd3f50dea662389e67b6d assets
73`,
74 Expected: []*TreeEntry{
75 {
76 ID: MustIDFromString("ea0d83c9081af9500ac9f804101b3fd0a5c293af"),
77 name: "README.md",
78 entryMode: EntryModeBlob,
79 },
80 {
81 ID: MustIDFromString("84b90550547016f73c5dd3f50dea662389e67b6d"),
82 name: "assets",
83 entryMode: EntryModeTree,
84 },
85 },
86 },
87 }
88 for _, testCase := range testCases {
89 entries, err := ParseTreeEntries([]byte(testCase.Input))
90 require.NoError(t, err)
91 assert.Len(t, entries, len(testCase.Expected))
92 for i, entry := range entries {
93 assert.Equal(t, testCase.Expected[i], entry)
94 }
95 }
96}
97
98func TestParseTreeEntriesInvalid(t *testing.T) {
99 // there was a panic: "runtime error: slice bounds out of range" when the input was invalid: #20315
100 entries, err := ParseTreeEntries([]byte("100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af"))
101 require.Error(t, err)
102 assert.Empty(t, entries)
103}