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  }