github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/provisioners/remote-exec/resource_provisioner_test.go (about)

     1  package remoteexec
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"strings"
     7  	"testing"
     8  
     9  	"reflect"
    10  
    11  	"github.com/hashicorp/terraform/config"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestResourceProvisioner_impl(t *testing.T) {
    16  	var _ terraform.ResourceProvisioner = new(ResourceProvisioner)
    17  }
    18  
    19  func TestResourceProvider_Validate_good(t *testing.T) {
    20  	c := testConfig(t, map[string]interface{}{
    21  		"inline": "echo foo",
    22  	})
    23  	p := new(ResourceProvisioner)
    24  	warn, errs := p.Validate(c)
    25  	if len(warn) > 0 {
    26  		t.Fatalf("Warnings: %v", warn)
    27  	}
    28  	if len(errs) > 0 {
    29  		t.Fatalf("Errors: %v", errs)
    30  	}
    31  }
    32  
    33  func TestResourceProvider_Validate_bad(t *testing.T) {
    34  	c := testConfig(t, map[string]interface{}{
    35  		"invalid": "nope",
    36  	})
    37  	p := new(ResourceProvisioner)
    38  	warn, errs := p.Validate(c)
    39  	if len(warn) > 0 {
    40  		t.Fatalf("Warnings: %v", warn)
    41  	}
    42  	if len(errs) == 0 {
    43  		t.Fatalf("Should have errors")
    44  	}
    45  }
    46  
    47  var expectedScriptOut = `cd /tmp
    48  wget http://foobar
    49  exit 0
    50  `
    51  
    52  var expectedInlineScriptsOut = strings.Split(expectedScriptOut, "\n")
    53  
    54  func TestResourceProvider_generateScripts(t *testing.T) {
    55  	p := new(ResourceProvisioner)
    56  	conf := testConfig(t, map[string]interface{}{
    57  		"inline": []interface{}{
    58  			"cd /tmp",
    59  			"wget http://foobar",
    60  			"exit 0",
    61  		},
    62  	})
    63  	out, err := p.generateScripts(conf)
    64  	if err != nil {
    65  		t.Fatalf("err: %v", err)
    66  	}
    67  
    68  	if reflect.DeepEqual(out, expectedInlineScriptsOut) {
    69  		t.Fatalf("bad: %v", out)
    70  	}
    71  }
    72  
    73  func TestResourceProvider_CollectScripts_inline(t *testing.T) {
    74  	p := new(ResourceProvisioner)
    75  	conf := testConfig(t, map[string]interface{}{
    76  		"inline": []interface{}{
    77  			"cd /tmp",
    78  			"wget http://foobar",
    79  			"exit 0",
    80  		},
    81  	})
    82  
    83  	scripts, err := p.collectScripts(conf)
    84  	if err != nil {
    85  		t.Fatalf("err: %v", err)
    86  	}
    87  
    88  	if len(scripts) != 3 {
    89  		t.Fatalf("bad: %v", scripts)
    90  	}
    91  
    92  	for i, script := range scripts {
    93  		var out bytes.Buffer
    94  		_, err = io.Copy(&out, script)
    95  		if err != nil {
    96  			t.Fatalf("err: %v", err)
    97  		}
    98  
    99  		if out.String() != expectedInlineScriptsOut[i] {
   100  			t.Fatalf("bad: %v", out.String())
   101  		}
   102  	}
   103  }
   104  
   105  func TestResourceProvider_CollectScripts_script(t *testing.T) {
   106  	p := new(ResourceProvisioner)
   107  	conf := testConfig(t, map[string]interface{}{
   108  		"script": "test-fixtures/script1.sh",
   109  	})
   110  
   111  	scripts, err := p.collectScripts(conf)
   112  	if err != nil {
   113  		t.Fatalf("err: %v", err)
   114  	}
   115  
   116  	if len(scripts) != 1 {
   117  		t.Fatalf("bad: %v", scripts)
   118  	}
   119  
   120  	var out bytes.Buffer
   121  	_, err = io.Copy(&out, scripts[0])
   122  	if err != nil {
   123  		t.Fatalf("err: %v", err)
   124  	}
   125  
   126  	if out.String() != expectedScriptOut {
   127  		t.Fatalf("bad: %v", out.String())
   128  	}
   129  }
   130  
   131  func TestResourceProvider_CollectScripts_scripts(t *testing.T) {
   132  	p := new(ResourceProvisioner)
   133  	conf := testConfig(t, map[string]interface{}{
   134  		"scripts": []interface{}{
   135  			"test-fixtures/script1.sh",
   136  			"test-fixtures/script1.sh",
   137  			"test-fixtures/script1.sh",
   138  		},
   139  	})
   140  
   141  	scripts, err := p.collectScripts(conf)
   142  	if err != nil {
   143  		t.Fatalf("err: %v", err)
   144  	}
   145  
   146  	if len(scripts) != 3 {
   147  		t.Fatalf("bad: %v", scripts)
   148  	}
   149  
   150  	for idx := range scripts {
   151  		var out bytes.Buffer
   152  		_, err = io.Copy(&out, scripts[idx])
   153  		if err != nil {
   154  			t.Fatalf("err: %v", err)
   155  		}
   156  
   157  		if out.String() != expectedScriptOut {
   158  			t.Fatalf("bad: %v", out.String())
   159  		}
   160  	}
   161  }
   162  
   163  func testConfig(
   164  	t *testing.T,
   165  	c map[string]interface{}) *terraform.ResourceConfig {
   166  	r, err := config.NewRawConfig(c)
   167  	if err != nil {
   168  		t.Fatalf("bad: %s", err)
   169  	}
   170  
   171  	return terraform.NewResourceConfig(r)
   172  }