gopkg/refs_test.go
2015-01-12 23:22:38 -02:00

195 lines
5.8 KiB
Go

package main
import (
"bytes"
"fmt"
. "gopkg.in/check.v1"
"sort"
)
var _ = Suite(&RefsSuite{})
type RefsSuite struct{}
type refsTest struct {
summary string
original string
version string
changed string
versions []string
}
var refsTests = []refsTest{{
"Version v0 works even without any references",
reflines(
"hash1 HEAD",
),
"v0",
reflines(
"hash1 HEAD",
),
nil,
}, {
"Preserve original capabilities",
reflines(
"hash1 HEAD\x00caps",
),
"v0",
reflines(
"hash1 HEAD\x00caps",
),
nil,
}, {
"Matching major version branch",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash2 refs/heads/v0",
"00000000000000000000000000000000000hash3 refs/heads/v1",
"00000000000000000000000000000000000hash4 refs/heads/v2",
),
"v1",
reflines(
"00000000000000000000000000000000000hash3 HEAD\x00symref=HEAD:refs/heads/v1",
"00000000000000000000000000000000000hash3 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/heads/v0",
"00000000000000000000000000000000000hash3 refs/heads/v1",
"00000000000000000000000000000000000hash4 refs/heads/v2",
),
[]string{"v0", "v1", "v2"},
}, {
"Matching minor version branch",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash2 refs/heads/v1.1",
"00000000000000000000000000000000000hash3 refs/heads/v1.3",
"00000000000000000000000000000000000hash4 refs/heads/v1.2",
),
"v1",
reflines(
"00000000000000000000000000000000000hash3 HEAD\x00symref=HEAD:refs/heads/v1.3",
"00000000000000000000000000000000000hash3 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/heads/v1.1",
"00000000000000000000000000000000000hash3 refs/heads/v1.3",
"00000000000000000000000000000000000hash4 refs/heads/v1.2",
),
[]string{"v1.1", "v1.2", "v1.3"},
}, {
"Disable original symref capability",
reflines(
"00000000000000000000000000000000000hash1 HEAD\x00foo symref=bar baz",
"00000000000000000000000000000000000hash2 refs/heads/v1",
),
"v1",
reflines(
"00000000000000000000000000000000000hash2 HEAD\x00symref=HEAD:refs/heads/v1 foo oldref=bar baz",
"00000000000000000000000000000000000hash2 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/heads/v1",
),
[]string{"v1"},
}, {
"Replace original master branch",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash1 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/heads/v1",
),
"v1",
reflines(
"00000000000000000000000000000000000hash2 HEAD\x00symref=HEAD:refs/heads/v1",
"00000000000000000000000000000000000hash2 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/heads/v1",
),
[]string{"v1"},
}, {
"Matching tag",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash2 refs/tags/v0",
"00000000000000000000000000000000000hash3 refs/tags/v1",
"00000000000000000000000000000000000hash4 refs/tags/v2",
),
"v1",
reflines(
"00000000000000000000000000000000000hash3 HEAD",
"00000000000000000000000000000000000hash3 refs/heads/master",
"00000000000000000000000000000000000hash2 refs/tags/v0",
"00000000000000000000000000000000000hash3 refs/tags/v1",
"00000000000000000000000000000000000hash4 refs/tags/v2",
),
[]string{"v0", "v1", "v2"},
}, {
"Tag peeling",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash2 refs/heads/master",
"00000000000000000000000000000000000hash3 refs/tags/v1",
"00000000000000000000000000000000000hash4 refs/tags/v1^{}",
"00000000000000000000000000000000000hash5 refs/tags/v2",
),
"v1",
reflines(
"00000000000000000000000000000000000hash4 HEAD",
"00000000000000000000000000000000000hash4 refs/heads/master",
"00000000000000000000000000000000000hash3 refs/tags/v1",
"00000000000000000000000000000000000hash4 refs/tags/v1^{}",
"00000000000000000000000000000000000hash5 refs/tags/v2",
),
[]string{"v1", "v1", "v2"},
}, {
"Matching unstable versions",
reflines(
"00000000000000000000000000000000000hash1 HEAD",
"00000000000000000000000000000000000hash2 refs/heads/master",
"00000000000000000000000000000000000hash3 refs/heads/v1",
"00000000000000000000000000000000000hash4 refs/heads/v1.1-unstable",
"00000000000000000000000000000000000hash5 refs/heads/v1.3-unstable",
"00000000000000000000000000000000000hash6 refs/heads/v1.2-unstable",
"00000000000000000000000000000000000hash7 refs/heads/v2",
),
"v1-unstable",
reflines(
"00000000000000000000000000000000000hash5 HEAD\x00symref=HEAD:refs/heads/v1.3-unstable",
"00000000000000000000000000000000000hash5 refs/heads/master",
"00000000000000000000000000000000000hash3 refs/heads/v1",
"00000000000000000000000000000000000hash4 refs/heads/v1.1-unstable",
"00000000000000000000000000000000000hash5 refs/heads/v1.3-unstable",
"00000000000000000000000000000000000hash6 refs/heads/v1.2-unstable",
"00000000000000000000000000000000000hash7 refs/heads/v2",
),
[]string{"v1", "v1.1-unstable", "v1.2-unstable", "v1.3-unstable", "v2"},
}}
func reflines(lines ...string) string {
var buf bytes.Buffer
buf.WriteString("001e# service=git-upload-pack\n0000")
for _, l := range lines {
buf.WriteString(fmt.Sprintf("%04x%s\n", len(l)+5, l))
}
buf.WriteString("0000")
return buf.String()
}
func (s *RefsSuite) TestChangeRefs(c *C) {
for _, test := range refsTests {
c.Logf(test.summary)
v, ok := parseVersion(test.version)
if !ok {
c.Fatalf("Test has an invalid version: %q", test.version)
}
changed, versions, err := changeRefs([]byte(test.original), v)
c.Assert(err, IsNil)
c.Assert(string(changed), Equals, test.changed)
sort.Sort(versions)
var vs []string
for _, v := range versions {
vs = append(vs, v.String())
}
c.Assert(vs, DeepEquals, test.versions)
}
}