github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/integration/isolated/manifest_inheritance_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"path/filepath"
     7  	"strings"
     8  	"time"
     9  
    10  	"code.cloudfoundry.org/cli/integration/helpers"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  	. "github.com/onsi/gomega/gbytes"
    14  	. "github.com/onsi/gomega/gexec"
    15  )
    16  
    17  // pushes app with multiple manifests, children being passed in first in the
    18  // array
    19  func pushHelloWorldAppWithManifests(manifests []string) {
    20  	helpers.WithHelloWorldApp(func(appDir string) {
    21  		pushPath := filepath.Join(appDir, "manifest-0.yml")
    22  		for i, manifest := range manifests {
    23  			manifestPath := filepath.Join(appDir, fmt.Sprintf("manifest-%d.yml", i))
    24  			manifest = strings.Replace(manifest, "inherit: {some-parent}", fmt.Sprintf("inherit: manifest-%d.yml", i+1), 1)
    25  			manifest = strings.Replace(manifest, "path: {some-dir}", fmt.Sprintf("path: %s", appDir), -1)
    26  			err := ioutil.WriteFile(manifestPath, []byte(manifest), 0666)
    27  			Expect(err).ToNot(HaveOccurred())
    28  		}
    29  		Eventually(helpers.CF("push", "-f", pushPath)).Should(Exit(0))
    30  	})
    31  }
    32  
    33  // CASE 1: child manifest (no inheritance)
    34  //
    35  // APPLICATION params:
    36  // values (memory, disk), list (routes), map (env vars)
    37  //
    38  // GLOBAL params:
    39  // value, list, map types
    40  //
    41  // APPLICATION and GLOBAL params:
    42  // value: application values override global values
    43  // list: application lists append to global lists
    44  // map: application maps merge & override global maps
    45  //
    46  //
    47  // CASE 2: child + parent manifests (1 level inheritance)
    48  //
    49  // Parent Application & Child Application
    50  // Parent Global & Child Application
    51  // Parent Application & Child Global
    52  // Parent Global & Child Global
    53  //
    54  // Parent Global & Child Global & Child Application
    55  // Parent Application & Child Global & Child Application
    56  // Parent Global & Parent Application & Child Application
    57  // Parent Global & Parent Application & Child Global
    58  //
    59  // Parent Global & Parent Application & Child Global & Child Application
    60  //
    61  // CASE 3: child + parent + super-parent manifests (n+ inheritance)
    62  // Super-parent Global & Parent Global & Parent Application & Child Global
    63  // Super-parent Global & Parent Global & Child Global & Child Application
    64  
    65  var _ = Describe("manifest inheritance in push command", func() {
    66  	var (
    67  		orgName    string
    68  		spaceName  string
    69  		domainName string
    70  		app1Name   string
    71  		app2Name   string
    72  	)
    73  
    74  	BeforeEach(func() {
    75  		orgName = helpers.NewOrgName()
    76  		spaceName = helpers.PrefixedRandomName("SPACE")
    77  		app1Name = helpers.PrefixedRandomName("app")
    78  		app2Name = helpers.PrefixedRandomName("app")
    79  
    80  		setupCF(orgName, spaceName)
    81  
    82  		domainName = fmt.Sprintf("%s.com", helpers.PrefixedRandomName("DOMAIN"))
    83  		helpers.NewDomain(orgName, domainName).Create()
    84  	})
    85  
    86  	AfterEach(func() {
    87  		helpers.QuickDeleteOrg(orgName)
    88  	})
    89  
    90  	Context("when there is only one manifest", func() {
    91  		Context("when the manifest contains only applications properties", func() {
    92  			BeforeEach(func() {
    93  				pushHelloWorldAppWithManifests([]string{fmt.Sprintf(`
    94  ---
    95  applications:
    96  - name: %s
    97    memory: 128M
    98    disk_quota: 128M
    99    buildpack: staticfile_buildpack
   100    path: {some-dir}
   101    routes:
   102    - route: hello.%s
   103    - route: hi.%s
   104    env:
   105      BAR: bar
   106      FOO: foo
   107  - name: %s
   108    memory: 128M
   109    disk_quota: 128M
   110    buildpack: staticfile_buildpack
   111    path: {some-dir}
   112    routes:
   113    - route: hello.%s
   114    - route: hi.%s
   115    env:
   116      BAR: bar
   117      FOO: foo
   118  `, app1Name, domainName, domainName, app2Name, domainName, domainName)})
   119  			})
   120  
   121  			It("pushes the same applications properties", func() {
   122  				session := helpers.CF("env", app1Name)
   123  				Eventually(session.Out).Should(Say("OK"))
   124  				Eventually(session.Out).Should(Say(`"application_uris": \[
   125     "hello\.%s"\,
   126     "hi\.%s"
   127    \]`, domainName, domainName))
   128  				Eventually(session.Out).Should(Say(`"disk": 128`))
   129  				Eventually(session.Out).Should(Say(`"mem": 128`))
   130  				Eventually(session.Out).Should(Say(`User-Provided:
   131  BAR: bar
   132  FOO: foo
   133  
   134  `))
   135  				Eventually(session).Should(Exit(0))
   136  
   137  				session = helpers.CF("env", app2Name)
   138  				Eventually(session.Out).Should(Say("OK"))
   139  				Eventually(session.Out).Should(Say(`"application_uris": \[
   140     "hello\.%s"\,
   141     "hi\.%s"
   142    \]`, domainName, domainName))
   143  				Eventually(session.Out).Should(Say(`"disk": 128`))
   144  				Eventually(session.Out).Should(Say(`"mem": 128`))
   145  				Eventually(session.Out).Should(Say(`User-Provided:
   146  BAR: bar
   147  FOO: foo
   148  
   149  `))
   150  				Eventually(session).Should(Exit(0))
   151  			})
   152  		})
   153  
   154  		Context("when the manifest contains mainly global properties", func() {
   155  			BeforeEach(func() {
   156  				pushHelloWorldAppWithManifests([]string{fmt.Sprintf(`
   157  ---
   158  memory: 128M
   159  disk_quota: 128M
   160  buildpack: staticfile_buildpack
   161  path: {some-dir}
   162  routes:
   163  - route: hello.%s
   164  - route: hi.%s
   165  env:
   166    BAR: bar
   167    FOO: foo
   168  applications:
   169  - name: %s
   170  - name: %s
   171  `, domainName, domainName, app1Name, app2Name)})
   172  			})
   173  
   174  			It("pushes the same global properties", func() {
   175  				session := helpers.CF("env", app1Name)
   176  				Eventually(session.Out).Should(Say("OK"))
   177  				Eventually(session.Out).Should(Say(`"application_uris": \[
   178     "hello\.%s"\,
   179     "hi\.%s"
   180    \]`, domainName, domainName))
   181  				Eventually(session.Out).Should(Say(`"disk": 128`))
   182  				Eventually(session.Out).Should(Say(`"mem": 128`))
   183  				Eventually(session.Out).Should(Say(`User-Provided:
   184  BAR: bar
   185  FOO: foo
   186  
   187  `))
   188  				Eventually(session).Should(Exit(0))
   189  
   190  				session = helpers.CF("env", app2Name)
   191  				Eventually(session.Out).Should(Say("OK"))
   192  				Eventually(session.Out).Should(Say(`"application_uris": \[
   193     "hello\.%s"\,
   194     "hi\.%s"
   195    \]`, domainName, domainName))
   196  				Eventually(session.Out).Should(Say(`"disk": 128`))
   197  				Eventually(session.Out).Should(Say(`"mem": 128`))
   198  				Eventually(session.Out).Should(Say(`User-Provided:
   199  BAR: bar
   200  FOO: foo
   201  
   202  `))
   203  				Eventually(session).Should(Exit(0))
   204  			})
   205  		})
   206  
   207  		Context("when the manifest contains both applications and global properties", func() {
   208  			BeforeEach(func() {
   209  				pushHelloWorldAppWithManifests([]string{fmt.Sprintf(`
   210  ---
   211  buildpack: staticfile_buildpack
   212  memory: 256M
   213  disk_quota: 256M
   214  routes:
   215  - route: global-1.%s
   216  - route: global-2.%s
   217  env:
   218    BAR: global
   219    FOO: global
   220  applications:
   221  - name: %s
   222    memory: 128M
   223    disk_quota: 128M
   224    path: {some-dir}
   225    routes:
   226    - route: app-1.%s
   227    - route: app-2.%s
   228    env:
   229      BAR: app
   230      BAZ: app
   231  - name: %s
   232    memory: 128M
   233    disk_quota: 128M
   234    path: {some-dir}
   235    routes:
   236    - route: app-1.%s
   237    - route: app-2.%s
   238    env:
   239      BAR: app
   240      BAZ: app
   241  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName)})
   242  			})
   243  
   244  			It("pushes with application properties taking precedence; values are overwritten, lists are appended, and maps are merged", func() {
   245  				session := helpers.CF("env", app1Name)
   246  				Eventually(session.Out).Should(Say("OK"))
   247  				Eventually(session.Out).Should(Say(`"application_uris": \[
   248     "global-1\.%s"\,
   249     "global-2\.%s",
   250     "app-1\.%s",
   251     "app-2\.%s"
   252    \]`, domainName, domainName, domainName, domainName))
   253  				Eventually(session.Out).Should(Say(`"disk": 128`))
   254  				Eventually(session.Out).Should(Say(`"mem": 128`))
   255  				Eventually(session.Out).Should(Say(`User-Provided:
   256  BAR: app
   257  BAZ: app
   258  FOO: global
   259  
   260  `))
   261  				Eventually(session).Should(Exit(0))
   262  
   263  				session = helpers.CF("env", app2Name)
   264  				Eventually(session.Out).Should(Say("OK"))
   265  				Eventually(session.Out).Should(Say(`"application_uris": \[
   266     "global-1\.%s"\,
   267     "global-2\.%s",
   268     "app-1\.%s",
   269     "app-2\.%s"
   270    \]`, domainName, domainName, domainName, domainName))
   271  				Eventually(session.Out).Should(Say(`"disk": 128`))
   272  				Eventually(session.Out).Should(Say(`"mem": 128`))
   273  				Eventually(session.Out).Should(Say(`User-Provided:
   274  BAR: app
   275  BAZ: app
   276  FOO: global
   277  
   278  `))
   279  				Eventually(session).Should(Exit(0))
   280  			})
   281  		})
   282  	})
   283  
   284  	Context("when there are two manifests", func() {
   285  		Context("when the child has applications properties; and the parent has applications properties", func() {
   286  			BeforeEach(func() {
   287  				pushHelloWorldAppWithManifests([]string{
   288  					fmt.Sprintf(`
   289  ---
   290  inherit: {some-parent}
   291  applications:
   292  - name: %s
   293    memory: 128M
   294    disk_quota: 128M
   295    path: {some-dir}
   296    routes:
   297    - route: child-app-1.%s
   298    - route: child-app-2.%s
   299    env:
   300      BAR: child-app
   301      BAZ: child-app
   302  - name: %s
   303    memory: 128M
   304    disk_quota: 128M
   305    path: {some-dir}
   306    routes:
   307    - route: child-app-1.%s
   308    - route: child-app-2.%s
   309    env:
   310      BAR: child-app
   311      BAZ: child-app
   312  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   313  					fmt.Sprintf(`
   314  ---
   315  applications:
   316  - name: %s
   317    buildpack: staticfile_buildpack
   318    memory: 256M
   319    disk_quota: 256M
   320    path: {some-dir}
   321    routes:
   322    - route: parent-app-1.%s
   323    - route: parent-app-2.%s
   324    env:
   325      BAR: parent-app
   326      BAZ: parent-app
   327      FOO: parent-app
   328  - name: %s
   329    buildpack: staticfile_buildpack
   330    memory: 256M
   331    disk_quota: 256M
   332    path: {some-dir}
   333    routes:
   334    - route: parent-app-1.%s
   335    - route: parent-app-2.%s
   336    env:
   337      BAR: parent-app
   338      BAZ: parent-app
   339      FOO: parent-app
   340  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   341  				})
   342  			})
   343  
   344  			It("pushes with child application properties taking precedence; values are overwritten, lists are appended, and maps are merged", func() {
   345  				session := helpers.CF("env", app1Name)
   346  				Eventually(session.Out).Should(Say("OK"))
   347  				Eventually(session.Out).Should(Say(`"application_uris": \[
   348     "parent-app-1\.%s",
   349     "parent-app-2\.%s",
   350     "child-app-1\.%s"\,
   351     "child-app-2\.%s"
   352    \]`, domainName, domainName, domainName, domainName))
   353  				Eventually(session.Out).Should(Say(`"disk": 128`))
   354  				Eventually(session.Out).Should(Say(`"mem": 128`))
   355  				Eventually(session.Out).Should(Say(`User-Provided:
   356  BAR: child-app
   357  BAZ: child-app
   358  FOO: parent-app
   359  
   360  `))
   361  				Eventually(session).Should(Exit(0))
   362  
   363  				session = helpers.CF("env", app2Name)
   364  				Eventually(session.Out).Should(Say("OK"))
   365  				Eventually(session.Out).Should(Say(`"application_uris": \[
   366     "parent-app-1\.%s",
   367     "parent-app-2\.%s",
   368     "child-app-1\.%s"\,
   369     "child-app-2\.%s"
   370    \]`, domainName, domainName, domainName, domainName))
   371  				Eventually(session.Out).Should(Say(`"disk": 128`))
   372  				Eventually(session.Out).Should(Say(`"mem": 128`))
   373  				Eventually(session.Out).Should(Say(`User-Provided:
   374  BAR: child-app
   375  BAZ: child-app
   376  FOO: parent-app
   377  
   378  `))
   379  				Eventually(session).Should(Exit(0))
   380  			})
   381  		})
   382  
   383  		Context("when the child has applications properties; and the parent has global properties", func() {
   384  			BeforeEach(func() {
   385  				pushHelloWorldAppWithManifests([]string{
   386  					fmt.Sprintf(`
   387  ---
   388  inherit: {some-parent}
   389  applications:
   390  - name: %s
   391    memory: 128M
   392    disk_quota: 128M
   393    path: {some-dir}
   394    routes:
   395    - route: child-app-1.%s
   396    - route: child-app-2.%s
   397    env:
   398      BAR: child-app
   399      BAZ: child-app
   400  - name: %s
   401    memory: 128M
   402    disk_quota: 128M
   403    path: {some-dir}
   404    routes:
   405    - route: child-app-1.%s
   406    - route: child-app-2.%s
   407    env:
   408      BAR: child-app
   409      BAZ: child-app
   410  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   411  					fmt.Sprintf(`
   412  ---
   413  buildpack: staticfile_buildpack
   414  memory: 256M
   415  disk_quota: 256M
   416  path: {some-dir}
   417  routes:
   418  - route: parent-global-1.%s
   419  - route: parent-global-2.%s
   420  env:
   421    BAR: parent-global
   422    BAZ: parent-global
   423    FOO: parent-global
   424  `, domainName, domainName),
   425  				})
   426  				SetDefaultEventuallyTimeout(300 * time.Second)
   427  			})
   428  
   429  			It("pushes with child application properties taking precedence", func() {
   430  				session := helpers.CF("env", app1Name)
   431  				Eventually(session.Out).Should(Say("OK"))
   432  				Eventually(session.Out).Should(Say(`"application_uris": \[
   433     "parent-global-1\.%s",
   434     "parent-global-2\.%s",
   435     "child-app-1\.%s"\,
   436     "child-app-2\.%s"
   437    \]`, domainName, domainName, domainName, domainName))
   438  				Eventually(session.Out).Should(Say(`"disk": 128`))
   439  				Eventually(session.Out).Should(Say(`"mem": 128`))
   440  				Eventually(session.Out).Should(Say(`User-Provided:
   441  BAR: child-app
   442  BAZ: child-app
   443  FOO: parent-global
   444  
   445  `))
   446  				Eventually(session).Should(Exit(0))
   447  
   448  				session = helpers.CF("env", app2Name)
   449  				Eventually(session.Out).Should(Say("OK"))
   450  				Eventually(session.Out).Should(Say(`"application_uris": \[
   451     "parent-global-1\.%s",
   452     "parent-global-2\.%s",
   453     "child-app-1\.%s"\,
   454     "child-app-2\.%s"
   455    \]`, domainName, domainName, domainName, domainName))
   456  				Eventually(session.Out).Should(Say(`"disk": 128`))
   457  				Eventually(session.Out).Should(Say(`"mem": 128`))
   458  				Eventually(session.Out).Should(Say(`User-Provided:
   459  BAR: child-app
   460  BAZ: child-app
   461  FOO: parent-global
   462  
   463  `))
   464  				Eventually(session).Should(Exit(0))
   465  			})
   466  		})
   467  
   468  		Context("when the child has global properties; and the parent has applications properties", func() {
   469  			BeforeEach(func() {
   470  				pushHelloWorldAppWithManifests([]string{
   471  					fmt.Sprintf(`
   472  ---
   473  inherit: {some-parent}
   474  buildpack: staticfile_buildpack
   475  memory: 128M
   476  disk_quota: 128M
   477  path: {some-dir}
   478  routes:
   479  - route: child-global-1.%s
   480  - route: child-global-2.%s
   481  env:
   482    BAR: child-global
   483    BAZ: child-global
   484  `, domainName, domainName),
   485  					fmt.Sprintf(`
   486  ---
   487  applications:
   488  - name: %s
   489    memory: 256M
   490    disk_quota: 256M
   491    path: {some-dir}
   492    routes:
   493    - route: parent-app-1.%s
   494    - route: parent-app-2.%s
   495    env:
   496      BAR: parent-app
   497      BAZ: parent-app
   498      FOO: parent-app
   499  - name: %s
   500    memory: 256M
   501    disk_quota: 256M
   502    path: {some-dir}
   503    routes:
   504    - route: parent-app-1.%s
   505    - route: parent-app-2.%s
   506    env:
   507      BAR: parent-app
   508      BAZ: parent-app
   509      FOO: parent-app
   510  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   511  				})
   512  				SetDefaultEventuallyTimeout(300 * time.Second)
   513  			})
   514  
   515  			It("pushes with parent application properties taking precedence", func() {
   516  				session := helpers.CF("env", app1Name)
   517  				Eventually(session.Out).Should(Say("OK"))
   518  				Eventually(session.Out).Should(Say(`"application_uris": \[
   519     "child-global-1\.%s"\,
   520     "child-global-2\.%s",
   521     "parent-app-1\.%s",
   522     "parent-app-2\.%s"
   523    \]`, domainName, domainName, domainName, domainName))
   524  				Eventually(session.Out).Should(Say(`"disk": 256`))
   525  				Eventually(session.Out).Should(Say(`"mem": 256`))
   526  				Eventually(session.Out).Should(Say(`User-Provided:
   527  BAR: parent-app
   528  BAZ: parent-app
   529  FOO: parent-app
   530  `))
   531  				Eventually(session).Should(Exit(0))
   532  
   533  				session = helpers.CF("env", app2Name)
   534  				Eventually(session.Out).Should(Say("OK"))
   535  				Eventually(session.Out).Should(Say(`"application_uris": \[
   536     "child-global-1\.%s"\,
   537     "child-global-2\.%s",
   538     "parent-app-1\.%s",
   539     "parent-app-2\.%s"
   540    \]`, domainName, domainName, domainName, domainName))
   541  				Eventually(session.Out).Should(Say(`"disk": 256`))
   542  				Eventually(session.Out).Should(Say(`"mem": 256`))
   543  				Eventually(session.Out).Should(Say(`User-Provided:
   544  BAR: parent-app
   545  BAZ: parent-app
   546  FOO: parent-app
   547  `))
   548  				Eventually(session).Should(Exit(0))
   549  			})
   550  		})
   551  
   552  		Context("when the child has global properties; and the parent has global properties", func() {
   553  			BeforeEach(func() {
   554  				pushHelloWorldAppWithManifests([]string{
   555  					fmt.Sprintf(`
   556  ---
   557  inherit: {some-parent}
   558  memory: 128M
   559  disk_quota: 128M
   560  path: {some-dir}
   561  routes:
   562  - route: child-global-1.%s
   563  - route: child-global-2.%s
   564  env:
   565    BAR: child-global
   566    FOO: child-global
   567  `, domainName, domainName),
   568  					fmt.Sprintf(`
   569  ---
   570  buildpack: staticfile_buildpack
   571  memory: 256M
   572  disk_quota: 256M
   573  path: {some-dir}
   574  routes:
   575  - route: parent-global-1.%s
   576  - route: parent-global-2.%s
   577  env:
   578    BAR: parent-global
   579    FOO: parent-global
   580    BAZ: parent-global
   581  applications:
   582  - name: %s
   583  - name: %s
   584  `, domainName, domainName, app1Name, app2Name),
   585  				})
   586  			})
   587  
   588  			It("pushes with child global properties taking precedence;", func() {
   589  				session := helpers.CF("env", app1Name)
   590  				Eventually(session.Out).Should(Say("OK"))
   591  				Eventually(session.Out).Should(Say(`"application_uris": \[
   592     "parent-global-1\.%s"\,
   593     "parent-global-2\.%s",
   594     "child-global-1\.%s",
   595     "child-global-2\.%s"
   596    \]`, domainName, domainName, domainName, domainName))
   597  				Eventually(session.Out).Should(Say(`"disk": 128`))
   598  				Eventually(session.Out).Should(Say(`"mem": 128`))
   599  				Eventually(session.Out).Should(Say(`User-Provided:
   600  BAR: child-global
   601  BAZ: parent-global
   602  FOO: child-global
   603  
   604  `))
   605  				Eventually(session).Should(Exit(0))
   606  
   607  				session = helpers.CF("env", app2Name)
   608  				Eventually(session.Out).Should(Say("OK"))
   609  				Eventually(session.Out).Should(Say(`"application_uris": \[
   610     "parent-global-1\.%s"\,
   611     "parent-global-2\.%s",
   612     "child-global-1\.%s",
   613     "child-global-2\.%s"
   614    \]`, domainName, domainName, domainName, domainName))
   615  				Eventually(session.Out).Should(Say(`"disk": 128`))
   616  				Eventually(session.Out).Should(Say(`"mem": 128`))
   617  				Eventually(session.Out).Should(Say(`User-Provided:
   618  BAR: child-global
   619  BAZ: parent-global
   620  FOO: child-global
   621  
   622  `))
   623  				Eventually(session).Should(Exit(0))
   624  			})
   625  		})
   626  
   627  		Context("when the child has applications and global properties; and the parent has global properties", func() {
   628  			BeforeEach(func() {
   629  				pushHelloWorldAppWithManifests([]string{
   630  					fmt.Sprintf(`
   631  ---
   632  inherit: {some-parent}
   633  memory: 128M
   634  disk_quota: 128M
   635  path: {some-dir}
   636  routes:
   637  - route: child-global-1.%s
   638  - route: child-global-2.%s
   639  env:
   640    FOO: child-global
   641    FIZ: child-global
   642  applications:
   643  - name: %s
   644    memory: 64M
   645    disk_quota: 64M
   646    path: {some-dir}
   647    routes:
   648    - route: child-app-1.%s
   649    - route: child-app-2.%s
   650    env:
   651      BAR: child-app
   652      FOO: child-app
   653  - name: %s
   654    memory: 64M
   655    disk_quota: 64M
   656    path: {some-dir}
   657    routes:
   658    - route: child-app-1.%s
   659    - route: child-app-2.%s
   660    env:
   661      BAR: child-app
   662      FOO: child-app
   663  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
   664  					fmt.Sprintf(`
   665  ---
   666  buildpack: staticfile_buildpack
   667  memory: 256M
   668  disk_quota: 256M
   669  path: {some-dir}
   670  routes:
   671  - route: parent-global-1.%s
   672  - route: parent-global-2.%s
   673  env:
   674    BAR: parent-global
   675    FOO: parent-global
   676    FIZ: parent-global
   677    BAZ: parent-global
   678  applications:
   679  - name: %s
   680  - name: %s
   681  `, domainName, domainName, app1Name, app2Name),
   682  				})
   683  			})
   684  
   685  			It("pushes with child application taking precedence over child global over parent global", func() {
   686  				session := helpers.CF("env", app1Name)
   687  				Eventually(session.Out).Should(Say("OK"))
   688  				Eventually(session.Out).Should(Say(`"application_uris": \[
   689     "parent-global-1\.%s"\,
   690     "parent-global-2\.%s",
   691     "child-global-1\.%s",
   692     "child-global-2\.%s",
   693     "child-app-1\.%s",
   694     "child-app-2\.%s"
   695    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   696  				Eventually(session.Out).Should(Say(`"disk": 64`))
   697  				Eventually(session.Out).Should(Say(`"mem": 64`))
   698  				Eventually(session.Out).Should(Say(`User-Provided:
   699  BAR: child-app
   700  BAZ: parent-global
   701  FIZ: child-global
   702  FOO: child-app
   703  
   704  `))
   705  				Eventually(session).Should(Exit(0))
   706  
   707  				session = helpers.CF("env", app2Name)
   708  				Eventually(session.Out).Should(Say("OK"))
   709  				Eventually(session.Out).Should(Say(`"application_uris": \[
   710     "parent-global-1\.%s"\,
   711     "parent-global-2\.%s",
   712     "child-global-1\.%s",
   713     "child-global-2\.%s",
   714     "child-app-1\.%s",
   715     "child-app-2\.%s"
   716    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   717  				Eventually(session.Out).Should(Say(`"disk": 64`))
   718  				Eventually(session.Out).Should(Say(`"mem": 64`))
   719  				Eventually(session.Out).Should(Say(`User-Provided:
   720  BAR: child-app
   721  BAZ: parent-global
   722  FIZ: child-global
   723  FOO: child-app
   724  
   725  `))
   726  				Eventually(session).Should(Exit(0))
   727  			})
   728  		})
   729  
   730  		Context("when the child has applications and global properties; and the parent has applications properties", func() {
   731  			BeforeEach(func() {
   732  				pushHelloWorldAppWithManifests([]string{
   733  					fmt.Sprintf(`
   734  ---
   735  inherit: {some-parent}
   736  memory: 128M
   737  disk_quota: 128M
   738  path: {some-dir}
   739  routes:
   740  - route: child-global-1.%s
   741  - route: child-global-2.%s
   742  env:
   743    FOO: child-global
   744    FIZ: child-global
   745  applications:
   746  - name: %s
   747    disk_quota: 64M
   748    path: {some-dir}
   749    routes:
   750    - route: child-app-1.%s
   751    - route: child-app-2.%s
   752    env:
   753      BAR: child-app
   754      FOO: child-app
   755  - name: %s
   756    disk_quota: 64M
   757    path: {some-dir}
   758    routes:
   759    - route: child-app-1.%s
   760    - route: child-app-2.%s
   761    env:
   762      BAR: child-app
   763      FOO: child-app
   764  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
   765  					fmt.Sprintf(`
   766  ---
   767  buildpack: staticfile_buildpack
   768  applications:
   769  - name: %s
   770    memory: 256M
   771    disk_quota: 256M
   772    path: {some-dir}
   773    routes:
   774    - route: parent-app-1.%s
   775    - route: parent-app-2.%s
   776    env:
   777      BAR: parent-app
   778      FOO: parent-app
   779      FIZ: parent-app
   780      BAZ: parent-app
   781  - name: %s
   782    memory: 256M
   783    disk_quota: 256M
   784    path: {some-dir}
   785    routes:
   786    - route: parent-app-1.%s
   787    - route: parent-app-2.%s
   788    env:
   789      BAR: parent-app
   790      FOO: parent-app
   791      FIZ: parent-app
   792      BAZ: parent-app
   793  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   794  				})
   795  			})
   796  
   797  			It("pushes with child application taking precedence over child global over parent application", func() {
   798  				session := helpers.CF("env", app1Name)
   799  				Eventually(session.Out).Should(Say("OK"))
   800  				Eventually(session.Out).Should(Say(`"application_uris": \[
   801     "child-global-1\.%s",
   802     "child-global-2\.%s",
   803     "parent-app-1\.%s"\,
   804     "parent-app-2\.%s",
   805     "child-app-1\.%s",
   806     "child-app-2\.%s"
   807    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   808  				Eventually(session.Out).Should(Say(`"disk": 64`))
   809  				Eventually(session.Out).Should(Say(`"mem": 128`))
   810  				Eventually(session.Out).Should(Say(`User-Provided:
   811  BAR: child-app
   812  BAZ: parent-app
   813  FIZ: child-global
   814  FOO: child-app
   815  
   816  `))
   817  				Eventually(session).Should(Exit(0))
   818  
   819  				session = helpers.CF("env", app2Name)
   820  				Eventually(session.Out).Should(Say("OK"))
   821  				Eventually(session.Out).Should(Say(`"application_uris": \[
   822     "child-global-1\.%s",
   823     "child-global-2\.%s",
   824     "parent-app-1\.%s"\,
   825     "parent-app-2\.%s",
   826     "child-app-1\.%s",
   827     "child-app-2\.%s"
   828    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   829  				Eventually(session.Out).Should(Say(`"disk": 64`))
   830  				Eventually(session.Out).Should(Say(`"mem": 128`))
   831  				Eventually(session.Out).Should(Say(`User-Provided:
   832  BAR: child-app
   833  BAZ: parent-app
   834  FIZ: child-global
   835  FOO: child-app
   836  
   837  `))
   838  				Eventually(session).Should(Exit(0))
   839  			})
   840  		})
   841  
   842  		Context("when the child has applications properties; and the parent has applications and global properties", func() {
   843  			BeforeEach(func() {
   844  				pushHelloWorldAppWithManifests([]string{
   845  					fmt.Sprintf(`
   846  ---
   847  inherit: {some-parent}
   848  applications:
   849  - name: %s
   850    memory: 64M
   851    disk_quota: 64M
   852    path: {some-dir}
   853    routes:
   854    - route: child-app-1.%s
   855    - route: child-app-2.%s
   856    env:
   857      BAR: child-app
   858      FOO: child-app
   859  - name: %s
   860    memory: 64M
   861    disk_quota: 64M
   862    path: {some-dir}
   863    routes:
   864    - route: child-app-1.%s
   865    - route: child-app-2.%s
   866    env:
   867      BAR: child-app
   868      FOO: child-app
   869  `, app1Name, domainName, domainName, app2Name, domainName, domainName),
   870  					fmt.Sprintf(`
   871  ---
   872  buildpack: staticfile_buildpack
   873  memory: 128M
   874  disk_quota: 128M
   875  path: {some-dir}
   876  routes:
   877  - route: parent-global-1.%s
   878  - route: parent-global-2.%s
   879  env:
   880    FOO: parent-global
   881    FIZ: parent-global
   882  applications:
   883  - name: %s
   884    memory: 256M
   885    disk_quota: 256M
   886    path: {some-dir}
   887    routes:
   888    - route: parent-app-1.%s
   889    - route: parent-app-2.%s
   890    env:
   891      BAR: parent-app
   892      FOO: parent-app
   893      FIZ: parent-app
   894      BAZ: parent-app
   895  - name: %s
   896    memory: 256M
   897    disk_quota: 256M
   898    path: {some-dir}
   899    routes:
   900    - route: parent-app-1.%s
   901    - route: parent-app-2.%s
   902    env:
   903      BAR: parent-app
   904      FOO: parent-app
   905      FIZ: parent-app
   906      BAZ: parent-app
   907  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
   908  				})
   909  			})
   910  
   911  			It("pushes with child application taking precedence over parent application over child global", func() {
   912  				session := helpers.CF("env", app1Name)
   913  				Eventually(session.Out).Should(Say("OK"))
   914  				Eventually(session.Out).Should(Say(`"application_uris": \[
   915     "parent-global-1\.%s",
   916     "parent-global-2\.%s",
   917     "parent-app-1\.%s"\,
   918     "parent-app-2\.%s",
   919     "child-app-1\.%s",
   920     "child-app-2\.%s"
   921    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   922  				Eventually(session.Out).Should(Say(`"disk": 64`))
   923  				Eventually(session.Out).Should(Say(`"mem": 64`))
   924  				Eventually(session.Out).Should(Say(`User-Provided:
   925  BAR: child-app
   926  BAZ: parent-app
   927  FIZ: parent-global
   928  FOO: child-app
   929  
   930  `))
   931  				Eventually(session).Should(Exit(0))
   932  
   933  				session = helpers.CF("env", app2Name)
   934  				Eventually(session.Out).Should(Say("OK"))
   935  				Eventually(session.Out).Should(Say(`"application_uris": \[
   936     "parent-global-1\.%s",
   937     "parent-global-2\.%s",
   938     "parent-app-1\.%s"\,
   939     "parent-app-2\.%s",
   940     "child-app-1\.%s",
   941     "child-app-2\.%s"
   942    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
   943  				Eventually(session.Out).Should(Say(`"disk": 64`))
   944  				Eventually(session.Out).Should(Say(`"mem": 64`))
   945  				Eventually(session.Out).Should(Say(`User-Provided:
   946  BAR: child-app
   947  BAZ: parent-app
   948  FIZ: parent-global
   949  FOO: child-app
   950  
   951  `))
   952  				Eventually(session).Should(Exit(0))
   953  			})
   954  		})
   955  
   956  		Context("when the child has global properties; and the parent has applications and global properties", func() {
   957  			BeforeEach(func() {
   958  				pushHelloWorldAppWithManifests([]string{
   959  					fmt.Sprintf(`
   960  ---
   961  inherit: {some-parent}
   962  memory: 128M
   963  disk_quota: 128M
   964  path: {some-dir}
   965  routes:
   966  - route: child-global-1.%s
   967  - route: child-global-2.%s
   968  env:
   969    FOO: child-global
   970    FIZ: child-global
   971  `, domainName, domainName),
   972  					fmt.Sprintf(`
   973  ---
   974  buildpack: staticfile_buildpack
   975  routes:
   976  - route: parent-global-1.%s
   977  - route: parent-global-2.%s
   978  env:
   979    FIZ: parent-global
   980    ZOOM: parent-global
   981  applications:
   982  - name: %s
   983    memory: 256M
   984    disk_quota: 256M
   985    path: {some-dir}
   986    routes:
   987    - route: parent-app-1.%s
   988    - route: parent-app-2.%s
   989    env:
   990      FOO: parent-app
   991      BAZ: parent-app
   992  - name: %s
   993    memory: 256M
   994    disk_quota: 256M
   995    path: {some-dir}
   996    routes:
   997    - route: parent-app-1.%s
   998    - route: parent-app-2.%s
   999    env:
  1000      FOO: parent-app
  1001      BAZ: parent-app
  1002  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
  1003  				})
  1004  			})
  1005  
  1006  			It("pushes with parent application taking precedence over child global over parent global", func() {
  1007  				session := helpers.CF("env", app1Name)
  1008  				Eventually(session.Out).Should(Say("OK"))
  1009  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1010     "parent-global-1\.%s",
  1011     "parent-global-2\.%s",
  1012     "child-global-1\.%s",
  1013     "child-global-2\.%s",
  1014     "parent-app-1\.%s"\,
  1015     "parent-app-2\.%s"
  1016    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
  1017  				Eventually(session.Out).Should(Say(`"disk": 256`))
  1018  				Eventually(session.Out).Should(Say(`"mem": 256`))
  1019  				Eventually(session.Out).Should(Say(`User-Provided:
  1020  BAZ: parent-app
  1021  FIZ: child-global
  1022  FOO: parent-app
  1023  ZOOM: parent-global
  1024  
  1025  `))
  1026  				Eventually(session).Should(Exit(0))
  1027  
  1028  				session = helpers.CF("env", app2Name)
  1029  				Eventually(session.Out).Should(Say("OK"))
  1030  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1031     "parent-global-1\.%s",
  1032     "parent-global-2\.%s",
  1033     "child-global-1\.%s",
  1034     "child-global-2\.%s",
  1035     "parent-app-1\.%s"\,
  1036     "parent-app-2\.%s"
  1037    \]`, domainName, domainName, domainName, domainName, domainName, domainName))
  1038  				Eventually(session.Out).Should(Say(`"disk": 256`))
  1039  				Eventually(session.Out).Should(Say(`"mem": 256`))
  1040  				Eventually(session.Out).Should(Say(`User-Provided:
  1041  BAZ: parent-app
  1042  FIZ: child-global
  1043  FOO: parent-app
  1044  ZOOM: parent-global
  1045  
  1046  `))
  1047  				Eventually(session).Should(Exit(0))
  1048  			})
  1049  		})
  1050  
  1051  		Context("when the child has applications and global properties; and the parent has applications and global properties", func() {
  1052  			BeforeEach(func() {
  1053  				pushHelloWorldAppWithManifests([]string{
  1054  					fmt.Sprintf(`
  1055  ---
  1056  inherit: {some-parent}
  1057  instances: 2
  1058  memory: 128M
  1059  path: {some-dir}
  1060  routes:
  1061  - route: child-global-1.%s
  1062  - route: child-global-2.%s
  1063  env:
  1064    FOO: child-global
  1065    FIZ: child-global
  1066  applications:
  1067  - name: %s
  1068    memory: 64M
  1069    disk_quota: 64M
  1070    path: {some-dir}
  1071    routes:
  1072    - route: child-app-1.%s
  1073    - route: child-app-2.%s
  1074    env:
  1075      FOO: child-app
  1076      BAR: child-app
  1077  - name: %s
  1078    memory: 64M
  1079    disk_quota: 64M
  1080    path: {some-dir}
  1081    routes:
  1082    - route: child-app-1.%s
  1083    - route: child-app-2.%s
  1084    env:
  1085      FOO: child-app
  1086      BAR: child-app
  1087  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
  1088  					fmt.Sprintf(`
  1089  ---
  1090  buildpack: staticfile_buildpack
  1091  memory: 256M
  1092  disk_quota: 256M
  1093  path: {some-dir}
  1094  routes:
  1095  - route: parent-global-1.%s
  1096  - route: parent-global-2.%s
  1097  env:
  1098    FIZ: parent-global
  1099    ZOOM: parent-global
  1100  applications:
  1101  - name: %s
  1102    memory: 256M
  1103    disk_quota: 256M
  1104    path: {some-dir}
  1105    routes:
  1106    - route: parent-app-1.%s
  1107    - route: parent-app-2.%s
  1108    env:
  1109      FIZ: parent-app
  1110      BAZ: parent-app
  1111  - name: %s
  1112    memory: 256M
  1113    disk_quota: 256M
  1114    path: {some-dir}
  1115    routes:
  1116    - route: parent-app-1.%s
  1117    - route: parent-app-2.%s
  1118    env:
  1119      FIZ: parent-app
  1120      BAZ: parent-app
  1121  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
  1122  				})
  1123  			})
  1124  
  1125  			It("pushes with parent application taking precedence over child global", func() {
  1126  				session := helpers.CF("app", app1Name)
  1127  				Eventually(session.Out).Should(Say("instances.*2"))
  1128  
  1129  				session = helpers.CF("env", app1Name)
  1130  				Eventually(session.Out).Should(Say("OK"))
  1131  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1132     "parent-global-1\.%s",
  1133     "parent-global-2\.%s",
  1134     "child-global-1\.%s",
  1135     "child-global-2\.%s",
  1136     "parent-app-1\.%s"\,
  1137     "parent-app-2\.%s",
  1138     "child-app-1\.%s"\,
  1139     "child-app-2\.%s"
  1140    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1141  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1142  				Eventually(session.Out).Should(Say(`"mem": 64`))
  1143  				Eventually(session.Out).Should(Say(`User-Provided:
  1144  BAR: child-app
  1145  BAZ: parent-app
  1146  FIZ: child-global
  1147  FOO: child-app
  1148  ZOOM: parent-global
  1149  
  1150  `))
  1151  				Eventually(session).Should(Exit(0))
  1152  
  1153  				session = helpers.CF("app", app2Name)
  1154  				Eventually(session.Out).Should(Say("instances.*2"))
  1155  
  1156  				session = helpers.CF("env", app2Name)
  1157  				Eventually(session.Out).Should(Say("OK"))
  1158  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1159     "parent-global-1\.%s",
  1160     "parent-global-2\.%s",
  1161     "child-global-1\.%s",
  1162     "child-global-2\.%s",
  1163     "parent-app-1\.%s"\,
  1164     "parent-app-2\.%s",
  1165     "child-app-1\.%s"\,
  1166     "child-app-2\.%s"
  1167    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1168  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1169  				Eventually(session.Out).Should(Say(`"mem": 64`))
  1170  				Eventually(session.Out).Should(Say(`User-Provided:
  1171  BAR: child-app
  1172  BAZ: parent-app
  1173  FIZ: child-global
  1174  FOO: child-app
  1175  ZOOM: parent-global
  1176  
  1177  `))
  1178  				Eventually(session).Should(Exit(0))
  1179  			})
  1180  		})
  1181  	})
  1182  
  1183  	Context("when there are 3 manifests", func() {
  1184  		Context("when super-parent has globals, parent has globals, and child has app and globals", func() {
  1185  			BeforeEach(func() {
  1186  				pushHelloWorldAppWithManifests([]string{
  1187  					fmt.Sprintf(`
  1188  ---
  1189  inherit: {some-parent}
  1190  memory: 128M
  1191  path: {some-dir}
  1192  routes:
  1193  - route: child-global-1.%s
  1194  - route: child-global-2.%s
  1195  env:
  1196    FOO: child-global
  1197    FIZ: child-global
  1198  applications:
  1199  - name: %s
  1200    disk_quota: 64M
  1201    path: {some-dir}
  1202    routes:
  1203    - route: child-app-1.%s
  1204    - route: child-app-2.%s
  1205    env:
  1206      FOO: child-app
  1207      BAR: child-app
  1208  - name: %s
  1209    disk_quota: 64M
  1210    path: {some-dir}
  1211    routes:
  1212    - route: child-app-1.%s
  1213    - route: child-app-2.%s
  1214    env:
  1215      FOO: child-app
  1216      BAR: child-app
  1217  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
  1218  					fmt.Sprintf(`
  1219  ---
  1220  inherit: {some-parent}
  1221  instances: 2
  1222  memory: 256M
  1223  disk_quota: 256M
  1224  path: {some-dir}
  1225  routes:
  1226  - route: parent-global-1.%s
  1227  - route: parent-global-2.%s
  1228  env:
  1229    ZOOM: parent-global
  1230    FIZ: parent-global
  1231  `, domainName, domainName),
  1232  					fmt.Sprintf(`
  1233  ---
  1234  buildpack: staticfile_buildpack
  1235  memory: 512M
  1236  disk_quota: 512M
  1237  path: {some-dir}
  1238  routes:
  1239  - route: super-parent-global-1.%s
  1240  - route: super-parent-global-2.%s
  1241  env:
  1242    MOON: super-parent-global
  1243    ZOOM: super-parent-global
  1244  `, domainName, domainName),
  1245  				})
  1246  			})
  1247  
  1248  			It("pushes with child application taking precedence over child global over parent global over super-parent global", func() {
  1249  				session := helpers.CF("app", app1Name)
  1250  				Eventually(session.Out).Should(Say("instances.*2"))
  1251  
  1252  				session = helpers.CF("env", app1Name)
  1253  				Eventually(session.Out).Should(Say("OK"))
  1254  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1255     "super-parent-global-1\.%s",
  1256     "super-parent-global-2\.%s",
  1257     "parent-global-1\.%s",
  1258     "parent-global-2\.%s",
  1259     "child-global-1\.%s",
  1260     "child-global-2\.%s",
  1261     "child-app-1\.%s"\,
  1262     "child-app-2\.%s"
  1263    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1264  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1265  				Eventually(session.Out).Should(Say(`"mem": 128`))
  1266  				Eventually(session.Out).Should(Say(`User-Provided:
  1267  BAR: child-app
  1268  FIZ: child-global
  1269  FOO: child-app
  1270  MOON: super-parent-global
  1271  ZOOM: parent-global
  1272  
  1273  `))
  1274  				Eventually(session).Should(Exit(0))
  1275  
  1276  				session = helpers.CF("app", app2Name)
  1277  				Eventually(session.Out).Should(Say("instances.*2"))
  1278  
  1279  				session = helpers.CF("env", app2Name)
  1280  				Eventually(session.Out).Should(Say("OK"))
  1281  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1282     "super-parent-global-1\.%s",
  1283     "super-parent-global-2\.%s",
  1284     "parent-global-1\.%s",
  1285     "parent-global-2\.%s",
  1286     "child-global-1\.%s",
  1287     "child-global-2\.%s",
  1288     "child-app-1\.%s"\,
  1289     "child-app-2\.%s"
  1290    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1291  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1292  				Eventually(session.Out).Should(Say(`"mem": 128`))
  1293  				Eventually(session.Out).Should(Say(`User-Provided:
  1294  BAR: child-app
  1295  FIZ: child-global
  1296  FOO: child-app
  1297  MOON: super-parent-global
  1298  ZOOM: parent-global
  1299  
  1300  `))
  1301  				Eventually(session).Should(Exit(0))
  1302  			})
  1303  		})
  1304  
  1305  		Context("when super-parent has globals, parent has app and globals, and child has globals", func() {
  1306  			BeforeEach(func() {
  1307  				pushHelloWorldAppWithManifests([]string{
  1308  					fmt.Sprintf(`
  1309  ---
  1310  inherit: {some-parent}
  1311  memory: 128M
  1312  path: {some-dir}
  1313  routes:
  1314  - route: child-global-1.%s
  1315  - route: child-global-2.%s
  1316  env:
  1317    FOO: child-global
  1318    FIZ: child-global
  1319    JUNE: child-global
  1320  `, domainName, domainName),
  1321  					fmt.Sprintf(`
  1322  ---
  1323  inherit: {some-parent}
  1324  instances: 2
  1325  memory: 256M
  1326  disk_quota: 256M
  1327  path: {some-dir}
  1328  routes:
  1329  - route: parent-global-1.%s
  1330  - route: parent-global-2.%s
  1331  env:
  1332    ZOOM: parent-global
  1333    FIZ: parent-global
  1334  applications:
  1335  - name: %s
  1336    disk_quota: 64M
  1337    path: {some-dir}
  1338    routes:
  1339    - route: parent-app-1.%s
  1340    - route: parent-app-2.%s
  1341    env:
  1342      FOO: parent-app
  1343      BAR: parent-app
  1344  - name: %s
  1345    disk_quota: 64M
  1346    path: {some-dir}
  1347    routes:
  1348    - route: parent-app-1.%s
  1349    - route: parent-app-2.%s
  1350    env:
  1351      FOO: parent-app
  1352      BAR: parent-app
  1353  `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName),
  1354  					fmt.Sprintf(`
  1355  ---
  1356  buildpack: staticfile_buildpack
  1357  memory: 512M
  1358  disk_quota: 512M
  1359  path: {some-dir}
  1360  routes:
  1361  - route: super-parent-global-1.%s
  1362  - route: super-parent-global-2.%s
  1363  env:
  1364    MOON: super-parent-global
  1365    ZOOM: super-parent-global
  1366    JUNE: super-parent-global
  1367  `, domainName, domainName),
  1368  				})
  1369  			})
  1370  
  1371  			It("pushes with child application taking precedence over child global over parent global over super-parent global", func() {
  1372  				session := helpers.CF("app", app1Name)
  1373  				Eventually(session.Out).Should(Say("instances.*2"))
  1374  
  1375  				session = helpers.CF("env", app1Name)
  1376  				Eventually(session.Out).Should(Say("OK"))
  1377  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1378     "super-parent-global-1\.%s",
  1379     "super-parent-global-2\.%s",
  1380     "parent-global-1\.%s",
  1381     "parent-global-2\.%s",
  1382     "child-global-1\.%s",
  1383     "child-global-2\.%s",
  1384     "parent-app-1\.%s"\,
  1385     "parent-app-2\.%s"
  1386    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1387  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1388  				Eventually(session.Out).Should(Say(`"mem": 128`))
  1389  				Eventually(session.Out).Should(Say(`User-Provided:
  1390  BAR: parent-app
  1391  FIZ: child-global
  1392  FOO: parent-app
  1393  JUNE: child-global
  1394  MOON: super-parent-global
  1395  ZOOM: parent-global
  1396  
  1397  `))
  1398  				Eventually(session).Should(Exit(0))
  1399  
  1400  				session = helpers.CF("app", app1Name)
  1401  				Eventually(session.Out).Should(Say("instances.*2"))
  1402  
  1403  				session = helpers.CF("env", app2Name)
  1404  				Eventually(session.Out).Should(Say("OK"))
  1405  				Eventually(session.Out).Should(Say(`"application_uris": \[
  1406     "super-parent-global-1\.%s",
  1407     "super-parent-global-2\.%s",
  1408     "parent-global-1\.%s",
  1409     "parent-global-2\.%s",
  1410     "child-global-1\.%s",
  1411     "child-global-2\.%s",
  1412     "parent-app-1\.%s"\,
  1413     "parent-app-2\.%s"
  1414    \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName))
  1415  				Eventually(session.Out).Should(Say(`"disk": 64`))
  1416  				Eventually(session.Out).Should(Say(`"mem": 128`))
  1417  				Eventually(session.Out).Should(Say(`User-Provided:
  1418  BAR: parent-app
  1419  FIZ: child-global
  1420  FOO: parent-app
  1421  JUNE: child-global
  1422  MOON: super-parent-global
  1423  ZOOM: parent-global
  1424  
  1425  `))
  1426  				Eventually(session).Should(Exit(0))
  1427  			})
  1428  		})
  1429  	})
  1430  })