2021-08-18 12:10:55 +02:00
package cmd
import (
2022-01-31 13:27:29 +02:00
"encoding/json"
2021-08-18 12:10:55 +02:00
"fmt"
2021-10-01 13:48:24 +02:00
"net/http"
2021-08-18 12:10:55 +02:00
"testing"
2021-09-14 16:14:50 +02:00
"github.com/SAP/jenkins-library/pkg/cnbutils"
2022-02-16 14:28:51 +02:00
piperconf "github.com/SAP/jenkins-library/pkg/config"
2021-10-01 13:48:24 +02:00
piperhttp "github.com/SAP/jenkins-library/pkg/http"
2021-08-18 12:10:55 +02:00
"github.com/SAP/jenkins-library/pkg/mock"
"github.com/SAP/jenkins-library/pkg/telemetry"
2021-10-11 11:33:51 +02:00
"github.com/jarcoal/httpmock"
2021-08-18 12:10:55 +02:00
"github.com/stretchr/testify/assert"
2022-02-01 09:23:53 +02:00
"github.com/stretchr/testify/require"
2021-08-18 12:10:55 +02:00
)
2022-01-14 17:49:45 +02:00
const imageRegistry = "some-registry"
2021-09-14 16:14:50 +02:00
func newCnbBuildTestsUtils ( ) cnbutils . MockUtils {
utils := cnbutils . MockUtils {
2021-08-18 12:10:55 +02:00
ExecMockRunner : & mock . ExecMockRunner { } ,
FilesMock : & mock . FilesMock { } ,
}
2022-03-02 17:26:45 +02:00
utils . AddFile ( "/layers/report.toml" , [ ] byte ( ` [ build ]
[ image ]
tags = [ "localhost:5000/not-found:0.0.1" ]
digest = "sha256:52eac630560210e5ae13eb10797c4246d6f02d425f32b9430ca00bde697c79ec"
manifest - size = 2388 ` ) )
2021-08-18 12:10:55 +02:00
return utils
}
2021-09-14 16:14:50 +02:00
func addBuilderFiles ( utils * cnbutils . MockUtils ) {
2021-12-07 15:06:35 +02:00
utils . FilesMock . AddFile ( creatorPath , [ ] byte ( ` xyz ` ) )
}
2022-02-15 15:39:14 +02:00
func assertLifecycleCalls ( t * testing . T , runner * mock . ExecMockRunner , callNo int ) {
require . GreaterOrEqual ( t , len ( runner . Calls ) , callNo )
assert . Equal ( t , creatorPath , runner . Calls [ callNo - 1 ] . Exec )
2021-12-07 15:06:35 +02:00
for _ , arg := range [ ] string { "-no-color" , "-buildpacks" , "/cnb/buildpacks" , "-order" , "/cnb/order.toml" , "-platform" , "/tmp/platform" } {
2022-02-15 15:39:14 +02:00
assert . Contains ( t , runner . Calls [ callNo - 1 ] . Params , arg )
2021-09-14 15:38:58 +02:00
}
}
2021-08-18 12:10:55 +02:00
func TestRunCnbBuild ( t * testing . T ) {
2022-02-16 14:28:51 +02:00
configOptions . openFile = piperconf . OpenPiperFile
2021-08-18 12:10:55 +02:00
2022-02-01 09:23:53 +02:00
t . Run ( "prefers direct configuration" , func ( t * testing . T ) {
2022-01-14 17:49:45 +02:00
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : fmt . Sprintf ( "https://%s" , imageRegistry ) ,
DockerConfigJSON : "/path/to/config.json" ,
}
projectToml := ` [ project ]
id = "io.buildpacks.my-app"
`
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
utils . FilesMock . AddFile ( "project.toml" , [ ] byte ( projectToml ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-01-14 17:49:45 +02:00
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-01-14 17:49:45 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , imageRegistry , config . ContainerImageName , config . ContainerImageTag ) )
assert . Equal ( t , config . ContainerRegistryURL , commonPipelineEnvironment . container . registryURL )
assert . Equal ( t , "my-image:0.0.1" , commonPipelineEnvironment . container . imageNameTag )
} )
2022-02-01 09:23:53 +02:00
t . Run ( "prefers project descriptor" , func ( t * testing . T ) {
2022-01-14 17:49:45 +02:00
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
config := cnbBuildOptions {
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : fmt . Sprintf ( "https://%s" , imageRegistry ) ,
DockerConfigJSON : "/path/to/config.json" ,
ProjectDescriptor : "project.toml" ,
}
projectToml := ` [ project ]
id = "io.buildpacks.my-app"
`
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
utils . FilesMock . AddFile ( "project.toml" , [ ] byte ( projectToml ) )
addBuilderFiles ( & utils )
2022-02-01 09:23:53 +02:00
telemetryData := telemetry . CustomData { }
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-01-14 17:49:45 +02:00
2022-02-01 09:23:53 +02:00
require . NoError ( t , err )
2022-01-14 17:49:45 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , imageRegistry , "io-buildpacks-my-app" , config . ContainerImageTag ) )
assert . Equal ( t , config . ContainerRegistryURL , commonPipelineEnvironment . container . registryURL )
assert . Equal ( t , "io-buildpacks-my-app:0.0.1" , commonPipelineEnvironment . container . imageNameTag )
2022-02-01 09:23:53 +02:00
2022-03-02 17:26:45 +02:00
assert . Equal ( t , "sha256:52eac630560210e5ae13eb10797c4246d6f02d425f32b9430ca00bde697c79ec" , commonPipelineEnvironment . container . imageDigest )
assert . Contains ( t , commonPipelineEnvironment . container . imageDigests , "sha256:52eac630560210e5ae13eb10797c4246d6f02d425f32b9430ca00bde697c79ec" )
2022-02-01 09:23:53 +02:00
customDataAsString := telemetryData . Custom1
2022-02-15 15:39:14 +02:00
customData := cnbBuildTelemetry { }
2022-02-01 09:23:53 +02:00
err = json . Unmarshal ( [ ] byte ( customDataAsString ) , & customData )
require . NoError ( t , err )
2022-02-15 15:39:14 +02:00
assert . Equal ( t , 1 , len ( customData . Data ) )
assert . Equal ( t , "root" , string ( customData . Data [ 0 ] . Path ) )
2022-01-14 17:49:45 +02:00
} )
2021-08-26 14:26:54 +02:00
t . Run ( "success case (registry with https)" , func ( t * testing . T ) {
2021-08-18 12:10:55 +02:00
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-08-18 12:10:55 +02:00
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : fmt . Sprintf ( "https://%s" , imageRegistry ) ,
2021-08-18 12:10:55 +02:00
DockerConfigJSON : "/path/to/config.json" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
2021-09-14 15:38:58 +02:00
addBuilderFiles ( & utils )
2021-08-18 12:10:55 +02:00
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-08-18 12:10:55 +02:00
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-08-18 12:10:55 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , imageRegistry , config . ContainerImageName , config . ContainerImageTag ) )
assert . Equal ( t , config . ContainerRegistryURL , commonPipelineEnvironment . container . registryURL )
2021-12-07 15:06:35 +02:00
assert . Equal ( t , "my-image:0.0.1" , commonPipelineEnvironment . container . imageNameTag )
2021-08-26 14:26:54 +02:00
} )
t . Run ( "success case (registry without https)" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-08-26 14:26:54 +02:00
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2021-08-26 14:26:54 +02:00
DockerConfigJSON : "/path/to/config.json" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
2021-09-14 15:38:58 +02:00
addBuilderFiles ( & utils )
2021-08-26 14:26:54 +02:00
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-09-14 16:14:50 +02:00
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-09-14 16:14:50 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , config . ContainerRegistryURL , config . ContainerImageName , config . ContainerImageTag ) )
assert . Equal ( t , fmt . Sprintf ( "https://%s" , config . ContainerRegistryURL ) , commonPipelineEnvironment . container . registryURL )
2021-12-07 15:06:35 +02:00
assert . Equal ( t , "my-image:0.0.1" , commonPipelineEnvironment . container . imageNameTag )
2021-09-14 16:14:50 +02:00
} )
2021-10-08 11:20:05 +02:00
t . Run ( "success case (custom buildpacks and custom env variables, renaming docker conf file, additional tag)" , func ( t * testing . T ) {
2021-09-14 16:14:50 +02:00
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-09-14 16:14:50 +02:00
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2021-10-01 10:05:15 +02:00
DockerConfigJSON : "/path/to/test.json" ,
2021-09-14 16:14:50 +02:00
Buildpacks : [ ] string { "test" } ,
2021-11-29 12:32:32 +02:00
BuildEnvVars : map [ string ] interface { } {
"FOO" : "BAR" ,
} ,
AdditionalTags : [ ] string { "latest" } ,
2021-09-14 16:14:50 +02:00
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-08-26 14:26:54 +02:00
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-08-26 14:26:54 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2021-12-07 15:06:35 +02:00
assert . Equal ( t , creatorPath , runner . Calls [ 0 ] . Exec )
assert . Contains ( t , runner . Calls [ 0 ] . Params , "/tmp/buildpacks" )
assert . Contains ( t , runner . Calls [ 0 ] . Params , "/tmp/buildpacks/order.toml" )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , config . ContainerRegistryURL , config . ContainerImageName , config . ContainerImageTag ) )
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:latest" , config . ContainerRegistryURL , config . ContainerImageName ) )
2022-01-11 11:01:15 +02:00
initialFileExists , _ := utils . FileExists ( "/path/to/test.json" )
renamedFileExists , _ := utils . FileExists ( "/path/to/config.json" )
assert . False ( t , initialFileExists )
2022-02-15 15:39:14 +02:00
assert . True ( t , renamedFileExists )
2021-08-18 12:10:55 +02:00
} )
2021-10-01 13:48:24 +02:00
t . Run ( "success case (customTlsCertificates)" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-10-11 11:33:51 +02:00
httpmock . Activate ( )
defer httpmock . DeactivateAndReset ( )
httpmock . RegisterResponder ( http . MethodGet , "https://test-cert.com/cert.crt" , httpmock . NewStringResponder ( 200 , "testCert" ) )
client := & piperhttp . Client { }
client . SetOptions ( piperhttp . ClientOptions { MaxRetries : - 1 , UseDefaultTransport : true } )
2021-10-01 13:48:24 +02:00
caCertsFile := "/etc/ssl/certs/ca-certificates.crt"
2021-10-07 16:04:20 +02:00
caCertsTmpFile := "/tmp/ca-certificates.crt"
2021-10-01 13:48:24 +02:00
registry := "some-registry"
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : registry ,
DockerConfigJSON : "/path/to/config.json" ,
2021-10-11 11:33:51 +02:00
CustomTLSCertificateLinks : [ ] string { "https://test-cert.com/cert.crt" , "https://test-cert.com/cert.crt" } ,
2021-10-01 13:48:24 +02:00
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( caCertsFile , [ ] byte ( "test\n" ) )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , client )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-10-01 13:48:24 +02:00
2021-10-07 16:04:20 +02:00
result , err := utils . FilesMock . FileRead ( caCertsTmpFile )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-10-01 13:48:24 +02:00
assert . Equal ( t , "test\ntestCert\ntestCert\n" , string ( result ) )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-10-01 13:48:24 +02:00
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
2021-10-07 16:04:20 +02:00
assert . Contains ( t , runner . Env , fmt . Sprintf ( "SSL_CERT_FILE=%s" , caCertsTmpFile ) )
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , config . ContainerRegistryURL , config . ContainerImageName , config . ContainerImageTag ) )
2021-10-08 11:20:05 +02:00
} )
t . Run ( "success case (additionalTags)" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-10-08 11:20:05 +02:00
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2021-10-08 11:20:05 +02:00
DockerConfigJSON : "/path/to/config.json" ,
AdditionalTags : [ ] string { "3" , "3.1" , "3.1" , "3.1.5" } ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2021-10-08 11:20:05 +02:00
runner := utils . ExecMockRunner
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 17:49:45 +02:00
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , config . ContainerRegistryURL , config . ContainerImageName , config . ContainerImageTag ) )
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:3" , config . ContainerRegistryURL , config . ContainerImageName ) )
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:3.1" , config . ContainerRegistryURL , config . ContainerImageName ) )
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:3.1.5" , config . ContainerRegistryURL , config . ContainerImageName ) )
2021-10-01 13:48:24 +02:00
} )
2022-01-14 12:05:11 +02:00
t . Run ( "pom.xml exists (symlink for the target folder)" , func ( t * testing . T ) {
t . Parallel ( )
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2022-01-14 12:05:11 +02:00
DockerConfigJSON : "/path/to/config.json" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . CurrentDir = "/jenkins"
utils . FilesMock . AddDir ( "/jenkins" )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
utils . FilesMock . AddFile ( "/workspace/pom.xml" , [ ] byte ( "test" ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & cnbBuildCommonPipelineEnvironment { } , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-01-14 12:05:11 +02:00
runner := utils . ExecMockRunner
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 12:05:11 +02:00
assert . True ( t , utils . FilesMock . HasCreatedSymlink ( "/jenkins/target" , "/workspace/target" ) )
} )
t . Run ( "no pom.xml exists (no symlink for the target folder)" , func ( t * testing . T ) {
t . Parallel ( )
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2022-01-14 12:05:11 +02:00
DockerConfigJSON : "/path/to/config.json" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . CurrentDir = "/jenkins"
utils . FilesMock . AddDir ( "/jenkins" )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & cnbBuildCommonPipelineEnvironment { } , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-01-14 12:05:11 +02:00
runner := utils . ExecMockRunner
2022-02-15 15:39:14 +02:00
assertLifecycleCalls ( t , runner , 1 )
2022-01-14 12:05:11 +02:00
assert . False ( t , utils . FilesMock . HasCreatedSymlink ( "/jenkins/target" , "/workspace/target" ) )
} )
2021-08-18 12:10:55 +02:00
t . Run ( "error case: Invalid DockerConfigJSON file" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-08-18 12:10:55 +02:00
config := cnbBuildOptions {
2022-01-14 17:49:45 +02:00
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : imageRegistry ,
ContainerImageName : "my-image" ,
DockerConfigJSON : "/path/to/config.json" ,
2021-08-18 12:10:55 +02:00
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry":"dXNlcjpwYXNz"}} ` ) )
2021-09-14 15:38:58 +02:00
addBuilderFiles ( & utils )
2021-08-18 12:10:55 +02:00
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-01-11 11:01:15 +02:00
assert . EqualError ( t , err , "failed to generate CNB_REGISTRY_AUTH: json: cannot unmarshal string into Go struct field ConfigFile.auths of type types.AuthConfig" )
2021-08-18 12:10:55 +02:00
} )
2021-10-01 10:05:15 +02:00
t . Run ( "error case: DockerConfigJSON file not there (config.json)" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-10-01 10:05:15 +02:00
config := cnbBuildOptions {
2022-01-14 17:49:45 +02:00
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : imageRegistry ,
ContainerImageName : "my-image" ,
DockerConfigJSON : "not-there/config.json" ,
2021-10-01 10:05:15 +02:00
}
utils := newCnbBuildTestsUtils ( )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-01-11 11:01:15 +02:00
assert . EqualError ( t , err , "failed to generate CNB_REGISTRY_AUTH: could not read 'not-there/config.json'" )
2021-10-01 10:05:15 +02:00
} )
t . Run ( "error case: DockerConfigJSON file not there (not config.json)" , func ( t * testing . T ) {
2021-08-18 12:10:55 +02:00
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-08-18 12:10:55 +02:00
config := cnbBuildOptions {
2022-01-14 17:49:45 +02:00
ContainerImageTag : "0.0.1" ,
ContainerRegistryURL : imageRegistry ,
ContainerImageName : "my-image" ,
DockerConfigJSON : "not-there" ,
2021-08-18 12:10:55 +02:00
}
utils := newCnbBuildTestsUtils ( )
2021-09-14 15:38:58 +02:00
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-10-01 10:05:15 +02:00
assert . EqualError ( t , err , "failed to rename DockerConfigJSON file 'not-there': renaming file 'not-there' is not supported, since it does not exist, or is not a leaf-entry" )
2021-08-18 12:10:55 +02:00
} )
2021-09-14 15:38:58 +02:00
t . Run ( "error case: dockerImage is not a valid builder" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-09-14 15:38:58 +02:00
config := cnbBuildOptions { }
utils := newCnbBuildTestsUtils ( )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-12-07 15:06:35 +02:00
assert . EqualError ( t , err , "the provided dockerImage is not a valid builder: binary '/cnb/lifecycle/creator' not found" )
2021-09-14 15:38:58 +02:00
} )
2021-10-07 16:04:20 +02:00
t . Run ( "error case: builder image does not contain tls certificates" , func ( t * testing . T ) {
t . Parallel ( )
2021-12-07 15:06:35 +02:00
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
2021-10-07 16:04:20 +02:00
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "0.0.1" ,
2022-01-14 17:49:45 +02:00
ContainerRegistryURL : imageRegistry ,
2021-10-07 16:04:20 +02:00
DockerConfigJSON : "/path/to/config.json" ,
Buildpacks : [ ] string { "test" } ,
CustomTLSCertificateLinks : [ ] string { "http://example.com/certs.pem" } ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetry . CustomData { } , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2021-10-07 16:04:20 +02:00
assert . EqualError ( t , err , "failed to copy certificates: cannot copy '/etc/ssl/certs/ca-certificates.crt': file does not exist" )
} )
2022-01-31 13:27:29 +02:00
t . Run ( "success case (telemetry was added)" , func ( t * testing . T ) {
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
registry := "some-registry"
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
ContainerRegistryURL : registry ,
DockerConfigJSON : "/path/to/config.json" ,
ProjectDescriptor : "project.toml" ,
AdditionalTags : [ ] string { "latest" } ,
Buildpacks : [ ] string { "paketobuildpacks/java" , "gcr.io/paketo-buildpacks/node" } ,
Bindings : map [ string ] interface { } { "SECRET" : map [ string ] string { "key" : "KEY" , "file" : "a_file" } } ,
Path : "target" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
2022-02-15 15:39:14 +02:00
utils . FilesMock . AddDir ( "target" )
utils . FilesMock . AddFile ( "target/project.toml" , [ ] byte ( ` [ project ]
2022-01-31 13:27:29 +02:00
id = "test"
name = "test"
version = "1.0.0"
[ build ]
include = [ ]
exclude = [ "*.tar" ]
[ [ build . buildpacks ] ]
uri = "some-buildpack" ` ) )
utils . FilesMock . AddFile ( "a_file" , [ ] byte ( ` { } ` ) )
utils . FilesMock . AddFile ( "target/somelib.jar" , [ ] byte ( ` FFFFFF ` ) )
addBuilderFiles ( & utils )
telemetryData := telemetry . CustomData { }
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-01-31 13:27:29 +02:00
customDataAsString := telemetryData . Custom1
2022-02-15 15:39:14 +02:00
customData := cnbBuildTelemetry { }
2022-01-31 13:27:29 +02:00
err = json . Unmarshal ( [ ] byte ( customDataAsString ) , & customData )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-02-16 14:28:51 +02:00
assert . Equal ( t , 3 , customData . Version )
2022-02-15 15:39:14 +02:00
require . Equal ( t , 1 , len ( customData . Data ) )
assert . Equal ( t , "3.1.5" , customData . Data [ 0 ] . ImageTag )
assert . Equal ( t , "folder" , string ( customData . Data [ 0 ] . Path ) )
assert . Contains ( t , customData . Data [ 0 ] . AdditionalTags , "latest" )
assert . Contains ( t , customData . Data [ 0 ] . BindingKeys , "SECRET" )
2022-04-12 16:01:38 +02:00
assert . Equal ( t , "paketobuildpacks/builder:base" , customData . Data [ 0 ] . Builder )
2022-02-15 15:39:14 +02:00
assert . Contains ( t , customData . Data [ 0 ] . Buildpacks . FromConfig , "paketobuildpacks/java" )
assert . NotContains ( t , customData . Data [ 0 ] . Buildpacks . FromProjectDescriptor , "paketobuildpacks/java" )
assert . Contains ( t , customData . Data [ 0 ] . Buildpacks . FromProjectDescriptor , "<redacted>" )
assert . NotContains ( t , customData . Data [ 0 ] . Buildpacks . Overall , "<redacted>" )
assert . Contains ( t , customData . Data [ 0 ] . Buildpacks . Overall , "paketobuildpacks/java" )
assert . True ( t , customData . Data [ 0 ] . ProjectDescriptor . Used )
assert . False ( t , customData . Data [ 0 ] . ProjectDescriptor . IncludeUsed )
assert . True ( t , customData . Data [ 0 ] . ProjectDescriptor . ExcludeUsed )
2022-01-31 13:27:29 +02:00
} )
2022-04-12 11:04:05 +02:00
t . Run ( "error case, multiple artifacts in path" , func ( t * testing . T ) {
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
ContainerRegistryURL : fmt . Sprintf ( "https://%s" , imageRegistry ) ,
DockerConfigJSON : "/path/to/config.json" ,
ProjectDescriptor : "project.toml" ,
AdditionalTags : [ ] string { "latest" } ,
Buildpacks : [ ] string { "paketobuildpacks/java" , "gcr.io/paketo-buildpacks/node" } ,
Path : "target/*.jar" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
utils . FilesMock . AddDir ( "target" )
utils . FilesMock . AddFile ( "target/app.jar" , [ ] byte ( ` FFFFFF ` ) )
utils . FilesMock . AddFile ( "target/app-src.jar" , [ ] byte ( ` FFFFFF ` ) )
addBuilderFiles ( & utils )
telemetryData := telemetry . CustomData { }
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
require . EqualError ( t , err , "could not resolve path: Failed to resolve glob for 'target/*.jar', matching 2 file(s)" )
} )
t . Run ( "success case, artifacts found by glob" , func ( t * testing . T ) {
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
ContainerRegistryURL : fmt . Sprintf ( "https://%s" , imageRegistry ) ,
DockerConfigJSON : "/path/to/config.json" ,
ProjectDescriptor : "project.toml" ,
AdditionalTags : [ ] string { "latest" } ,
Buildpacks : [ ] string { "paketobuildpacks/java" , "gcr.io/paketo-buildpacks/node" } ,
Path : "**/target" ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
utils . FilesMock . AddDir ( "target" )
utils . FilesMock . AddFile ( "target/app.jar" , [ ] byte ( ` FFFFFF ` ) )
addBuilderFiles ( & utils )
telemetryData := telemetry . CustomData { }
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
require . NoError ( t , err )
runner := utils . ExecMockRunner
assert . Contains ( t , runner . Env , "CNB_REGISTRY_AUTH={\"my-registry\":\"Basic dXNlcjpwYXNz\"}" )
assert . Contains ( t , runner . Calls [ 0 ] . Params , fmt . Sprintf ( "%s/%s:%s" , imageRegistry , config . ContainerImageName , config . ContainerImageTag ) )
assert . Equal ( t , config . ContainerRegistryURL , commonPipelineEnvironment . container . registryURL )
assert . Equal ( t , "my-image:3.1.5" , commonPipelineEnvironment . container . imageNameTag )
} )
2022-01-31 13:27:29 +02:00
t . Run ( "success case (build env telemetry was added)" , func ( t * testing . T ) {
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
registry := "some-registry"
config := cnbBuildOptions {
ContainerImageName : "my-image" ,
ContainerImageTag : "3.1.5" ,
ContainerRegistryURL : registry ,
ProjectDescriptor : "project.toml" ,
BuildEnvVars : map [ string ] interface { } { "CONFIG_KEY" : "var" , "BP_JVM_VERSION" : "8" } ,
}
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( "project.toml" , [ ] byte ( ` [ project ]
id = "test"
[ build ]
include = [ ]
[ [ build . env ] ]
name = ' PROJECT_KEY '
value = ' var '
[ [ build . env ] ]
name = ' BP_NODE_VERSION '
value = ' 11 '
[ [ build . buildpacks ] ]
uri = "some-buildpack"
` ) )
addBuilderFiles ( & utils )
telemetryData := telemetry . CustomData { }
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
2022-01-31 13:27:29 +02:00
customDataAsString := telemetryData . Custom1
2022-02-15 15:39:14 +02:00
customData := cnbBuildTelemetry { }
2022-01-31 13:27:29 +02:00
err = json . Unmarshal ( [ ] byte ( customDataAsString ) , & customData )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
require . Equal ( t , 1 , len ( customData . Data ) )
assert . Contains ( t , customData . Data [ 0 ] . BuildEnv . KeysFromConfig , "CONFIG_KEY" )
assert . NotContains ( t , customData . Data [ 0 ] . BuildEnv . KeysFromProjectDescriptor , "CONFIG_KEY" )
assert . Contains ( t , customData . Data [ 0 ] . BuildEnv . KeysOverall , "CONFIG_KEY" )
assert . NotContains ( t , customData . Data [ 0 ] . BuildEnv . KeysFromConfig , "PROJECT_KEY" )
assert . Contains ( t , customData . Data [ 0 ] . BuildEnv . KeysFromProjectDescriptor , "PROJECT_KEY" )
assert . Contains ( t , customData . Data [ 0 ] . BuildEnv . KeysOverall , "PROJECT_KEY" )
2022-01-31 13:27:29 +02:00
2022-02-15 15:39:14 +02:00
assert . Equal ( t , "8" , customData . Data [ 0 ] . BuildEnv . KeyValues [ "BP_JVM_VERSION" ] )
assert . Equal ( t , "11" , customData . Data [ 0 ] . BuildEnv . KeyValues [ "BP_NODE_VERSION" ] )
assert . NotContains ( t , customData . Data [ 0 ] . BuildEnv . KeyValues , "PROJECT_KEY" )
2022-01-31 13:27:29 +02:00
2022-03-09 12:48:47 +02:00
assert . Contains ( t , customData . Data [ 0 ] . Buildpacks . Overall , "<redacted>" )
2022-02-15 15:39:14 +02:00
} )
t . Run ( "success case (multiple images configured)" , func ( t * testing . T ) {
t . Parallel ( )
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment { }
config := cnbBuildOptions {
ContainerImageTag : "3.1.5" ,
ContainerRegistryURL : imageRegistry ,
DockerConfigJSON : "/path/to/my-config.json" ,
AdditionalTags : [ ] string { "3" , "3.1" , "3.1" , "3.1.5" } ,
MultipleImages : [ ] map [ string ] interface { } { { "ContainerImageName" : "my-image-0" } , { "ContainerImageName" : "my-image-1" } } ,
}
expectedImageCount := len ( config . MultipleImages )
utils := newCnbBuildTestsUtils ( )
utils . FilesMock . AddFile ( config . DockerConfigJSON , [ ] byte ( ` { "auths": { "my-registry": { "auth":"dXNlcjpwYXNz"}}} ` ) )
addBuilderFiles ( & utils )
telemetryData := telemetry . CustomData { }
2022-02-16 14:28:51 +02:00
err := callCnbBuild ( & config , & telemetryData , & utils , & commonPipelineEnvironment , & piperhttp . Client { } )
2022-02-15 15:39:14 +02:00
require . NoError ( t , err )
customDataAsString := telemetryData . Custom1
customData := cnbBuildTelemetry { }
err = json . Unmarshal ( [ ] byte ( customDataAsString ) , & customData )
2022-03-02 17:26:45 +02:00
assert . NoError ( t , err )
2022-02-15 15:39:14 +02:00
require . Equal ( t , expectedImageCount , len ( customData . Data ) )
runner := utils . ExecMockRunner
require . Equal ( t , expectedImageCount , len ( runner . Calls ) )
for i , call := range runner . Calls {
assert . Equal ( t , 4 , len ( customData . Data [ i ] . AdditionalTags ) )
assertLifecycleCalls ( t , runner , i + 1 )
containerImageName := fmt . Sprintf ( "my-image-%d" , i )
assert . Contains ( t , call . Params , fmt . Sprintf ( "%s/%s:%s" , config . ContainerRegistryURL , containerImageName , config . ContainerImageTag ) )
assert . Contains ( t , call . Params , fmt . Sprintf ( "%s/%s:3" , config . ContainerRegistryURL , containerImageName ) )
assert . Contains ( t , call . Params , fmt . Sprintf ( "%s/%s:3.1" , config . ContainerRegistryURL , containerImageName ) )
assert . Contains ( t , call . Params , fmt . Sprintf ( "%s/%s:3.1.5" , config . ContainerRegistryURL , containerImageName ) )
}
2022-01-31 13:27:29 +02:00
2022-02-15 15:39:14 +02:00
assert . Equal ( t , "my-image-0:3.1.5" , commonPipelineEnvironment . container . imageNameTag )
2022-01-31 13:27:29 +02:00
} )
2021-08-18 12:10:55 +02:00
}