github.com/drud/ddev@v1.21.5-alpha1.0.20230226034409-94fcc4b94453/cmd/ddev/cmd/homeadditions_test.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/drud/ddev/pkg/ddevapp" 10 "github.com/drud/ddev/pkg/exec" 11 "github.com/drud/ddev/pkg/fileutil" 12 "github.com/drud/ddev/pkg/globalconfig" 13 "github.com/drud/ddev/pkg/nodeps" 14 "github.com/drud/ddev/pkg/testcommon" 15 asrt "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 // TestHomeadditions makes sure that extra files added to 20 // .ddev/homeadditions and ~/.ddev/homeadditions get added into the container's ~/ 21 func TestHomeadditions(t *testing.T) { 22 if nodeps.MutagenEnabledDefault || globalconfig.DdevGlobalConfig.MutagenEnabledGlobal || nodeps.NoBindMountsDefault { 23 t.Skip("Skipping because this changes homedir and breaks mutagen functionality") 24 } 25 assert := asrt.New(t) 26 27 origDir, _ := os.Getwd() 28 testdata := filepath.Join(origDir, "testdata", t.Name()) 29 30 tmpHome := testcommon.CreateTmpDir(t.Name() + "tempHome") 31 // Change the homedir temporarily 32 t.Setenv("HOME", tmpHome) 33 t.Setenv("USERPROFILE", tmpHome) 34 35 site := TestSites[0] 36 projectHomeadditionsDir := filepath.Join(site.Dir, ".ddev", "homeadditions") 37 38 // We can't use the standard getGlobalDDevDir here because *our* global hasn't changed. 39 // It's changed via $HOME for the ddev subprocess 40 err := os.MkdirAll(filepath.Join(tmpHome, ".ddev"), 0755) 41 assert.NoError(err) 42 tmpHomeGlobalHomeadditionsDir := filepath.Join(tmpHome, ".ddev", "homeadditions") 43 err = os.RemoveAll(tmpHomeGlobalHomeadditionsDir) 44 assert.NoError(err) 45 err = os.RemoveAll(projectHomeadditionsDir) 46 assert.NoError(err) 47 err = fileutil.CopyDir(filepath.Join(testdata, "global"), tmpHomeGlobalHomeadditionsDir) 48 assert.NoError(err) 49 err = fileutil.CopyDir(filepath.Join(testdata, "project"), projectHomeadditionsDir) 50 assert.NoError(err) 51 err = os.Chdir(site.Dir) 52 require.NoError(t, err) 53 t.Cleanup(func() { 54 _, err := os.Stat(globalconfig.GetMutagenPath()) 55 if err == nil { 56 out, err := exec.RunHostCommand(DdevBin, "debug", "mutagen", "daemon", "stop") 57 assert.NoError(err, "mutagen daemon stop returned %s", string(out)) 58 } 59 60 err = os.Chdir(origDir) 61 assert.NoError(err) 62 err = fileutil.PurgeDirectory(projectHomeadditionsDir) 63 assert.NoError(err) 64 err = os.RemoveAll(tmpHome) 65 assert.NoError(err) 66 }) 67 68 // Before we can symlink global, need to make sure anything is already gone 69 err = os.RemoveAll(filepath.Join(tmpHomeGlobalHomeadditionsDir, "realglobaltarget.txt")) 70 assert.NoError(err) 71 err = os.RemoveAll(filepath.Join(projectHomeadditionsDir, "realprojecttarget.txt")) 72 assert.NoError(err) 73 74 // symlink the project file 75 err = os.Symlink(filepath.Join(origDir, "testdata", t.Name(), "project/realprojecttarget.txt"), filepath.Join(projectHomeadditionsDir, "realprojecttarget.txt")) 76 require.NoError(t, err) 77 // symlink the global file 78 err = os.Symlink(filepath.Join(origDir, "testdata", t.Name(), "global/realglobaltarget.txt"), filepath.Join(tmpHomeGlobalHomeadditionsDir, "realglobaltarget.txt")) 79 require.NoError(t, err) 80 // Run ddev start make sure homeadditions example files get populated 81 _, err = exec.RunHostCommand(DdevBin, "restart") 82 assert.NoError(err) 83 84 for _, f := range []string{"bash_aliases.example", "README.txt"} { 85 assert.FileExists(filepath.Join(projectHomeadditionsDir, f)) 86 assert.FileExists(filepath.Join(tmpHomeGlobalHomeadditionsDir, f)) 87 } 88 89 app, err := ddevapp.GetActiveApp(site.Name) 90 require.NoError(t, err) 91 92 // Make sure that even though there was a global and a project-level .myscript.sh 93 // the project-level one should win. 94 95 stdout, _, err := app.Exec(&ddevapp.ExecOpts{ 96 Service: "web", 97 Cmd: "~/.myscript.sh", 98 }) 99 assert.NoError(err) 100 assert.Contains(stdout, "this is project .myscript.sh") 101 102 for _, script := range []string{"global", "project"} { 103 stdout, _, err = app.Exec(&ddevapp.ExecOpts{ 104 Service: "web", 105 Cmd: fmt.Sprintf("~/.%sscript.sh", script), 106 }) 107 assert.NoError(err) 108 assert.Contains(stdout, fmt.Sprintf("this is .%sscript.sh", script)) 109 } 110 for _, f := range []string{"realglobaltarget.txt", "realprojecttarget.txt"} { 111 _, _, err = app.Exec(&ddevapp.ExecOpts{ 112 Cmd: `ls ~/` + f, 113 }) 114 assert.NoError(err) 115 } 116 }