grim/convey
Clone
Summary
Browse
Changes
Graph
Bump the version for release
v0.14.0-alpha3
2018-02-20, Gary Kramlich
166a6d1979fa
Bump the version for release
// Convey
// Copyright 2016-2018 Gary Kramlich <grim@reaperworld.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package
convey
import
(
"github.com/aphistic/sweet"
.
"github.com/onsi/gomega"
cConfig
"bitbucket.org/rw_grim/convey/config"
"bitbucket.org/rw_grim/convey/intrinsic"
)
// This test suite tests
type
extendSuite
struct
{}
func
(
d
*
extendSuite
)
TestSimple
(
t
sweet
.
T
)
{
data
:=
`
tasks:
a:
type: docker/run
image: alpine:3.6
environment:
- X=1
- Y=2
b:
type: convey/extend
task: a
environment:
- X=3
plans:
default:
stages:
- tasks: [a, b]
`
loader
:=
&
Loader
{}
cfg
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data
),
[]
string
{},
true
)
Expect
(
err
).
To
(
BeNil
())
Expect
(
cfg
.
Tasks
).
To
(
HaveLen
(
2
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"a"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"b"
))
Expect
(
cfg
.
Tasks
[
"b"
].(
*
intrinsic
.
Extend
).
InnerTask
).
NotTo
(
BeIdenticalTo
(
cfg
.
Tasks
[
"a"
]))
Expect
(
cfg
.
Tasks
[
"b"
].(
*
intrinsic
.
Extend
).
InnerTask
).
To
(
BeEquivalentTo
(
cfg
.
Tasks
[
"a"
]))
}
func
(
d
*
extendSuite
)
TestExtendChain
(
t
sweet
.
T
)
{
data
:=
`
tasks:
a:
type: docker/run
image: alpine:3.6
environment:
- X=1
- Y=2
b:
type: convey/extend
task: a
environment:
- X=3
c:
type: convey/extend
task: b
environment:
- X=4
plans:
default:
stages:
- tasks: [a, b, c]
`
loader
:=
&
Loader
{}
cfg
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data
),
[]
string
{},
true
)
Expect
(
err
).
To
(
BeNil
())
Expect
(
cfg
.
Tasks
).
To
(
HaveLen
(
3
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"a"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"b"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"c"
))
Expect
(
cfg
.
Tasks
[
"c"
].(
*
intrinsic
.
Extend
).
InnerTask
).
NotTo
(
BeIdenticalTo
(
cfg
.
Tasks
[
"b"
]))
Expect
(
cfg
.
Tasks
[
"c"
].(
*
intrinsic
.
Extend
).
InnerTask
).
To
(
BeEquivalentTo
(
cfg
.
Tasks
[
"b"
]))
Expect
(
cfg
.
Tasks
[
"b"
].(
*
intrinsic
.
Extend
).
InnerTask
).
NotTo
(
BeIdenticalTo
(
cfg
.
Tasks
[
"a"
]))
Expect
(
cfg
.
Tasks
[
"b"
].(
*
intrinsic
.
Extend
).
InnerTask
).
To
(
BeEquivalentTo
(
cfg
.
Tasks
[
"a"
]))
Expect
(
cfg
.
Tasks
[
"c"
].(
*
intrinsic
.
Extend
).
InnerTask
.(
*
intrinsic
.
Extend
).
InnerTask
).
NotTo
(
BeIdenticalTo
(
cfg
.
Tasks
[
"a"
]))
Expect
(
cfg
.
Tasks
[
"c"
].(
*
intrinsic
.
Extend
).
InnerTask
.(
*
intrinsic
.
Extend
).
InnerTask
).
To
(
BeEquivalentTo
(
cfg
.
Tasks
[
"a"
]))
}
func
(
d
*
extendSuite
)
TestCycle
(
t
sweet
.
T
)
{
data
:=
`
tasks:
a:
type: convey/extend
task: b
b:
type: convey/extend
task: a
plans:
default:
stages:
- tasks: [a, b]
`
loader
:=
&
Loader
{}
_
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data
),
[]
string
{},
true
)
Expect
(
err
).
To
(
MatchError
(
"The following tasks are part of a dependency cycle: a, b"
))
}
func
(
d
*
extendSuite
)
TestMissingTask
(
t
sweet
.
T
)
{
data
:=
`
tasks:
b:
type: convey/extend
task: a
plans:
default:
stages:
- tasks: [a, b]
`
loader
:=
&
Loader
{}
_
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data
),
[]
string
{},
true
)
Expect
(
err
).
To
(
MatchError
(
"b: Extending undeclared task 'a'"
))
}
func
(
d
*
extendSuite
)
TestExtendExtends
(
t
sweet
.
T
)
{
baseData
:=
`
environment:
- x=1
tasks:
foo:
type: docker/run
image: imaginary
environment:
- x=2
`
extendedData
:=
`
extends: base.yaml
environment:
- x=3
tasks:
bar:
type: convey/extend
task: foo
environment:
- x=3
plans:
plan:
stages:
- tasks: [foo, bar]
`
loader
:=
&
Loader
{
fileLoader
:
func
(
name
string
,
c
*
Loader
)
(
*
cConfig
.
Config
,
error
)
{
return
c
.
Load
(
"."
,
name
,
[]
byte
(
baseData
),
[]
string
{},
true
)
},
}
cfg
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
extendedData
),
[]
string
{},
true
)
Expect
(
err
).
To
(
BeNil
())
Expect
(
cfg
.
Tasks
).
To
(
HaveLen
(
2
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"foo"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"bar"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"foo"
))
Expect
(
cfg
.
Tasks
).
To
(
HaveKey
(
"bar"
))
Expect
(
cfg
.
Tasks
[
"bar"
].(
*
intrinsic
.
Extend
).
InnerTask
).
NotTo
(
BeIdenticalTo
(
cfg
.
Tasks
[
"foo"
]))
Expect
(
cfg
.
Tasks
[
"bar"
].(
*
intrinsic
.
Extend
).
InnerTask
).
To
(
BeEquivalentTo
(
cfg
.
Tasks
[
"foo"
]))
}
func
(
s
*
conveySuite
)
TestReplaceStage
(
t
sweet
.
T
)
{
data1
:=
`
tasks:
pre:
type: docker/run
image: pre
post:
type: docker/run
image: post
foo:
type: docker/run
image: foo
plans:
plan1:
stages:
- name: pre
tasks:
- pre
- name: real-work
tasks:
- foo
- name: post
tasks:
- post
plan2:
stages:
- tasks:
- pre
- foo
- post
`
data2
:=
`
extends: base1.yaml
tasks:
bar:
type: docker/run
image: bar
plans:
plan1:
merge: true
stages:
- name: real-work
tasks:
- bar
plan2:
stages:
- name: real-work
tasks:
- bar
`
data3
:=
`
extends: base2.yaml
tasks:
baz:
type: docker/run
image: baz
plans:
plan1:
merge: true
stages:
- name: post
tasks:
- baz
`
loader
:=
&
Loader
{
fileLoader
:
func
(
name
string
,
c
*
Loader
)
(
*
cConfig
.
Config
,
error
)
{
m
:=
map
[
string
]
string
{
"base1.yaml"
:
data1
,
"base2.yaml"
:
data2
,
}
return
c
.
Load
(
"."
,
name
,
[]
byte
(
m
[
name
]),
[]
string
{},
true
)
},
}
cfg
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data3
),
[]
string
{},
true
)
Expect
(
err
).
To
(
BeNil
())
Expect
(
cfg
.
Plans
).
To
(
HaveLen
(
2
))
Expect
(
cfg
.
Plans
).
To
(
HaveKey
(
"plan1"
))
Expect
(
cfg
.
Plans
).
To
(
HaveKey
(
"plan2"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
).
To
(
HaveLen
(
3
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
0
].
Name
).
To
(
Equal
(
"pre"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
1
].
Name
).
To
(
Equal
(
"real-work"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
2
].
Name
).
To
(
Equal
(
"post"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
0
].
Tasks
).
To
(
HaveLen
(
1
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
1
].
Tasks
).
To
(
HaveLen
(
1
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
2
].
Tasks
).
To
(
HaveLen
(
1
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
0
].
Tasks
).
To
(
ConsistOf
(
"pre"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
1
].
Tasks
).
To
(
ConsistOf
(
"bar"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
2
].
Tasks
).
To
(
ConsistOf
(
"baz"
))
Expect
(
cfg
.
Plans
[
"plan2"
].
Stages
).
To
(
HaveLen
(
1
))
Expect
(
cfg
.
Plans
[
"plan2"
].
Stages
[
0
].
Tasks
).
To
(
HaveLen
(
1
))
Expect
(
cfg
.
Plans
[
"plan2"
].
Stages
[
0
].
Tasks
).
To
(
ConsistOf
(
"bar"
))
}
func
(
s
*
conveySuite
)
TestMergeMissingPlan
(
t
sweet
.
T
)
{
data1
:=
`
tasks:
foo:
type: docker/run
image: foo
plans:
plan1:
stages:
- tasks: [foo]
`
data2
:=
`
extends: base1.yaml
tasks:
bar:
type: docker/run
image: bar
plans:
plan2:
merge: true
stages:
- tasks: [foo, bar]
`
loader
:=
&
Loader
{
fileLoader
:
func
(
name
string
,
c
*
Loader
)
(
*
cConfig
.
Config
,
error
)
{
return
c
.
Load
(
"."
,
name
,
[]
byte
(
data1
),
[]
string
{},
true
)
},
}
_
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data2
),
[]
string
{},
true
)
Expect
(
err
).
To
(
MatchError
(
"cannot merge with unknown plan 'plan2'"
))
}
func
(
s
*
conveySuite
)
TestMergeMissingStage
(
t
sweet
.
T
)
{
data1
:=
`
tasks:
foo:
type: docker/run
image: foo
plans:
plan1:
stages:
- name: only
tasks:
- foo
`
data2
:=
`
extends: base1.yaml
tasks:
bar:
type: docker/run
image: bar
plans:
plan1:
merge: true
stages:
- name: missing
tasks:
- bar
`
loader
:=
&
Loader
{
fileLoader
:
func
(
name
string
,
c
*
Loader
)
(
*
cConfig
.
Config
,
error
)
{
return
c
.
Load
(
"."
,
name
,
[]
byte
(
data1
),
[]
string
{},
true
)
},
}
_
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data2
),
[]
string
{},
true
)
Expect
(
err
).
To
(
MatchError
(
"cannot overwrite stage 'missing' in plan 'plan1' (no such stage in parent)"
))
}
func
(
s
*
conveySuite
)
TestMergePlanEnvironment
(
t
sweet
.
T
)
{
data1
:=
`
tasks:
foo:
type: docker/run
image: foo
plans:
plan1:
stages:
- name: only
tasks:
- foo
environment:
- FOO=BAR
- BAR=BAZ
`
data2
:=
`
extends: base1.yaml
plans:
plan1:
merge: true
environment:
- BAR=BONK
`
loader
:=
&
Loader
{
fileLoader
:
func
(
name
string
,
c
*
Loader
)
(
*
cConfig
.
Config
,
error
)
{
return
c
.
Load
(
"."
,
name
,
[]
byte
(
data1
),
[]
string
{},
true
)
},
}
cfg
,
err
:=
loader
.
Load
(
"."
,
"."
,
[]
byte
(
data2
),
[]
string
{},
true
)
Expect
(
err
).
To
(
BeNil
())
Expect
(
cfg
.
Plans
[
"plan1"
].
Stages
[
0
].
Tasks
).
To
(
ConsistOf
(
"foo"
))
Expect
(
cfg
.
Plans
[
"plan1"
].
Environment
).
To
(
ConsistOf
(
"FOO=BAR"
,
"BAR=BONK"
))
}