github.com/aspring/packer@v0.8.1-0.20150629211158-9db281ac0f89/provisioner/chef-client/provisioner_test.go (about)

     1  package chefclient
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/mitchellh/packer/packer"
    11  )
    12  
    13  func testConfig() map[string]interface{} {
    14  	return map[string]interface{}{
    15  		"server_url": "foo",
    16  	}
    17  }
    18  
    19  func TestProvisioner_Impl(t *testing.T) {
    20  	var raw interface{}
    21  	raw = &Provisioner{}
    22  	if _, ok := raw.(packer.Provisioner); !ok {
    23  		t.Fatalf("must be a Provisioner")
    24  	}
    25  }
    26  
    27  func TestProvisionerPrepare_chefEnvironment(t *testing.T) {
    28  	var p Provisioner
    29  
    30  	config := testConfig()
    31  	config["chef_environment"] = "some-env"
    32  
    33  	err := p.Prepare(config)
    34  	if err != nil {
    35  		t.Fatalf("err: %s", err)
    36  	}
    37  
    38  	if p.config.ChefEnvironment != "some-env" {
    39  		t.Fatalf("unexpected: %#v", p.config.ChefEnvironment)
    40  	}
    41  }
    42  
    43  func TestProvisionerPrepare_configTemplate(t *testing.T) {
    44  	var err error
    45  	var p Provisioner
    46  
    47  	// Test no config template
    48  	config := testConfig()
    49  	delete(config, "config_template")
    50  	err = p.Prepare(config)
    51  	if err != nil {
    52  		t.Fatalf("err: %s", err)
    53  	}
    54  
    55  	// Test with a file
    56  	tf, err := ioutil.TempFile("", "packer")
    57  	if err != nil {
    58  		t.Fatalf("err: %s", err)
    59  	}
    60  	defer os.Remove(tf.Name())
    61  
    62  	config = testConfig()
    63  	config["config_template"] = tf.Name()
    64  	p = Provisioner{}
    65  	err = p.Prepare(config)
    66  	if err != nil {
    67  		t.Fatalf("err: %s", err)
    68  	}
    69  
    70  	// Test with a directory
    71  	td, err := ioutil.TempDir("", "packer")
    72  	if err != nil {
    73  		t.Fatalf("err: %s", err)
    74  	}
    75  	defer os.RemoveAll(td)
    76  
    77  	config = testConfig()
    78  	config["config_template"] = td
    79  	p = Provisioner{}
    80  	err = p.Prepare(config)
    81  	if err == nil {
    82  		t.Fatal("should have err")
    83  	}
    84  }
    85  
    86  func TestProvisionerPrepare_commands(t *testing.T) {
    87  	commands := []string{
    88  		"execute_command",
    89  		"install_command",
    90  	}
    91  
    92  	for _, command := range commands {
    93  		var p Provisioner
    94  
    95  		// Test not set
    96  		config := testConfig()
    97  		delete(config, command)
    98  		err := p.Prepare(config)
    99  		if err != nil {
   100  			t.Fatalf("err: %s", err)
   101  		}
   102  
   103  		// Test invalid template
   104  		config = testConfig()
   105  		config[command] = "{{if NOPE}}"
   106  		err = p.Prepare(config)
   107  		if err == nil {
   108  			t.Fatal("should error")
   109  		}
   110  
   111  		// Test good template
   112  		config = testConfig()
   113  		config[command] = "{{.Foo}}"
   114  		err = p.Prepare(config)
   115  		if err != nil {
   116  			t.Fatalf("err: %s", err)
   117  		}
   118  	}
   119  }
   120  
   121  func TestProvisionerPrepare_serverUrl(t *testing.T) {
   122  	var p Provisioner
   123  
   124  	// Test not set
   125  	config := testConfig()
   126  	delete(config, "server_url")
   127  	err := p.Prepare(config)
   128  	if err == nil {
   129  		t.Fatal("should error")
   130  	}
   131  
   132  	// Test set
   133  	config = testConfig()
   134  	config["server_url"] = "foo"
   135  	err = p.Prepare(config)
   136  	if err != nil {
   137  		t.Fatalf("err: %s", err)
   138  	}
   139  }
   140  
   141  func TestProvisioner_createDir(t *testing.T) {
   142  	p1 := &Provisioner{config: Config{PreventSudo: true}}
   143  	p2 := &Provisioner{config: Config{PreventSudo: false}}
   144  	comm := &packer.MockCommunicator{}
   145  	ui := &packer.BasicUi{
   146  		Reader: new(bytes.Buffer),
   147  		Writer: new(bytes.Buffer),
   148  	}
   149  
   150  	if err := p1.createDir(ui, comm, "/tmp/foo"); err != nil {
   151  		t.Fatalf("err: %s", err)
   152  	}
   153  
   154  	if strings.HasPrefix(comm.StartCmd.Command, "sudo") {
   155  		t.Fatalf("createDir should not use sudo, got: \"%s\"", comm.StartCmd.Command)
   156  	}
   157  
   158  	if err := p2.createDir(ui, comm, "/tmp/foo"); err != nil {
   159  		t.Fatalf("err: %s", err)
   160  	}
   161  
   162  	if !strings.HasPrefix(comm.StartCmd.Command, "sudo") {
   163  		t.Fatalf("createDir should use sudo, got: \"%s\"", comm.StartCmd.Command)
   164  	}
   165  }
   166  
   167  func TestProvisioner_removeDir(t *testing.T) {
   168  	p1 := &Provisioner{config: Config{PreventSudo: true}}
   169  	p2 := &Provisioner{config: Config{PreventSudo: false}}
   170  	comm := &packer.MockCommunicator{}
   171  	ui := &packer.BasicUi{
   172  		Reader: new(bytes.Buffer),
   173  		Writer: new(bytes.Buffer),
   174  	}
   175  
   176  	if err := p1.removeDir(ui, comm, "/tmp/foo"); err != nil {
   177  		t.Fatalf("err: %s", err)
   178  	}
   179  
   180  	if strings.HasPrefix(comm.StartCmd.Command, "sudo") {
   181  		t.Fatalf("removeDir should not use sudo, got: \"%s\"", comm.StartCmd.Command)
   182  	}
   183  
   184  	if err := p2.removeDir(ui, comm, "/tmp/foo"); err != nil {
   185  		t.Fatalf("err: %s", err)
   186  	}
   187  
   188  	if !strings.HasPrefix(comm.StartCmd.Command, "sudo") {
   189  		t.Fatalf("removeDir should use sudo, got: \"%s\"", comm.StartCmd.Command)
   190  	}
   191  }