github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/git/odb/object_db_test.go (about) 1 package odb 2 3 import ( 4 "bytes" 5 "compress/zlib" 6 "encoding/hex" 7 "fmt" 8 "io" 9 "io/ioutil" 10 "strings" 11 "testing" 12 "time" 13 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestDecodeBlob(t *testing.T) { 19 sha := "af5626b4a114abcb82d63db7c8082c3c4756e51b" 20 contents := "Hello, world!\n" 21 22 var buf bytes.Buffer 23 24 zw := zlib.NewWriter(&buf) 25 fmt.Fprintf(zw, "blob 14\x00%s", contents) 26 zw.Close() 27 28 odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{ 29 sha: &buf, 30 })} 31 32 shaHex, _ := hex.DecodeString(sha) 33 blob, err := odb.Blob(shaHex) 34 35 assert.Nil(t, err) 36 assert.EqualValues(t, 14, blob.Size) 37 38 got, err := ioutil.ReadAll(blob.Contents) 39 assert.Nil(t, err) 40 assert.Equal(t, contents, string(got)) 41 } 42 43 func TestDecodeTree(t *testing.T) { 44 sha := "fcb545d5746547a597811b7441ed8eba307be1ff" 45 hexSha, err := hex.DecodeString(sha) 46 require.Nil(t, err) 47 48 blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" 49 hexBlobSha, err := hex.DecodeString(blobSha) 50 require.Nil(t, err) 51 52 var buf bytes.Buffer 53 54 zw := zlib.NewWriter(&buf) 55 fmt.Fprintf(zw, "tree 37\x00") 56 fmt.Fprintf(zw, "100644 hello.txt\x00") 57 zw.Write(hexBlobSha) 58 zw.Close() 59 60 odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{ 61 sha: &buf, 62 })} 63 64 tree, err := odb.Tree(hexSha) 65 66 assert.Nil(t, err) 67 require.Equal(t, 1, len(tree.Entries)) 68 assert.Equal(t, &TreeEntry{ 69 Name: "hello.txt", 70 Oid: hexBlobSha, 71 Filemode: 0100644, 72 }, tree.Entries[0]) 73 } 74 75 func TestDecodeCommit(t *testing.T) { 76 sha := "d7283480bb6dc90be621252e1001a93871dcf511" 77 commitShaHex, err := hex.DecodeString(sha) 78 assert.Nil(t, err) 79 80 var buf bytes.Buffer 81 82 zw := zlib.NewWriter(&buf) 83 fmt.Fprintf(zw, "commit 173\x00") 84 fmt.Fprintf(zw, "tree fcb545d5746547a597811b7441ed8eba307be1ff\n") 85 fmt.Fprintf(zw, "author Taylor Blau <me@ttaylorr.com> 1494620424 -0600\n") 86 fmt.Fprintf(zw, "committer Taylor Blau <me@ttaylorr.com> 1494620424 -0600\n") 87 fmt.Fprintf(zw, "\ninitial commit\n") 88 zw.Close() 89 90 odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{ 91 sha: &buf, 92 })} 93 94 commit, err := odb.Commit(commitShaHex) 95 96 assert.Nil(t, err) 97 assert.Equal(t, "Taylor Blau <me@ttaylorr.com> 1494620424 -0600", commit.Author) 98 assert.Equal(t, "Taylor Blau <me@ttaylorr.com> 1494620424 -0600", commit.Committer) 99 assert.Equal(t, "initial commit", commit.Message) 100 assert.Equal(t, 0, len(commit.ParentIDs)) 101 assert.Equal(t, "fcb545d5746547a597811b7441ed8eba307be1ff", hex.EncodeToString(commit.TreeID)) 102 } 103 104 func TestWriteBlob(t *testing.T) { 105 fs := newMemoryStorer(make(map[string]io.ReadWriter)) 106 odb := &ObjectDatabase{s: fs} 107 108 sha, err := odb.WriteBlob(&Blob{ 109 Size: 14, 110 Contents: strings.NewReader("Hello, world!\n"), 111 }) 112 113 expected := "af5626b4a114abcb82d63db7c8082c3c4756e51b" 114 115 assert.Nil(t, err) 116 assert.Equal(t, expected, hex.EncodeToString(sha)) 117 assert.NotNil(t, fs.fs[hex.EncodeToString(sha)]) 118 } 119 120 func TestWriteTree(t *testing.T) { 121 fs := newMemoryStorer(make(map[string]io.ReadWriter)) 122 odb := &ObjectDatabase{s: fs} 123 124 blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" 125 hexBlobSha, err := hex.DecodeString(blobSha) 126 require.Nil(t, err) 127 128 sha, err := odb.WriteTree(&Tree{Entries: []*TreeEntry{ 129 { 130 Name: "hello.txt", 131 Oid: hexBlobSha, 132 Filemode: 0100644, 133 }, 134 }}) 135 136 expected := "fcb545d5746547a597811b7441ed8eba307be1ff" 137 138 assert.Nil(t, err) 139 assert.Equal(t, expected, hex.EncodeToString(sha)) 140 assert.NotNil(t, fs.fs[hex.EncodeToString(sha)]) 141 } 142 143 func TestWriteCommit(t *testing.T) { 144 fs := newMemoryStorer(make(map[string]io.ReadWriter)) 145 odb := &ObjectDatabase{s: fs} 146 147 when := time.Unix(1257894000, 0).UTC() 148 author := &Signature{Name: "John Doe", Email: "john@example.com", When: when} 149 committer := &Signature{Name: "Jane Doe", Email: "jane@example.com", When: when} 150 151 tree := "fcb545d5746547a597811b7441ed8eba307be1ff" 152 treeHex, err := hex.DecodeString(tree) 153 assert.Nil(t, err) 154 155 sha, err := odb.WriteCommit(&Commit{ 156 Author: author.String(), 157 Committer: committer.String(), 158 TreeID: treeHex, 159 Message: "initial commit", 160 }) 161 162 expected := "77a746376fdb591a44a4848b5ba308b2d3e2a90c" 163 164 assert.Nil(t, err) 165 assert.Equal(t, expected, hex.EncodeToString(sha)) 166 assert.NotNil(t, fs.fs[hex.EncodeToString(sha)]) 167 } 168 169 func TestDecodeTag(t *testing.T) { 170 const sha = "7639ba293cd2c457070e8446ecdea56682af0f48" 171 tagShaHex, err := hex.DecodeString(sha) 172 173 var buf bytes.Buffer 174 175 zw := zlib.NewWriter(&buf) 176 fmt.Fprintf(zw, "tag 165\x00") 177 fmt.Fprintf(zw, "object 6161616161616161616161616161616161616161\n") 178 fmt.Fprintf(zw, "type commit\n") 179 fmt.Fprintf(zw, "tag v2.4.0\n") 180 fmt.Fprintf(zw, "tagger A U Thor <author@example.com>\n") 181 fmt.Fprintf(zw, "\n") 182 fmt.Fprintf(zw, "The quick brown fox jumps over the lazy dog.\n") 183 zw.Close() 184 185 odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{ 186 sha: &buf, 187 })} 188 189 tag, err := odb.Tag(tagShaHex) 190 191 assert.Nil(t, err) 192 193 assert.Equal(t, []byte("aaaaaaaaaaaaaaaaaaaa"), tag.Object) 194 assert.Equal(t, CommitObjectType, tag.ObjectType) 195 assert.Equal(t, "v2.4.0", tag.Name) 196 assert.Equal(t, "A U Thor <author@example.com>", tag.Tagger) 197 assert.Equal(t, "The quick brown fox jumps over the lazy dog.", tag.Message) 198 } 199 200 func TestWriteTag(t *testing.T) { 201 fs := newMemoryStorer(make(map[string]io.ReadWriter)) 202 odb := &ObjectDatabase{s: fs} 203 204 sha, err := odb.WriteTag(&Tag{ 205 Object: []byte("aaaaaaaaaaaaaaaaaaaa"), 206 ObjectType: CommitObjectType, 207 Name: "v2.4.0", 208 Tagger: "A U Thor <author@example.com>", 209 210 Message: "The quick brown fox jumps over the lazy dog.", 211 }) 212 213 expected := "e614dda21829f4176d3db27fe62fb4aee2e2475d" 214 215 assert.Nil(t, err) 216 assert.Equal(t, expected, hex.EncodeToString(sha)) 217 assert.NotNil(t, fs.fs[hex.EncodeToString(sha)]) 218 } 219 220 func TestReadingAMissingObjectAfterClose(t *testing.T) { 221 sha, _ := hex.DecodeString("af5626b4a114abcb82d63db7c8082c3c4756e51b") 222 223 db := &ObjectDatabase{ 224 s: newMemoryStorer(nil), 225 closed: 1, 226 } 227 228 blob, err := db.Blob(sha) 229 assert.EqualError(t, err, "git/odb: cannot use closed *pack.Set") 230 assert.Nil(t, blob) 231 } 232 233 func TestClosingAnObjectDatabaseMoreThanOnce(t *testing.T) { 234 db, err := FromFilesystem("/tmp", "") 235 assert.Nil(t, err) 236 237 assert.Nil(t, db.Close()) 238 assert.EqualError(t, db.Close(), "git/odb: *ObjectDatabase already closed") 239 } 240 241 func TestObjectDatabaseRootWithRoot(t *testing.T) { 242 db, err := FromFilesystem("/foo/bar/baz", "") 243 assert.Nil(t, err) 244 245 root, ok := db.Root() 246 assert.Equal(t, "/foo/bar/baz", root) 247 assert.True(t, ok) 248 } 249 250 func TestObjectDatabaseRootWithoutRoot(t *testing.T) { 251 root, ok := new(ObjectDatabase).Root() 252 253 assert.Equal(t, "", root) 254 assert.False(t, ok) 255 }