github.com/timsutton/packer@v1.3.2/command/build_test.go (about) 1 package command 2 3 import ( 4 "bytes" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/hashicorp/packer/builder/file" 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 func TestBuildOnlyFileCommaFlags(t *testing.T) { 14 c := &BuildCommand{ 15 Meta: testMetaFile(t), 16 } 17 18 args := []string{ 19 "-only=chocolate,vanilla", 20 filepath.Join(testFixture("build-only"), "template.json"), 21 } 22 23 defer cleanup() 24 25 if code := c.Run(args); code != 0 { 26 fatalCommand(t, c.Meta) 27 } 28 29 if !fileExists("chocolate.txt") { 30 t.Error("Expected to find chocolate.txt") 31 } 32 if !fileExists("vanilla.txt") { 33 t.Error("Expected to find vanilla.txt") 34 } 35 if fileExists("cherry.txt") { 36 t.Error("Expected NOT to find cherry.txt") 37 } 38 } 39 40 func TestBuildStdin(t *testing.T) { 41 c := &BuildCommand{ 42 Meta: testMetaFile(t), 43 } 44 f, err := os.Open(filepath.Join(testFixture("build-only"), "template.json")) 45 if err != nil { 46 t.Fatal(err) 47 } 48 defer f.Close() 49 50 stdin := os.Stdin 51 os.Stdin = f 52 defer func() { os.Stdin = stdin }() 53 54 defer cleanup() 55 if code := c.Run([]string{"-"}); code != 0 { 56 fatalCommand(t, c.Meta) 57 } 58 59 if !fileExists("chocolate.txt") { 60 t.Error("Expected to find chocolate.txt") 61 } 62 if !fileExists("vanilla.txt") { 63 t.Error("Expected to find vanilla.txt") 64 } 65 if !fileExists("cherry.txt") { 66 t.Error("Expected to find cherry.txt") 67 } 68 } 69 70 func TestBuildOnlyFileMultipleFlags(t *testing.T) { 71 c := &BuildCommand{ 72 Meta: testMetaFile(t), 73 } 74 75 args := []string{ 76 "-only=chocolate", 77 "-only=cherry", 78 filepath.Join(testFixture("build-only"), "template.json"), 79 } 80 81 defer cleanup() 82 83 if code := c.Run(args); code != 0 { 84 fatalCommand(t, c.Meta) 85 } 86 87 if !fileExists("chocolate.txt") { 88 t.Error("Expected to find chocolate.txt") 89 } 90 if fileExists("vanilla.txt") { 91 t.Error("Expected NOT to find vanilla.txt") 92 } 93 if !fileExists("cherry.txt") { 94 t.Error("Expected to find cherry.txt") 95 } 96 } 97 98 func TestBuildExceptFileCommaFlags(t *testing.T) { 99 c := &BuildCommand{ 100 Meta: testMetaFile(t), 101 } 102 103 args := []string{ 104 "-except=chocolate", 105 filepath.Join(testFixture("build-only"), "template.json"), 106 } 107 108 defer cleanup() 109 110 if code := c.Run(args); code != 0 { 111 fatalCommand(t, c.Meta) 112 } 113 114 if fileExists("chocolate.txt") { 115 t.Error("Expected NOT to find chocolate.txt") 116 } 117 if !fileExists("vanilla.txt") { 118 t.Error("Expected to find vanilla.txt") 119 } 120 if !fileExists("cherry.txt") { 121 t.Error("Expected to find cherry.txt") 122 } 123 } 124 125 // fileExists returns true if the filename is found 126 func fileExists(filename string) bool { 127 if _, err := os.Stat(filename); err == nil { 128 return true 129 } 130 return false 131 } 132 133 // testCoreConfigBuilder creates a packer CoreConfig that has a file builder 134 // available. This allows us to test a builder that writes files to disk. 135 func testCoreConfigBuilder(t *testing.T) *packer.CoreConfig { 136 components := packer.ComponentFinder{ 137 Builder: func(n string) (packer.Builder, error) { 138 return &file.Builder{}, nil 139 }, 140 } 141 return &packer.CoreConfig{ 142 Components: components, 143 } 144 } 145 146 // testMetaFile creates a Meta object that includes a file builder 147 func testMetaFile(t *testing.T) Meta { 148 var out, err bytes.Buffer 149 return Meta{ 150 CoreConfig: testCoreConfigBuilder(t), 151 Ui: &packer.BasicUi{ 152 Writer: &out, 153 ErrorWriter: &err, 154 }, 155 } 156 } 157 158 func cleanup() { 159 os.RemoveAll("chocolate.txt") 160 os.RemoveAll("vanilla.txt") 161 os.RemoveAll("cherry.txt") 162 }