opentofu/internal/communicator/winrm/provisioner_test.go
Martin Atkins ec85fb1960 Move communicator/ to internal/communicator/
This is part of a general effort to move all of Terraform's non-library
package surface under internal in order to reinforce that these are for
internal use within Terraform only.

If you were previously importing packages under this prefix into an
external codebase, you could pin to an earlier release tag as an interim
solution until you've make a plan to achieve the same functionality some
other way.
2021-05-17 14:09:07 -07:00

258 lines
6.9 KiB
Go

package winrm
import (
"testing"
"github.com/zclconf/go-cty/cty"
)
func TestProvisioner_defaultHTTPSPort(t *testing.T) {
v := cty.ObjectVal(map[string]cty.Value{
"type": cty.StringVal("winrm"),
"user": cty.StringVal("Administrator"),
"password": cty.StringVal("supersecret"),
"host": cty.StringVal("127.0.0.1"),
"https": cty.True,
})
conf, err := parseConnectionInfo(v)
if err != nil {
t.Fatalf("err: %v", err)
}
if conf.Port != 5986 {
t.Fatalf("expected: %v: got: %v", 5986, conf)
}
if conf.HTTPS != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
}
func TestProvisioner_connInfo(t *testing.T) {
v := cty.ObjectVal(map[string]cty.Value{
"type": cty.StringVal("winrm"),
"user": cty.StringVal("Administrator"),
"password": cty.StringVal("supersecret"),
"host": cty.StringVal("127.0.0.1"),
"port": cty.StringVal("5985"),
"https": cty.True,
"use_ntlm": cty.True,
"timeout": cty.StringVal("30s"),
})
conf, err := parseConnectionInfo(v)
if err != nil {
t.Fatalf("err: %v", err)
}
if conf.User != "Administrator" {
t.Fatalf("expected: %v: got: %v", "Administrator", conf)
}
if conf.Password != "supersecret" {
t.Fatalf("expected: %v: got: %v", "supersecret", conf)
}
if conf.Host != "127.0.0.1" {
t.Fatalf("expected: %v: got: %v", "127.0.0.1", conf)
}
if conf.Port != 5985 {
t.Fatalf("expected: %v: got: %v", 5985, conf)
}
if conf.HTTPS != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
if conf.NTLM != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
if conf.Timeout != "30s" {
t.Fatalf("expected: %v: got: %v", "30s", conf)
}
if conf.ScriptPath != DefaultScriptPath {
t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
}
}
func TestProvisioner_connInfoCACert(t *testing.T) {
caCert := `
-----BEGIN CERTIFICATE-----
MIIDBjCCAe4CCQCGWwBmOiHQdTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMB4XDTE2MDYyMTE2MzM0MVoXDTE3MDYyMTE2MzM0MVowRTELMAkG
A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AL+LFlsCJG5txZp4yuu+lQnuUrgBXRG+irQqcTXlV91Bp5hpmRIyhnGCtWxxDBUL
xrh4WN3VV/0jDzKT976oLgOy3hj56Cdqf+JlZ1qgMN5bHB3mm3aVWnrnsLbBsfwZ
SEbk3Kht/cE1nK2toNVW+rznS3m+eoV3Zn/DUNwGlZr42hGNs6ETn2jURY78ETqR
mW47xvjf86eIo7vULHJaY6xyarPqkL8DZazOmvY06hUGvGwGBny7gugfXqDG+I8n
cPBsGJGSAmHmVV8o0RCB9UjY+TvSMQRpEDoVlvyrGuglsD8to/4+7UcsuDGlRYN6
jmIOC37mOi/jwRfWL1YUa4MCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAPDxTH0oQ
JjKXoJgkmQxurB81RfnK/NrswJVzWbOv6ejcbhwh+/ZgJTMc15BrYcxU6vUW1V/i
Z7APU0qJ0icECACML+a2fRI7YdLCTiPIOmY66HY8MZHAn3dGjU5TeiUflC0n0zkP
mxKJe43kcYLNDItbfvUDo/GoxTXrC3EFVZyU0RhFzoVJdODlTHXMVFCzcbQEBrBJ
xKdShCEc8nFMneZcGFeEU488ntZoWzzms8/QpYrKa5S0Sd7umEU2Kwu4HTkvUFg/
CqDUFjhydXxYRsxXBBrEiLOE5BdtJR1sH/QHxIJe23C9iHI2nS1NbLziNEApLwC4
GnSud83VUo9G9w==
-----END CERTIFICATE-----
`
v := cty.ObjectVal(map[string]cty.Value{
"type": cty.StringVal("winrm"),
"user": cty.StringVal("Administrator"),
"password": cty.StringVal("supersecret"),
"host": cty.StringVal("127.0.0.1"),
"port": cty.StringVal("5985"),
"https": cty.True,
"timeout": cty.StringVal("30s"),
"cacert": cty.StringVal(caCert),
})
conf, err := parseConnectionInfo(v)
if err != nil {
t.Fatalf("err: %v", err)
}
if conf.User != "Administrator" {
t.Fatalf("expected: %v: got: %v", "Administrator", conf)
}
if conf.Password != "supersecret" {
t.Fatalf("expected: %v: got: %v", "supersecret", conf)
}
if conf.Host != "127.0.0.1" {
t.Fatalf("expected: %v: got: %v", "127.0.0.1", conf)
}
if conf.Port != 5985 {
t.Fatalf("expected: %v: got: %v", 5985, conf)
}
if conf.HTTPS != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
if conf.Timeout != "30s" {
t.Fatalf("expected: %v: got: %v", "30s", conf)
}
if conf.ScriptPath != DefaultScriptPath {
t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
}
if conf.CACert != caCert {
t.Fatalf("expected: %v: got: %v", caCert, conf.CACert)
}
}
func TestProvisioner_connInfoIpv6(t *testing.T) {
v := cty.ObjectVal(map[string]cty.Value{
"type": cty.StringVal("winrm"),
"user": cty.StringVal("Administrator"),
"password": cty.StringVal("supersecret"),
"host": cty.StringVal("::1"),
"port": cty.StringVal("5985"),
"https": cty.True,
"timeout": cty.StringVal("30s"),
})
conf, err := parseConnectionInfo(v)
if err != nil {
t.Fatalf("err: %v", err)
}
if conf.User != "Administrator" {
t.Fatalf("expected: %v: got: %v", "Administrator", conf)
}
if conf.Password != "supersecret" {
t.Fatalf("expected: %v: got: %v", "supersecret", conf)
}
if conf.Host != "[::1]" {
t.Fatalf("expected: %v: got: %v", "[::1]", conf)
}
if conf.Port != 5985 {
t.Fatalf("expected: %v: got: %v", 5985, conf)
}
if conf.HTTPS != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
if conf.Timeout != "30s" {
t.Fatalf("expected: %v: got: %v", "30s", conf)
}
if conf.ScriptPath != DefaultScriptPath {
t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
}
}
func TestProvisioner_connInfoHostname(t *testing.T) {
v := cty.ObjectVal(map[string]cty.Value{
"type": cty.StringVal("winrm"),
"user": cty.StringVal("Administrator"),
"password": cty.StringVal("supersecret"),
"host": cty.StringVal("example.com"),
"port": cty.StringVal("5985"),
"https": cty.True,
"timeout": cty.StringVal("30s"),
})
conf, err := parseConnectionInfo(v)
if err != nil {
t.Fatalf("err: %v", err)
}
if conf.User != "Administrator" {
t.Fatalf("expected: %v: got: %v", "Administrator", conf)
}
if conf.Password != "supersecret" {
t.Fatalf("expected: %v: got: %v", "supersecret", conf)
}
if conf.Host != "example.com" {
t.Fatalf("expected: %v: got: %v", "example.com", conf)
}
if conf.Port != 5985 {
t.Fatalf("expected: %v: got: %v", 5985, conf)
}
if conf.HTTPS != true {
t.Fatalf("expected: %v: got: %v", true, conf)
}
if conf.Timeout != "30s" {
t.Fatalf("expected: %v: got: %v", "30s", conf)
}
if conf.ScriptPath != DefaultScriptPath {
t.Fatalf("expected: %v: got: %v", DefaultScriptPath, conf)
}
}
func TestProvisioner_formatDuration(t *testing.T) {
cases := map[string]struct {
Config map[string]cty.Value
Result string
}{
"testSeconds": {
Config: map[string]cty.Value{
"timeout": cty.StringVal("90s"),
},
Result: "PT1M30S",
},
"testMinutes": {
Config: map[string]cty.Value{
"timeout": cty.StringVal("5m"),
},
Result: "PT5M",
},
"testHours": {
Config: map[string]cty.Value{
"timeout": cty.StringVal("1h"),
},
Result: "PT1H",
},
}
for name, tc := range cases {
// host is required in the schema
tc.Config["host"] = cty.StringVal("")
conf, err := parseConnectionInfo(cty.ObjectVal(tc.Config))
if err != nil {
t.Fatalf("err: %v", err)
}
result := formatDuration(conf.TimeoutVal)
if result != tc.Result {
t.Fatalf("%s: expected: %s got: %s", name, tc.Result, result)
}
}
}