--- a/loaders/convey/convey.go Thu Sep 14 19:31:03 2017 -0500
+++ b/loaders/convey/convey.go Thu Sep 14 19:38:52 2017 -0500
@@ -51,6 +51,7 @@
fileLoader func(string, *Loader) (*cConfig.Config, error)
@@ -69,7 +70,13 @@
var baseConfig *cConfig.Config
+ if c.depth >= MaxExtendsDepth { + return nil, ErrMaxExtendsDepth baseConfig, err = c.loadFile(cfg.Extends)
// We can safely ignore no plans and no tasks errors here
// as we're ensured to also get a valid base config back.
--- a/loaders/convey/errors.go Thu Sep 14 19:31:03 2017 -0500
+++ b/loaders/convey/errors.go Thu Sep 14 19:38:52 2017 -0500
@@ -21,7 +21,12 @@
- ErrNoTasks = errors.New("no tasks specified")
- ErrNoPlans = errors.New("no plans specified")
+ ErrNoTasks = errors.New("no tasks specified") + ErrNoPlans = errors.New("no plans specified") + ErrMaxExtendsDepth = errors.New("exceeded allowed depth for extended configs") --- a/loaders/convey/extends_test.go Thu Sep 14 19:31:03 2017 -0500
+++ b/loaders/convey/extends_test.go Thu Sep 14 19:38:52 2017 -0500
@@ -18,6 +18,8 @@
"bitbucket.org/rw_grim/convey/docker"
"github.com/aphistic/sweet"
. "github.com/onsi/gomega"
@@ -168,3 +170,87 @@
Expect(loader.defaultPlan).To(Equal("plan2"))
+func (d *extendsSuite) ExtendTasksOnly(t sweet.T) { + fileLoader: func(name string, c *Loader) (*cConfig.Config, error) { + return c.Load(".", name, []byte(baseData)) + _, err := loader.Load(".", ".", []byte(extendedData)) + Expect(err).To(BeNil()) +func (d *extendsSuite) ExtendNoPlans(t sweet.T) { + fileLoader: func(name string, c *Loader) (*cConfig.Config, error) { + return c.Load(".", name, []byte(baseData)) + _, err := loader.Load(".", ".", []byte(extendedData)) + Expect(err).To(Equal(ErrNoTasks)) +func (d *extendsSuite) TestLoop(t sweet.T) { + fileLoader: func(name string, c *Loader) (*cConfig.Config, error) { + return c.Load(".", name, []byte(sameData)) + _, err := loader.Load(".", ".", []byte(sameData)) + Expect(err).To(Equal(ErrMaxExtendsDepth)) +func (d *extendsSuite) TestFilename(t sweet.T) { + fileLoader: func(name string, c *Loader) (*cConfig.Config, error) { + return nil, fmt.Errorf("early out") + loader.Load(".", ".", []byte(data)) + Expect(calledWith).To(Equal("../base.yaml"))