mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 08:23:15 +01:00
* add check for app update; fix ETUI error handling * validate user args * add goreleaser support * replace cgo dependencies (go-rpm) with go equivalents * add acceptance tests against build snapshot * add brew tap + acceptance test pipeline * add mac acceptance tests * fix compare makefile * fix mac acceptance tests * add release pipeline with wait checks * add token to release step * rm dir presenters int test * enforce dpkg to be non interactive Co-authored-by: Alfredo Deza <adeza@anchore.com> * pin brew formulae * pin skopeo to formulae url * only run acceptance tests Co-authored-by: Alfredo Deza <adeza@anchore.com>
210 lines
4.5 KiB
Go
210 lines
4.5 KiB
Go
package version
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
hashiVersion "github.com/anchore/go-version"
|
|
)
|
|
|
|
func TestIsUpdateAvailable(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
buildVersion string
|
|
latestVersion string
|
|
code int
|
|
isAvailable bool
|
|
newVersion string
|
|
err bool
|
|
}{
|
|
{
|
|
name: "equal",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "1.0.0",
|
|
code: 200,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: false,
|
|
},
|
|
{
|
|
name: "hasUpdate",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "1.2.0",
|
|
code: 200,
|
|
isAvailable: true,
|
|
newVersion: "1.2.0",
|
|
err: false,
|
|
},
|
|
{
|
|
name: "aheadOfLatest",
|
|
buildVersion: "1.2.0",
|
|
latestVersion: "1.0.0",
|
|
code: 200,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: false,
|
|
},
|
|
{
|
|
name: "EmptyUpdate",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "",
|
|
code: 200,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: true,
|
|
},
|
|
{
|
|
name: "GarbageUpdate",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "hdfjksdhfhkj",
|
|
code: 200,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: true,
|
|
},
|
|
{
|
|
name: "BadUpdate",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "1.0.",
|
|
code: 500,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: true,
|
|
},
|
|
{
|
|
name: "NoBuildVersion",
|
|
buildVersion: valueNotProvided,
|
|
latestVersion: "1.0.0",
|
|
code: 200,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: false,
|
|
},
|
|
{
|
|
name: "BadUpdateValidVersion",
|
|
buildVersion: "1.0.0",
|
|
latestVersion: "2.0.0",
|
|
code: 404,
|
|
isAvailable: false,
|
|
newVersion: "",
|
|
err: true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
// setup mocks
|
|
// local...
|
|
version = test.buildVersion
|
|
// remote...
|
|
handler := http.NewServeMux()
|
|
handler.HandleFunc(latestAppVersionURL.path, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(test.code)
|
|
_, _ = w.Write([]byte(test.latestVersion))
|
|
})
|
|
mockSrv := httptest.NewServer(handler)
|
|
latestAppVersionURL.host = mockSrv.URL
|
|
defer mockSrv.Close()
|
|
|
|
isAvailable, newVersion, err := IsUpdateAvailable()
|
|
if err != nil && !test.err {
|
|
t.Fatalf("got error but expected none: %+v", err)
|
|
} else if err == nil && test.err {
|
|
t.Fatalf("expected error but got none")
|
|
}
|
|
|
|
if newVersion != test.newVersion {
|
|
t.Errorf("unexpected NEW version: %+v", newVersion)
|
|
}
|
|
|
|
if isAvailable != test.isAvailable {
|
|
t.Errorf("unexpected result: %+v", isAvailable)
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestFetchLatestApplicationVersion(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
response string
|
|
code int
|
|
err bool
|
|
expected *hashiVersion.Version
|
|
}{
|
|
{
|
|
name: "gocase",
|
|
response: "1.0.0",
|
|
code: 200,
|
|
expected: hashiVersion.Must(hashiVersion.NewVersion("1.0.0")),
|
|
},
|
|
{
|
|
name: "garbage",
|
|
response: "garbage",
|
|
code: 200,
|
|
expected: nil,
|
|
err: true,
|
|
},
|
|
{
|
|
name: "http 500",
|
|
response: "1.0.0",
|
|
code: 500,
|
|
expected: nil,
|
|
err: true,
|
|
},
|
|
{
|
|
name: "http 404",
|
|
response: "1.0.0",
|
|
code: 404,
|
|
expected: nil,
|
|
err: true,
|
|
},
|
|
{
|
|
name: "empty",
|
|
response: "",
|
|
code: 200,
|
|
expected: nil,
|
|
err: true,
|
|
},
|
|
{
|
|
name: "too long",
|
|
response: "this is really long this is really long this is really long this is really long this is really long this is really long this is really long this is really long ",
|
|
code: 200,
|
|
expected: nil,
|
|
err: true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
// setup mock
|
|
handler := http.NewServeMux()
|
|
handler.HandleFunc(latestAppVersionURL.path, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(test.code)
|
|
_, _ = w.Write([]byte(test.response))
|
|
})
|
|
mockSrv := httptest.NewServer(handler)
|
|
latestAppVersionURL.host = mockSrv.URL
|
|
defer mockSrv.Close()
|
|
|
|
actual, err := fetchLatestApplicationVersion()
|
|
if err != nil && !test.err {
|
|
t.Fatalf("got error but expected none: %+v", err)
|
|
} else if err == nil && test.err {
|
|
t.Fatalf("expected error but got none")
|
|
}
|
|
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if actual.String() != test.expected.String() {
|
|
t.Errorf("unexpected version: %+v", actual.String())
|
|
}
|
|
})
|
|
}
|
|
|
|
}
|