gittuf/internal/common/common.go
Aditya Sirish 79efbf235f
gitinterface: Support types for tree entries
Signed-off-by: Aditya Sirish <aditya@saky.in>
2025-02-02 14:07:34 -05:00

136 lines
4 KiB
Go

// Copyright The gittuf Authors
// SPDX-License-Identifier: Apache-2.0
package common
import (
"fmt"
"testing"
"time"
"github.com/gittuf/gittuf/internal/gitinterface"
"github.com/gittuf/gittuf/internal/rsl"
"github.com/go-git/go-git/v5/config"
"github.com/jonboulle/clockwork"
)
const (
testName = "Jane Doe"
testEmail = "jane.doe@example.com"
)
var (
TestGitConfig = &config.Config{
User: struct {
Name string
Email string
}{
Name: testName,
Email: testEmail,
},
}
TestClock = clockwork.NewFakeClockAt(time.Date(1995, time.October, 26, 9, 0, 0, 0, time.UTC))
)
// CreateTestRSLReferenceEntryCommit is a test helper used to create a
// **signed** reference entry using the specified GPG key. It is used to
// substitute for the default RSL entry creation and signing mechanism which
// relies on the user's Git config.
//
// Update: This helper just wraps around CommitUsingSpecificKey in the rsl
// package. We can probably get rid of it, but it's a pretty big delta.
func CreateTestRSLReferenceEntryCommit(t *testing.T, repo *gitinterface.Repository, entry *rsl.ReferenceEntry, signingKeyBytes []byte) gitinterface.Hash {
t.Helper()
if err := entry.CommitUsingSpecificKey(repo, signingKeyBytes); err != nil {
t.Fatal(err)
}
entryID, err := repo.GetReference(rsl.Ref)
if err != nil {
t.Fatal(err)
}
return entryID
}
// CreateTestRSLAnnotationEntryCommit is a test helper used to create a
// **signed** RSL annotation using the specified GPG key. It is used to
// substitute for the default RSL annotation creation and signing mechanism
// which relies on the user's Git config.
//
// Update: This helper just wraps around CommitUsingSpecificKey in the rsl
// package. We can probably get rid of it, but it's a pretty big delta.
func CreateTestRSLAnnotationEntryCommit(t *testing.T, repo *gitinterface.Repository, annotation *rsl.AnnotationEntry, signingKeyBytes []byte) gitinterface.Hash {
t.Helper()
if err := annotation.CommitUsingSpecificKey(repo, signingKeyBytes); err != nil {
t.Fatal(err)
}
entryID, err := repo.GetReference(rsl.Ref)
if err != nil {
t.Fatal(err)
}
return entryID
}
// AddNTestCommitsToSpecifiedRef is a test helper that adds test commits to the
// specified Git ref in the provided repository. Parameter `n` determines how
// many commits are added. Each commit is associated with a distinct tree. The
// first commit contains a tree with one object (an empty blob), the second with
// two objects (both empty blobs), and so on. Each commit is signed using the
// specified key.
func AddNTestCommitsToSpecifiedRef(t *testing.T, repo *gitinterface.Repository, refName string, n int, signingKeyBytes []byte) []gitinterface.Hash {
t.Helper()
emptyBlobHash, err := repo.WriteBlob(nil)
if err != nil {
t.Fatal(err)
}
treeBuilder := gitinterface.NewTreeBuilder(repo)
// Create N trees with 1...N artifacts
treeHashes := make([]gitinterface.Hash, 0, n)
for i := 1; i <= n; i++ {
objects := []gitinterface.TreeEntry{}
for j := 0; j < i; j++ {
objects = append(objects, gitinterface.NewEntryBlob(fmt.Sprintf("%d", j+1), emptyBlobHash))
}
treeHash, err := treeBuilder.WriteTreeFromEntries(objects)
if err != nil {
t.Fatal(err)
}
treeHashes = append(treeHashes, treeHash)
}
commitIDs := []gitinterface.Hash{}
for i := 0; i < n; i++ {
commitID, err := repo.CommitUsingSpecificKey(treeHashes[i], refName, "Test commit\n", signingKeyBytes)
if err != nil {
t.Fatal(err)
}
commitIDs = append(commitIDs, commitID)
}
return commitIDs
}
// CreateTestSignedTag creates a signed tag in the repository pointing to the
// target object. The tag is signed using the specified key.
func CreateTestSignedTag(t *testing.T, repo *gitinterface.Repository, tagName string, target gitinterface.Hash, signingKeyBytes []byte) gitinterface.Hash {
t.Helper()
tagMessage := fmt.Sprintf("%s\n", tagName)
tagID, err := repo.TagUsingSpecificKey(target, tagName, tagMessage, signingKeyBytes)
if err != nil {
t.Fatal(err)
}
return tagID
}