github.com/dacamp/packer@v0.10.2/provisioner/puppet-masterless/provisioner_test.go (about)

     1  package puppetmasterless
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/mitchellh/packer/packer"
    10  )
    11  
    12  func testConfig() map[string]interface{} {
    13  	tf, err := ioutil.TempFile("", "packer")
    14  	if err != nil {
    15  		panic(err)
    16  	}
    17  
    18  	return map[string]interface{}{
    19  		"manifest_file": tf.Name(),
    20  	}
    21  }
    22  
    23  func TestProvisioner_Impl(t *testing.T) {
    24  	var raw interface{}
    25  	raw = &Provisioner{}
    26  	if _, ok := raw.(packer.Provisioner); !ok {
    27  		t.Fatalf("must be a Provisioner")
    28  	}
    29  }
    30  
    31  func TestProvisionerPrepare_hieraConfigPath(t *testing.T) {
    32  	config := testConfig()
    33  
    34  	delete(config, "hiera_config_path")
    35  	p := new(Provisioner)
    36  	err := p.Prepare(config)
    37  	if err != nil {
    38  		t.Fatalf("err: %s", err)
    39  	}
    40  
    41  	// Test with a good one
    42  	tf, err := ioutil.TempFile("", "packer")
    43  	if err != nil {
    44  		t.Fatalf("error tempfile: %s", err)
    45  	}
    46  	defer os.Remove(tf.Name())
    47  
    48  	config["hiera_config_path"] = tf.Name()
    49  	p = new(Provisioner)
    50  	err = p.Prepare(config)
    51  	if err != nil {
    52  		t.Fatalf("err: %s", err)
    53  	}
    54  }
    55  
    56  func TestProvisionerPrepare_manifestFile(t *testing.T) {
    57  	config := testConfig()
    58  
    59  	delete(config, "manifest_file")
    60  	p := new(Provisioner)
    61  	err := p.Prepare(config)
    62  	if err == nil {
    63  		t.Fatal("should be an error")
    64  	}
    65  
    66  	// Test with a good one
    67  	tf, err := ioutil.TempFile("", "packer")
    68  	if err != nil {
    69  		t.Fatalf("error tempfile: %s", err)
    70  	}
    71  	defer os.Remove(tf.Name())
    72  
    73  	config["manifest_file"] = tf.Name()
    74  	p = new(Provisioner)
    75  	err = p.Prepare(config)
    76  	if err != nil {
    77  		t.Fatalf("err: %s", err)
    78  	}
    79  }
    80  
    81  func TestProvisionerPrepare_manifestDir(t *testing.T) {
    82  	config := testConfig()
    83  
    84  	delete(config, "manifestdir")
    85  	p := new(Provisioner)
    86  	err := p.Prepare(config)
    87  	if err != nil {
    88  		t.Fatalf("err: %s", err)
    89  	}
    90  
    91  	// Test with a good one
    92  	td, err := ioutil.TempDir("", "packer")
    93  	if err != nil {
    94  		t.Fatalf("error: %s", err)
    95  	}
    96  	defer os.RemoveAll(td)
    97  
    98  	config["manifest_dir"] = td
    99  	p = new(Provisioner)
   100  	err = p.Prepare(config)
   101  	if err != nil {
   102  		t.Fatalf("err: %s", err)
   103  	}
   104  }
   105  
   106  func TestProvisionerPrepare_modulePaths(t *testing.T) {
   107  	config := testConfig()
   108  
   109  	delete(config, "module_paths")
   110  	p := new(Provisioner)
   111  	err := p.Prepare(config)
   112  	if err != nil {
   113  		t.Fatalf("err: %s", err)
   114  	}
   115  
   116  	// Test with bad paths
   117  	config["module_paths"] = []string{"i-should-not-exist"}
   118  	p = new(Provisioner)
   119  	err = p.Prepare(config)
   120  	if err == nil {
   121  		t.Fatal("should be an error")
   122  	}
   123  
   124  	// Test with a good one
   125  	td, err := ioutil.TempDir("", "packer")
   126  	if err != nil {
   127  		t.Fatalf("error: %s", err)
   128  	}
   129  	defer os.RemoveAll(td)
   130  
   131  	config["module_paths"] = []string{td}
   132  	p = new(Provisioner)
   133  	err = p.Prepare(config)
   134  	if err != nil {
   135  		t.Fatalf("err: %s", err)
   136  	}
   137  }
   138  
   139  func TestProvisionerPrepare_facterFacts(t *testing.T) {
   140  	config := testConfig()
   141  
   142  	delete(config, "facter")
   143  	p := new(Provisioner)
   144  	err := p.Prepare(config)
   145  	if err != nil {
   146  		t.Fatalf("err: %s", err)
   147  	}
   148  
   149  	// Test with malformed fact
   150  	config["facter"] = "fact=stringified"
   151  	p = new(Provisioner)
   152  	err = p.Prepare(config)
   153  	if err == nil {
   154  		t.Fatal("should be an error")
   155  	}
   156  
   157  	// Test with a good one
   158  	td, err := ioutil.TempDir("", "packer")
   159  	if err != nil {
   160  		t.Fatalf("error: %s", err)
   161  	}
   162  	defer os.RemoveAll(td)
   163  
   164  	facts := make(map[string]string)
   165  	facts["fact_name"] = "fact_value"
   166  	config["facter"] = facts
   167  
   168  	p = new(Provisioner)
   169  	err = p.Prepare(config)
   170  	if err != nil {
   171  		t.Fatalf("err: %s", err)
   172  	}
   173  
   174  	// Make sure the default facts are present
   175  	delete(config, "facter")
   176  	p = new(Provisioner)
   177  	err = p.Prepare(config)
   178  	if p.config.Facter == nil {
   179  		t.Fatalf("err: Default facts are not set in the Puppet provisioner!")
   180  	}
   181  }
   182  
   183  func TestProvisionerPrepare_extraArguments(t *testing.T) {
   184  	config := testConfig()
   185  
   186  	// Test with missing parameter
   187  	delete(config, "extra_arguments")
   188  	p := new(Provisioner)
   189  	err := p.Prepare(config)
   190  	if err != nil {
   191  		t.Fatalf("err: %s", err)
   192  	}
   193  
   194  	// Test with malformed value
   195  	config["extra_arguments"] = "{{}}"
   196  	p = new(Provisioner)
   197  	err = p.Prepare(config)
   198  	if err == nil {
   199  		t.Fatal("should be an error")
   200  	}
   201  
   202  	// Test with valid values
   203  	config["extra_arguments"] = []string{
   204  		"arg",
   205  	}
   206  
   207  	p = new(Provisioner)
   208  	err = p.Prepare(config)
   209  	if err != nil {
   210  		t.Fatalf("err: %s", err)
   211  	}
   212  }
   213  
   214  func TestProvisionerProvision_extraArguments(t *testing.T) {
   215  	config := testConfig()
   216  	ui := &packer.MachineReadableUi{
   217  		Writer: ioutil.Discard,
   218  	}
   219  	comm := new(packer.MockCommunicator)
   220  
   221  	extraArguments := []string{
   222  		"--some-arg=yup",
   223  		"--some-other-arg",
   224  	}
   225  	config["extra_arguments"] = extraArguments
   226  
   227  	// Test with valid values
   228  	p := new(Provisioner)
   229  	err := p.Prepare(config)
   230  	if err != nil {
   231  		t.Fatalf("err: %s", err)
   232  	}
   233  
   234  	err = p.Provision(ui, comm)
   235  	if err != nil {
   236  		t.Fatalf("err: %s", err)
   237  	}
   238  
   239  	expectedArgs := strings.Join(extraArguments, " ")
   240  
   241  	if !strings.Contains(comm.StartCmd.Command, expectedArgs) {
   242  		t.Fatalf("Command %q doesn't contain the expected arguments %q", comm.StartCmd.Command, expectedArgs)
   243  	}
   244  
   245  	// Test with missing parameter
   246  	delete(config, "extra_arguments")
   247  
   248  	p = new(Provisioner)
   249  	err = p.Prepare(config)
   250  	if err != nil {
   251  		t.Fatalf("err: %s", err)
   252  	}
   253  
   254  	err = p.Provision(ui, comm)
   255  	if err != nil {
   256  		t.Fatalf("err: %s", err)
   257  	}
   258  
   259  	// Check the expected `extra_arguments` position for an empty value
   260  	splitCommand := strings.Split(comm.StartCmd.Command, " ")
   261  	if "" == splitCommand[len(splitCommand)-2] {
   262  		t.Fatalf("Command %q contains an extra-space which may cause arg parsing issues", comm.StartCmd.Command)
   263  	}
   264  }