Skip to content

Commit

Permalink
Add unit tests for getDynamicVersion
Browse files Browse the repository at this point in the history
  • Loading branch information
LinuxSuRen committed Apr 9, 2022
1 parent 6374adc commit cde3a2e
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 13 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ require (
github.com/stretchr/testify v1.7.0
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8
gopkg.in/yaml.v2 v2.4.0
github.com/h2non/gock v1.0.9
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
github.com/h2non/gock v1.0.9 h1:17gCehSo8ZOgEsFKpQgqHiR7VLyjxdAG3lkhVvO9QZU=
github.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
Expand Down
36 changes: 23 additions & 13 deletions pkg/installer/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,19 +230,11 @@ func (o *Installer) ProviderURLParse(path string, acceptPreRelease bool) (packag
}
}

// parse the version if it's an URL
if cfg.Version != "" && (strings.HasPrefix(cfg.Version, "http://") || strings.HasPrefix(cfg.Version, "https://")) {
var resp *http.Response
if resp, err = http.Get(cfg.Version); err != nil || resp.StatusCode != http.StatusOK {
err = fmt.Errorf("cannot get version from '%s', error is '%v', status code is '%d'", cfg.Version, err, resp.StatusCode)
return
}
var data []byte
if data, err = ioutil.ReadAll(resp.Body); err != nil {
err = fmt.Errorf("failed to get version from '%s', error is '%v'", cfg.Version, err)
return
}
hdPkg.Version = string(data)
var ver string
if ver, err = getDynamicVersion(cfg.Version); ver != "" {
hdPkg.Version = ver
} else if err != nil {
return
}

if cfg.URL != "" {
Expand Down Expand Up @@ -299,6 +291,24 @@ func (o *Installer) ProviderURLParse(path string, acceptPreRelease bool) (packag
return
}

// parse the version if it's an URL
func getDynamicVersion(version string) (realVersion string, err error) {
if version != "" && (strings.HasPrefix(version, "http://") || strings.HasPrefix(version, "https://")) {
var resp *http.Response
if resp, err = http.Get(version); err != nil || resp.StatusCode != http.StatusOK {
err = fmt.Errorf("cannot get version from '%s', error is '%v', status code is '%d'", version, err, resp.StatusCode)
return
}
var data []byte
if data, err = ioutil.ReadAll(resp.Body); err != nil {
err = fmt.Errorf("failed to get version from '%s', error is '%v'", version, err)
return
}
realVersion = string(data)
}
return
}

func getVersionOrDefault(version string, defaultVer string) (target string) {
target = defaultVer
// for the security reason, only support https
Expand Down
42 changes: 42 additions & 0 deletions pkg/installer/check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package installer

import (
"fmt"
"github.com/h2non/gock"
"github.com/stretchr/testify/assert"
"net/http"
"os"
"path"
"runtime"
Expand Down Expand Up @@ -372,3 +374,43 @@ func Test_getHDConfig(t *testing.T) {
})
}
}

func Test_getDynamicVersion(t *testing.T) {
const fakeVersionURL = "https://fake.com"
const expectVersion = "v1.1.1"

tests := []struct {
name string
prepare func()
expectVersion string
expectError bool
}{{
name: "normal case",
prepare: func() {
gock.New(fakeVersionURL).Get("/").Reply(http.StatusOK).BodyString(expectVersion)
},
expectVersion: expectVersion,
expectError: false,
}, {
name: "got statusCode which is not 200",
prepare: func() {
gock.New(fakeVersionURL).Get("/").Reply(http.StatusNotFound)
},
expectVersion: "",
expectError: true,
}}
for i := range tests {
tt := tests[i]
t.Run(tt.name, func(t *testing.T) {
defer gock.Off()
tt.prepare()
version, err := getDynamicVersion(fakeVersionURL)
assert.Equal(t, tt.expectVersion, version)
if tt.expectError {
assert.NotNil(t, err)
} else {
assert.Nil(t, err)
}
})
}
}

0 comments on commit cde3a2e

Please sign in to comment.