lifecycle/cmd/apis_test.go

175 lines
5.1 KiB
Go

package cmd_test
import (
"fmt"
"testing"
"github.com/apex/log"
"github.com/apex/log/handlers/memory"
"github.com/sclevine/spec"
"github.com/sclevine/spec/report"
"github.com/buildpacks/lifecycle/api"
"github.com/buildpacks/lifecycle/buildpack"
"github.com/buildpacks/lifecycle/cmd"
llog "github.com/buildpacks/lifecycle/log"
"github.com/buildpacks/lifecycle/platform"
h "github.com/buildpacks/lifecycle/testhelpers"
)
func TestVerifyAPIs(t *testing.T) {
spec.Run(t, "VerifyAPIs", testVerifyAPIs, spec.Sequential(), spec.Report(report.Terminal{}))
}
func testVerifyAPIs(t *testing.T, when spec.G, it spec.S) {
var (
logger llog.Logger
logHandler *memory.Handler
)
it.Before(func() {
logHandler = memory.New()
logger = &llog.DefaultLogger{Logger: &log.Logger{Handler: logHandler}}
})
when("VerifyPlatformAPI", func() {
it.Before(func() {
var err error
api.Platform, err = api.NewAPIs([]string{"1.2", "2.1"}, []string{"1"})
h.AssertNil(t, err)
})
when("is empty", func() {
it("errors with exit code 11", func() {
err := cmd.VerifyPlatformAPI(" ", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 11)
h.AssertError(t, err, fmt.Sprintf("get platform API version; please set '%s' to specify the desired platform API version", platform.EnvPlatformAPI)) // uses platform.EnvPlatformAPI instead of cmd.EnvPlatformAPI to verify the constants are equal
})
})
when("is invalid", func() {
it("errors with exit code 11", func() {
err := cmd.VerifyPlatformAPI("bad-api", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 11)
})
})
when("is unsupported", func() {
it("errors with exit code 11", func() {
err := cmd.VerifyPlatformAPI("2.2", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 11)
})
})
when("is deprecated", func() {
when("CNB_DEPRECATION_MODE=warn", func() {
it("should warn", func() {
cmd.DeprecationMode = cmd.ModeWarn
err := cmd.VerifyPlatformAPI("1.1", logger)
h.AssertNil(t, err)
h.AssertEq(t, len(logHandler.Entries), 1)
h.AssertEq(t, logHandler.Entries[0].Level, log.WarnLevel)
h.AssertEq(t, logHandler.Entries[0].Message, "Platform requested deprecated API '1.1'")
})
})
when("CNB_DEPRECATION_MODE=quiet", func() {
it("should succeed silently", func() {
cmd.DeprecationMode = cmd.ModeQuiet
err := cmd.VerifyPlatformAPI("1.1", logger)
h.AssertNil(t, err)
h.AssertEq(t, len(logHandler.Entries), 0)
})
})
when("CNB_DEPRECATION_MODE=error", func() {
it("errors with exit code 11", func() {
cmd.DeprecationMode = cmd.ModeError
err := cmd.VerifyPlatformAPI("1.1", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 11)
})
})
})
})
when("VerifyBuildpackAPI", func() {
it.Before(func() {
var err error
api.Buildpack, err = api.NewAPIs([]string{"1.2", "2.1"}, []string{"1"})
h.AssertNil(t, err)
})
when("is invalid", func() {
it("errors with exit code 12", func() {
err := cmd.VerifyBuildpackAPI(buildpack.KindBuildpack, "some-buildpack", "bad-api", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 12)
})
})
when("is unsupported", func() {
it("errors with exit code 11", func() {
err := cmd.VerifyBuildpackAPI(buildpack.KindBuildpack, "some-buildpack", "2.2", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 12)
})
})
when("is deprecated", func() {
when("CNB_DEPRECATION_MODE=warn", func() {
it("should warn", func() {
cmd.DeprecationMode = cmd.ModeWarn
err := cmd.VerifyBuildpackAPI(buildpack.KindBuildpack, "some-buildpack", "1.1", logger)
h.AssertNil(t, err)
h.AssertEq(t, len(logHandler.Entries), 1)
h.AssertEq(t, logHandler.Entries[0].Level, log.WarnLevel)
h.AssertEq(t, logHandler.Entries[0].Message, "Buildpack 'some-buildpack' requests deprecated API '1.1'")
})
})
when("CNB_DEPRECATION_MODE=quiet", func() {
it("should succeed silently", func() {
cmd.DeprecationMode = cmd.ModeQuiet
err := cmd.VerifyBuildpackAPI(buildpack.KindBuildpack, "some-buildpack", "1.1", logger)
h.AssertNil(t, err)
h.AssertEq(t, len(logHandler.Entries), 0)
})
})
when("CNB_DEPRECATION_MODE=error", func() {
it("errors with exit code 11", func() {
cmd.DeprecationMode = cmd.ModeError
err := cmd.VerifyBuildpackAPI(buildpack.KindBuildpack, "some-buildpack", "1.1", logger)
failErr, ok := err.(*cmd.ErrorFail)
if !ok {
t.Fatalf("expected an error of type cmd.ErrorFail")
}
h.AssertEq(t, failErr.Code, 12)
})
})
})
})
}