add tests for downloading and updating binary

This commit is contained in:
rhysd 2017-12-30 01:37:09 +09:00
parent a40a048a1c
commit 79d641a2f6
5 changed files with 188 additions and 3 deletions

View File

@ -1,6 +1,7 @@
package selfupdate
import (
"fmt"
"github.com/blang/semver"
"os"
"strings"
@ -40,6 +41,40 @@ func TestDetectReleaseWithVersionPrefix(t *testing.T) {
}
}
func TestDetectReleasesForVariousArchives(t *testing.T) {
for _, repo := range []string{
"rhysd-test/test-release-zip",
"rhysd-test/test-release-tar",
"rhysd-test/test-release-gzip",
} {
t.Run(repo, func(t *testing.T) {
r, ok, err := DetectLatest(repo)
if err != nil {
t.Fatal("Fetch failed:", err)
}
if !ok {
t.Fatal(repo, "not found")
}
if r == nil {
t.Fatal("Release not detected")
}
if !r.Version.Equals(semver.MustParse("1.2.3")) {
t.Error("")
}
url := fmt.Sprintf("https://github.com/%s/releases/tag/v1.2.3", repo)
if r.URL != url {
t.Error("URL is not wrong. Want", url, "but got", r.URL)
}
if r.ReleaseNotes == "" {
t.Error("Release note is unexpectedly empty")
}
if !strings.HasPrefix(r.AssetURL, fmt.Sprintf("https://github.com/%s/releases/download/v1.2.3/", repo)) {
t.Error("Unexpected asset URL:", r.AssetURL)
}
})
}
}
func TestDetectReleaseButNoAsset(t *testing.T) {
_, ok, err := DetectLatest("rhysd/clever-f.vim")
if err != nil {
@ -74,6 +109,9 @@ func TestInvalidSlug(t *testing.T) {
if err == nil {
t.Error(slug, "should be invalid slug")
}
if !strings.Contains(err.Error(), "Invalid slug format") {
t.Error("Unexpected error for", slug, ":", err)
}
}
}

View File

@ -1,6 +1,7 @@
package selfupdate
import (
"os"
"os/exec"
"testing"
)
@ -10,8 +11,12 @@ func TestRunSelfUpdateExample(t *testing.T) {
t.Skip("skipping test in short mode.")
}
t.Skip("TODO")
if err := exec.Command("go", "build", "../cmd/selfupdate-example").Run(); err != nil {
t.Fatal(err)
}
t.Fatal("TODO")
defer os.Remove("selfupdate-example")
// TODO
}

View File

@ -0,0 +1,5 @@
package main
func main() {
println("not released yet!")
}

View File

@ -13,11 +13,11 @@ import (
func UpdateTo(assetURL, cmdPath string) error {
res, err := http.Get(assetURL)
if err != nil {
return err
return fmt.Errorf("Failed to download a release file from %s: %s", assetURL, err)
}
if res.StatusCode != 200 {
return fmt.Errorf("Failed to download a release file from %s ", assetURL)
return fmt.Errorf("Failed to download a release file from %s", assetURL)
}
defer res.Body.Close()

137
selfupdate/update_test.go Normal file
View File

@ -0,0 +1,137 @@
package selfupdate
import (
"github.com/blang/semver"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
)
func setupTestBinary() {
if err := exec.Command("go", "build", "./testdata/github-release-test/").Run(); err != nil {
panic(err)
}
}
func teardownTestBinary() {
if err := os.Remove("github-release-test"); err != nil {
panic(err)
}
}
func TestUpdateCommand(t *testing.T) {
if testing.Short() {
t.Skip("skip tests in short mode.")
}
for _, slug := range []string{
"rhysd-test/test-release-zip",
"rhysd-test/test-release-tar",
"rhysd-test/test-release-gzip",
} {
t.Run(slug, func(t *testing.T) {
setupTestBinary()
defer teardownTestBinary()
latest := semver.MustParse("1.2.3")
prev := semver.MustParse("1.2.2")
rel, err := UpdateCommand("github-release-test", prev, slug)
if err != nil {
t.Fatal(err)
}
if rel.Version.NE(latest) {
t.Error("Version is not latest", rel.Version)
}
bytes, err := exec.Command(filepath.FromSlash("./github-release-test")).Output()
if err != nil {
t.Fatal("Failed to run test binary after update:", err)
}
out := string(bytes)
if out != "v1.2.3\n" {
t.Error("Output from test binary after update is unexpected:", out)
}
})
}
}
func TestNoReleaseFoundForUpdate(t *testing.T) {
v := semver.MustParse("1.0.0")
rel, err := UpdateCommand("foo", v, "rhysd/misc")
if err != nil {
t.Fatal("No release should not make an error:", err)
}
if rel.Version.NE(v) {
t.Error("No release should return the current version as the latest:", rel.Version)
}
if rel.URL != "" {
t.Error("Browse URL should be empty when no release found:", rel.URL)
}
if rel.AssetURL != "" {
t.Error("Asset URL should be empty when no release found:", rel.AssetURL)
}
if rel.ReleaseNotes != "" {
t.Error("Release notes should be empty when no release found:", rel.ReleaseNotes)
}
}
func TestCurrentIsTheLatest(t *testing.T) {
v := semver.MustParse("1.2.3")
rel, err := UpdateCommand("github-release-test", v, "rhysd-test/test-release-zip")
if err != nil {
t.Fatal(err)
}
if rel.Version.NE(v) {
t.Error("v1.2.3 should be the latest:", rel.Version)
}
if rel.URL == "" {
t.Error("Browse URL should not be empty when release found:", rel.URL)
}
if rel.AssetURL == "" {
t.Error("Asset URL should not be empty when release found:", rel.AssetURL)
}
if rel.ReleaseNotes == "" {
t.Error("Release notes should not be empty when release found:", rel.ReleaseNotes)
}
}
func TestBrokenBinaryUpdate(t *testing.T) {
_, err := UpdateCommand("foo", semver.MustParse("1.2.2"), "rhysd-test/test-incorrect-release")
if err == nil {
t.Fatal("Error should occur for broken package")
}
if !strings.Contains(err.Error(), "Failed to uncompress .tar.gz file") {
t.Fatal("Unexpected error:", err)
}
}
func TestInvalidSlugForUpdate(t *testing.T) {
_, err := UpdateCommand("foo", semver.MustParse("1.0.0"), "rhysd/")
if err == nil {
t.Fatal("Unknown repo should cause an error")
}
if !strings.Contains(err.Error(), "Invalid slug format") {
t.Fatal("Unexpected error:", err)
}
}
func TestInvalidAssetURL(t *testing.T) {
err := UpdateTo("https://github.com/rhysd/non-existing-repo/releases/download/v1.2.3/foo.zip", "foo")
if err == nil {
t.Fatal("Error should occur for URL not found")
}
if !strings.Contains(err.Error(), "Failed to download a release file") {
t.Fatal("Unexpected error:", err)
}
}
func TestBrokenAsset(t *testing.T) {
asset := "https://github.com/rhysd-test/test-incorrect-release/releases/download/invalid/broken-zip.zip"
err := UpdateTo(asset, "foo")
if err == nil {
t.Fatal("Error should occur for URL not found")
}
if !strings.Contains(err.Error(), "Failed to uncompress zip file") {
t.Fatal("Unexpected error:", err)
}
}