blob: d242f3eedda6e06c66aceb83b28f9a8c98e7600b [file] [log] [blame]
package vcs
import (
"io/ioutil"
"path/filepath"
"time"
//"log"
"os"
"testing"
)
// To verify svn is working we perform integration testing
// with a known svn service.
// Canary test to ensure SvnRepo implements the Repo interface.
var _ Repo = &SvnRepo{}
func TestSvn(t *testing.T) {
tempDir, err := ioutil.TempDir("", "go-vcs-svn-tests")
if err != nil {
t.Error(err)
}
defer func() {
err = os.RemoveAll(tempDir)
if err != nil {
t.Error(err)
}
}()
repo, err := NewSvnRepo("https://github.com/Masterminds/VCSTestRepo/trunk", tempDir+"/VCSTestRepo")
if err != nil {
t.Error(err)
}
if repo.Vcs() != Svn {
t.Error("Svn is detecting the wrong type")
}
// Check the basic getters.
if repo.Remote() != "https://github.com/Masterminds/VCSTestRepo/trunk" {
t.Error("Remote not set properly")
}
if repo.LocalPath() != tempDir+"/VCSTestRepo" {
t.Error("Local disk location not set properly")
}
//Logger = log.New(os.Stdout, "", log.LstdFlags)
// Do an initial checkout.
err = repo.Get()
if err != nil {
t.Errorf("Unable to checkout SVN repo. Err was %s", err)
}
// Verify SVN repo is a SVN repo
if repo.CheckLocal() == false {
t.Error("Problem checking out repo or SVN CheckLocal is not working")
}
// Verify an incorrect remote is caught when NewSvnRepo is used on an existing location
_, nrerr := NewSvnRepo("https://github.com/Masterminds/VCSTestRepo/unknownbranch", tempDir+"/VCSTestRepo")
if nrerr != ErrWrongRemote {
t.Error("ErrWrongRemote was not triggered for SVN")
}
// Test internal lookup mechanism used outside of Hg specific functionality.
ltype, err := DetectVcsFromFS(tempDir + "/VCSTestRepo")
if err != nil {
t.Error("detectVcsFromFS unable to Svn repo")
}
if ltype != Svn {
t.Errorf("detectVcsFromFS detected %s instead of Svn type", ltype)
}
// Commenting out auto-detection tests for SVN. NewRepo automatically detects
// GitHub to be a Git repo and that's an issue for this test. Need an
// SVN host that can autodetect from before using this test again.
//
// Test NewRepo on existing checkout. This should simply provide a working
// instance without error based on looking at the local directory.
// nrepo, nrerr := NewRepo("https://github.com/Masterminds/VCSTestRepo/trunk", tempDir+"/VCSTestRepo")
// if nrerr != nil {
// t.Error(nrerr)
// }
// // Verify the right oject is returned. It will check the local repo type.
// if nrepo.CheckLocal() == false {
// t.Error("Wrong version returned from NewRepo")
// }
v, err := repo.Current()
if err != nil {
t.Errorf("Error trying Svn Current: %s", err)
}
if v != "HEAD" {
t.Errorf("Current failed to detect Svn on HEAD. Got version: %s", v)
}
// Update the version to a previous version.
err = repo.UpdateVersion("r2")
if err != nil {
t.Errorf("Unable to update SVN repo version. Err was %s", err)
}
// Use Version to verify we are on the right version.
v, err = repo.Version()
if v != "2" {
t.Error("Error checking checked SVN out version")
}
if err != nil {
t.Error(err)
}
v, err = repo.Current()
if err != nil {
t.Errorf("Error trying Svn Current for ref: %s", err)
}
if v != "2" {
t.Errorf("Current failed to detect Svn on HEAD. Got version: %s", v)
}
// Perform an update which should take up back to the latest version.
err = repo.Update()
if err != nil {
t.Error(err)
}
// Make sure we are on a newer version because of the update.
v, err = repo.Version()
if v == "2" {
t.Error("Error with version. Still on old version. Update failed")
}
if err != nil {
t.Error(err)
}
// Use Date to verify we are on the right commit.
d, err := repo.Date()
if d.Format(longForm) != "2015-07-29 13:47:03 +0000" {
t.Error("Error checking checked out Svn commit date")
}
if err != nil {
t.Error(err)
}
tags, err := repo.Tags()
if err != nil {
t.Error(err)
}
if len(tags) != 0 {
t.Error("Svn is incorrectly returning tags")
}
tags, err = repo.TagsFromCommit("2")
if err != nil {
t.Error(err)
}
if len(tags) != 0 {
t.Error("Svn is incorrectly returning tags for a commit")
}
branches, err := repo.Branches()
if err != nil {
t.Error(err)
}
if len(branches) != 0 {
t.Error("Svn is incorrectly returning branches")
}
if repo.IsReference("r4") != true {
t.Error("Svn is reporting a reference is not one")
}
if repo.IsReference("55") == true {
t.Error("Svn is reporting a non-existant reference is one")
}
if repo.IsDirty() == true {
t.Error("Svn incorrectly reporting dirty")
}
ci, err := repo.CommitInfo("2")
if err != nil {
t.Error(err)
}
if ci.Commit != "2" {
t.Error("Svn.CommitInfo wrong commit id")
}
if ci.Author != "matt.farina" {
t.Error("Svn.CommitInfo wrong author")
}
if ci.Message != "Update README.md" {
t.Error("Svn.CommitInfo wrong message")
}
ti, err := time.Parse(time.RFC3339Nano, "2015-07-29T13:46:20.000000Z")
if err != nil {
t.Error(err)
}
if !ti.Equal(ci.Date) {
t.Error("Svn.CommitInfo wrong date")
}
_, err = repo.CommitInfo("555555555")
if err != ErrRevisionUnavailable {
t.Error("Svn didn't return expected ErrRevisionUnavailable")
}
tempDir2, err := ioutil.TempDir("", "go-vcs-svn-tests-export")
if err != nil {
t.Fatalf("Error creating temp directory: %s", err)
}
defer func() {
err = os.RemoveAll(tempDir2)
if err != nil {
t.Error(err)
}
}()
exportDir := filepath.Join(tempDir2, "src")
err = repo.ExportDir(exportDir)
if err != nil {
t.Errorf("Unable to export Svn repo. Err was %s", err)
}
_, err = os.Stat(filepath.Join(exportDir, "README.md"))
if err != nil {
t.Errorf("Error checking exported file in Svn: %s", err)
}
_, err = os.Stat(filepath.Join(exportDir, string(repo.Vcs())))
if err != nil {
if found := os.IsNotExist(err); found == false {
t.Errorf("Error checking exported metadata in Svn: %s", err)
}
} else {
t.Error("Error checking Svn metadata. It exists.")
}
}
func TestSvnCheckLocal(t *testing.T) {
// Verify repo.CheckLocal fails for non-SVN directories.
// TestSvn is already checking on a valid repo
tempDir, err := ioutil.TempDir("", "go-vcs-svn-tests")
if err != nil {
t.Error(err)
}
defer func() {
err = os.RemoveAll(tempDir)
if err != nil {
t.Error(err)
}
}()
repo, _ := NewSvnRepo("", tempDir)
if repo.CheckLocal() == true {
t.Error("SVN CheckLocal does not identify non-SVN location")
}
// Test NewRepo when there's no local. This should simply provide a working
// instance without error based on looking at the remote localtion.
_, nrerr := NewRepo("https://github.com/Masterminds/VCSTestRepo/trunk", tempDir+"/VCSTestRepo")
if nrerr != nil {
t.Error(nrerr)
}
}
func TestSvnPing(t *testing.T) {
tempDir, err := ioutil.TempDir("", "go-vcs-svn-tests")
if err != nil {
t.Error(err)
}
defer func() {
err = os.RemoveAll(tempDir)
if err != nil {
t.Error(err)
}
}()
repo, err := NewSvnRepo("https://github.com/Masterminds/VCSTestRepo/trunk", tempDir)
if err != nil {
t.Error(err)
}
ping := repo.Ping()
if !ping {
t.Error("Svn unable to ping working repo")
}
repo, err = NewSvnRepo("https://github.com/Masterminds/ihopethisneverexistsbecauseitshouldnt", tempDir)
if err != nil {
t.Error(err)
}
ping = repo.Ping()
if ping {
t.Error("Svn got a ping response from when it should not have")
}
}
func TestSvnInit(t *testing.T) {
tempDir, err := ioutil.TempDir("", "go-vcs-svn-tests")
remoteDir := tempDir + "/remoteDir"
localDir := tempDir + "/localDir"
if err != nil {
t.Error(err)
}
defer func() {
err = os.RemoveAll(tempDir)
if err != nil {
t.Error(err)
}
}()
repo, err := NewSvnRepo(remoteDir, localDir)
if err != nil {
t.Error(err)
}
err = repo.Init()
if err != nil {
t.Error(err)
}
err = repo.Get()
if err != nil {
t.Error(err)
}
v, err := repo.Version()
if err != nil {
t.Error(err)
}
if v != "0" {
t.Errorf("Svn Init returns wrong version: %s", v)
}
}