github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/communicator/winrm/provisioner_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package winrm
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/zclconf/go-cty/cty"
    10  )
    11  
    12  func TestProvisioner_defaultHTTPSPort(t *testing.T) {
    13  	v := cty.ObjectVal(map[string]cty.Value{
    14  		"type":     cty.StringVal("winrm"),
    15  		"user":     cty.StringVal("Administrator"),
    16  		"password": cty.StringVal("supersecret"),
    17  		"host":     cty.StringVal("127.0.0.1"),
    18  		"https":    cty.True,
    19  	})
    20  
    21  	conf, err := parseConnectionInfo(v)
    22  	if err != nil {
    23  		t.Fatalf("err: %v", err)
    24  	}
    25  	if conf.Port != 5986 {
    26  		t.Fatalf("expected: %v: got: %v", 5986, conf)
    27  	}
    28  	if conf.HTTPS != true {
    29  		t.Fatalf("expected: %v: got: %v", true, conf)
    30  	}
    31  }
    32  
    33  func TestProvisioner_connInfo(t *testing.T) {
    34  	v := cty.ObjectVal(map[string]cty.Value{
    35  		"type":     cty.StringVal("winrm"),
    36  		"user":     cty.StringVal("Administrator"),
    37  		"password": cty.StringVal("supersecret"),
    38  		"host":     cty.StringVal("127.0.0.1"),
    39  		"port":     cty.StringVal("5985"),
    40  		"https":    cty.True,
    41  		"use_ntlm": cty.True,
    42  		"timeout":  cty.StringVal("30s"),
    43  	})
    44  
    45  	conf, err := parseConnectionInfo(v)
    46  	if err != nil {
    47  		t.Fatalf("err: %v", err)
    48  	}
    49  
    50  	if conf.User != "Administrator" {
    51  		t.Fatalf("expected: %v: got: %v", "Administrator", conf)
    52  	}
    53  	if conf.Password != "supersecret" {
    54  		t.Fatalf("expected: %v: got: %v", "supersecret", conf)
    55  	}
    56  	if conf.Host != "127.0.0.1" {
    57  		t.Fatalf("expected: %v: got: %v", "127.0.0.1", conf)
    58  	}
    59  	if conf.Port != 5985 {
    60  		t.Fatalf("expected: %v: got: %v", 5985, conf)
    61  	}
    62  	if conf.HTTPS != true {
    63  		t.Fatalf("expected: %v: got: %v", true, conf)
    64  	}
    65  	if conf.NTLM != true {
    66  		t.Fatalf("expected: %v: got: %v", true, conf)
    67  	}
    68  	if conf.Timeout != "30s" {
    69  		t.Fatalf("expected: %v: got: %v", "30s", conf)
    70  	}
    71  	if conf.ScriptPath != DefaultScriptPath {
    72  		t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
    73  	}
    74  }
    75  
    76  func TestProvisioner_connInfoCACert(t *testing.T) {
    77  	caCert := `
    78  -----BEGIN CERTIFICATE-----
    79  MIIDBjCCAe4CCQCGWwBmOiHQdTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
    80  VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
    81  cyBQdHkgTHRkMB4XDTE2MDYyMTE2MzM0MVoXDTE3MDYyMTE2MzM0MVowRTELMAkG
    82  A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
    83  IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
    84  AL+LFlsCJG5txZp4yuu+lQnuUrgBXRG+irQqcTXlV91Bp5hpmRIyhnGCtWxxDBUL
    85  xrh4WN3VV/0jDzKT976oLgOy3hj56Cdqf+JlZ1qgMN5bHB3mm3aVWnrnsLbBsfwZ
    86  SEbk3Kht/cE1nK2toNVW+rznS3m+eoV3Zn/DUNwGlZr42hGNs6ETn2jURY78ETqR
    87  mW47xvjf86eIo7vULHJaY6xyarPqkL8DZazOmvY06hUGvGwGBny7gugfXqDG+I8n
    88  cPBsGJGSAmHmVV8o0RCB9UjY+TvSMQRpEDoVlvyrGuglsD8to/4+7UcsuDGlRYN6
    89  jmIOC37mOi/jwRfWL1YUa4MCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAPDxTH0oQ
    90  JjKXoJgkmQxurB81RfnK/NrswJVzWbOv6ejcbhwh+/ZgJTMc15BrYcxU6vUW1V/i
    91  Z7APU0qJ0icECACML+a2fRI7YdLCTiPIOmY66HY8MZHAn3dGjU5TeiUflC0n0zkP
    92  mxKJe43kcYLNDItbfvUDo/GoxTXrC3EFVZyU0RhFzoVJdODlTHXMVFCzcbQEBrBJ
    93  xKdShCEc8nFMneZcGFeEU488ntZoWzzms8/QpYrKa5S0Sd7umEU2Kwu4HTkvUFg/
    94  CqDUFjhydXxYRsxXBBrEiLOE5BdtJR1sH/QHxIJe23C9iHI2nS1NbLziNEApLwC4
    95  GnSud83VUo9G9w==
    96  -----END CERTIFICATE-----
    97  `
    98  	v := cty.ObjectVal(map[string]cty.Value{
    99  		"type":     cty.StringVal("winrm"),
   100  		"user":     cty.StringVal("Administrator"),
   101  		"password": cty.StringVal("supersecret"),
   102  		"host":     cty.StringVal("127.0.0.1"),
   103  		"port":     cty.StringVal("5985"),
   104  		"https":    cty.True,
   105  		"timeout":  cty.StringVal("30s"),
   106  		"cacert":   cty.StringVal(caCert),
   107  	})
   108  
   109  	conf, err := parseConnectionInfo(v)
   110  	if err != nil {
   111  		t.Fatalf("err: %v", err)
   112  	}
   113  
   114  	if conf.User != "Administrator" {
   115  		t.Fatalf("expected: %v: got: %v", "Administrator", conf)
   116  	}
   117  	if conf.Password != "supersecret" {
   118  		t.Fatalf("expected: %v: got: %v", "supersecret", conf)
   119  	}
   120  	if conf.Host != "127.0.0.1" {
   121  		t.Fatalf("expected: %v: got: %v", "127.0.0.1", conf)
   122  	}
   123  	if conf.Port != 5985 {
   124  		t.Fatalf("expected: %v: got: %v", 5985, conf)
   125  	}
   126  	if conf.HTTPS != true {
   127  		t.Fatalf("expected: %v: got: %v", true, conf)
   128  	}
   129  	if conf.Timeout != "30s" {
   130  		t.Fatalf("expected: %v: got: %v", "30s", conf)
   131  	}
   132  	if conf.ScriptPath != DefaultScriptPath {
   133  		t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
   134  	}
   135  	if conf.CACert != caCert {
   136  		t.Fatalf("expected: %v: got: %v", caCert, conf.CACert)
   137  	}
   138  }
   139  
   140  func TestProvisioner_connInfoIpv6(t *testing.T) {
   141  	v := cty.ObjectVal(map[string]cty.Value{
   142  		"type":     cty.StringVal("winrm"),
   143  		"user":     cty.StringVal("Administrator"),
   144  		"password": cty.StringVal("supersecret"),
   145  		"host":     cty.StringVal("::1"),
   146  		"port":     cty.StringVal("5985"),
   147  		"https":    cty.True,
   148  		"timeout":  cty.StringVal("30s"),
   149  	})
   150  
   151  	conf, err := parseConnectionInfo(v)
   152  	if err != nil {
   153  		t.Fatalf("err: %v", err)
   154  	}
   155  
   156  	if conf.User != "Administrator" {
   157  		t.Fatalf("expected: %v: got: %v", "Administrator", conf)
   158  	}
   159  	if conf.Password != "supersecret" {
   160  		t.Fatalf("expected: %v: got: %v", "supersecret", conf)
   161  	}
   162  	if conf.Host != "[::1]" {
   163  		t.Fatalf("expected: %v: got: %v", "[::1]", conf)
   164  	}
   165  	if conf.Port != 5985 {
   166  		t.Fatalf("expected: %v: got: %v", 5985, conf)
   167  	}
   168  	if conf.HTTPS != true {
   169  		t.Fatalf("expected: %v: got: %v", true, conf)
   170  	}
   171  	if conf.Timeout != "30s" {
   172  		t.Fatalf("expected: %v: got: %v", "30s", conf)
   173  	}
   174  	if conf.ScriptPath != DefaultScriptPath {
   175  		t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
   176  	}
   177  }
   178  
   179  func TestProvisioner_connInfoHostname(t *testing.T) {
   180  	v := cty.ObjectVal(map[string]cty.Value{
   181  		"type":     cty.StringVal("winrm"),
   182  		"user":     cty.StringVal("Administrator"),
   183  		"password": cty.StringVal("supersecret"),
   184  		"host":     cty.StringVal("example.com"),
   185  		"port":     cty.StringVal("5985"),
   186  		"https":    cty.True,
   187  		"timeout":  cty.StringVal("30s"),
   188  	})
   189  
   190  	conf, err := parseConnectionInfo(v)
   191  	if err != nil {
   192  		t.Fatalf("err: %v", err)
   193  	}
   194  
   195  	if conf.User != "Administrator" {
   196  		t.Fatalf("expected: %v: got: %v", "Administrator", conf)
   197  	}
   198  	if conf.Password != "supersecret" {
   199  		t.Fatalf("expected: %v: got: %v", "supersecret", conf)
   200  	}
   201  	if conf.Host != "example.com" {
   202  		t.Fatalf("expected: %v: got: %v", "example.com", conf)
   203  	}
   204  	if conf.Port != 5985 {
   205  		t.Fatalf("expected: %v: got: %v", 5985, conf)
   206  	}
   207  	if conf.HTTPS != true {
   208  		t.Fatalf("expected: %v: got: %v", true, conf)
   209  	}
   210  	if conf.Timeout != "30s" {
   211  		t.Fatalf("expected: %v: got: %v", "30s", conf)
   212  	}
   213  	if conf.ScriptPath != DefaultScriptPath {
   214  		t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
   215  	}
   216  }
   217  
   218  func TestProvisioner_formatDuration(t *testing.T) {
   219  	cases := map[string]struct {
   220  		Config map[string]cty.Value
   221  		Result string
   222  	}{
   223  		"testSeconds": {
   224  			Config: map[string]cty.Value{
   225  				"timeout": cty.StringVal("90s"),
   226  			},
   227  
   228  			Result: "PT1M30S",
   229  		},
   230  		"testMinutes": {
   231  			Config: map[string]cty.Value{
   232  				"timeout": cty.StringVal("5m"),
   233  			},
   234  
   235  			Result: "PT5M",
   236  		},
   237  		"testHours": {
   238  			Config: map[string]cty.Value{
   239  				"timeout": cty.StringVal("1h"),
   240  			},
   241  
   242  			Result: "PT1H",
   243  		},
   244  	}
   245  
   246  	for name, tc := range cases {
   247  		// host is required in the schema
   248  		tc.Config["host"] = cty.StringVal("")
   249  
   250  		conf, err := parseConnectionInfo(cty.ObjectVal(tc.Config))
   251  		if err != nil {
   252  			t.Fatalf("err: %v", err)
   253  		}
   254  
   255  		result := formatDuration(conf.TimeoutVal)
   256  		if result != tc.Result {
   257  			t.Fatalf("%s: expected: %s got: %s", name, tc.Result, result)
   258  		}
   259  	}
   260  }