summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/hashicorp/go-sockaddr/template/template_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/go-sockaddr/template/template_test.go')
-rw-r--r--vendor/github.com/hashicorp/go-sockaddr/template/template_test.go203
1 files changed, 203 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/go-sockaddr/template/template_test.go b/vendor/github.com/hashicorp/go-sockaddr/template/template_test.go
new file mode 100644
index 000000000..6f2b47828
--- /dev/null
+++ b/vendor/github.com/hashicorp/go-sockaddr/template/template_test.go
@@ -0,0 +1,203 @@
+package template_test
+
+import (
+ "testing"
+
+ socktmpl "github.com/hashicorp/go-sockaddr/template"
+)
+
+func TestSockAddr_Parse(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ output string
+ fail bool
+ requireOnline bool
+ }{
+ {
+ name: `basic include "name"`,
+ input: `{{GetAllInterfaces | include "name" "lo0" | printf "%v"}}`,
+ output: `[127.0.0.1/8 {1 16384 lo0 up|loopback|multicast} ::1 {1 16384 lo0 up|loopback|multicast} fe80::1/64 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: "invalid input",
+ input: `{{`,
+ output: ``,
+ fail: true,
+ },
+ {
+ name: "GetDefaultInterface",
+ input: `{{GetDefaultInterfaces | include "type" "IPv4" | attr "name" }}`,
+ output: `en0`,
+ },
+ {
+ name: `include "name" regexp`,
+ input: `{{GetAllInterfaces | include "name" "^(en|lo)0$" | exclude "name" "^en0$" | sort "type" | sort "address" | join "address" " " }}`,
+ output: `127.0.0.1 ::1 fe80::1`,
+ },
+ {
+ name: `exclude "name"`,
+ input: `{{. | include "name" "^(en|lo)0$" | exclude "name" "^en0$" | sort "type" | sort "address" | join "address" " " }}`,
+ output: `127.0.0.1 ::1 fe80::1`,
+ },
+ {
+ name: `"dot" pipeline, IPv4 type`,
+ input: `{{. | include "type" "IPv4" | include "name" "^lo0$" | sort "type" | sort "address" }}`,
+ output: `[127.0.0.1/8 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: `include "type" "IPv6`,
+ input: `{{. | include "type" "IPv6" | include "name" "^lo0$" | sort "address" }}`,
+ output: `[::1 {1 16384 lo0 up|loopback|multicast} fe80::1/64 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: "better example for IP types",
+ input: `{{. | include "type" "IPv4|IPv6" | include "name" "^lo0$" | sort "type" | sort "address" }}`,
+ output: `[127.0.0.1/8 {1 16384 lo0 up|loopback|multicast} ::1 {1 16384 lo0 up|loopback|multicast} fe80::1/64 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: "ifAddrs1",
+ input: `{{. | include "type" "IPv4" | include "name" "^lo0$"}}`,
+ output: `[127.0.0.1/8 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: "ifAddrs2",
+ input: `{{. | include "type" "IP" | include "name" "^lo0$" | sort "type" | sort "address" }}`,
+ output: `[127.0.0.1/8 {1 16384 lo0 up|loopback|multicast} ::1 {1 16384 lo0 up|loopback|multicast} fe80::1/64 {1 16384 lo0 up|loopback|multicast}]`,
+ },
+ {
+ name: `range "dot" example`,
+ input: `{{range . | include "type" "IP" | include "name" "^lo0$"}}{{.Name}} {{.SockAddr}} {{end}}`,
+ output: `lo0 127.0.0.1/8 lo0 ::1 lo0 fe80::1/64 `,
+ },
+ {
+ name: `exclude "type"`,
+ input: `{{. | exclude "type" "IPv4" | include "name" "^lo0$" | sort "address" | unique "name" | join "name" " "}} {{range . | exclude "type" "IPv4" | include "name" "^lo0$"}}{{.SockAddr}} {{end}}`,
+ output: `lo0 ::1 fe80::1/64 `,
+ },
+ {
+ name: "with variable pipeline",
+ input: `{{with $ifSet := include "type" "IPv4" . | include "name" "^lo0$"}}{{range $ifSet }}{{.Name}} {{end}}{{range $ifSet}}{{.SockAddr}} {{end}}{{end}}`,
+ output: `lo0 127.0.0.1/8 `,
+ },
+ {
+ name: "range sample on lo0",
+ input: `{{with $ifAddrs := . | exclude "rfc" "1918" | include "name" "lo0" | sort "type,address" }}{{range $ifAddrs }}{{.Name}}/{{.SockAddr.NetIP}} {{end}}{{end}}`,
+ output: `lo0/127.0.0.1 lo0/::1 lo0/fe80::1 `,
+ },
+ {
+ name: "non-RFC1918 on on lo0",
+ input: `{{. | exclude "rfc" "1918" | include "name" "lo0" | sort "type,address" | len | eq 3}}`,
+ output: `true`,
+ },
+ {
+ // NOTE(sean@): Difficult to reliably test includeByRFC.
+ // In this case, we ass-u-me that the host running the
+ // test has at least one RFC1918 address on their host.
+ name: `include "rfc"`,
+ input: `{{(. | include "rfc" "1918" | attr "name")}}`,
+ output: `en0`,
+ requireOnline: true,
+ },
+ {
+ name: "test for non-empty array",
+ input: `{{. | include "type" "IPv4" | include "rfc" "1918" | print | len | eq (len "[]")}}`,
+ output: `false`,
+ },
+ {
+ // NOTE(sean@): This will fail if there is a public IPv4 address on loopback.
+ name: "non-IPv4 RFC1918",
+ input: `{{. | include "name" "lo0" | exclude "type" "IPv4" | include "rfc" "1918" | len | eq 0}}`,
+ output: `true`,
+ },
+ {
+ // NOTE(sean@): There are no RFC6598 addresses on most testing hosts so this should be empty.
+ name: "rfc6598",
+ input: `{{. | include "type" "IPv4" | include "rfc" "6598" | print | len | eq (len "[]")}}`,
+ output: `true`,
+ },
+ {
+ name: "invalid RFC",
+ input: `{{. | include "type" "IPv4" | include "rfc" "99999999999" | print | len | eq (len "[]")}}`,
+ output: `true`,
+ fail: true,
+ },
+ {
+ name: `sort asc address`,
+ input: `{{ . | include "name" "lo0" | sort "type,address" | join "address" " " }}`,
+ output: `127.0.0.1 ::1 fe80::1`,
+ },
+ {
+ name: `sort asc address old`,
+ input: `{{with $ifSet := include "name" "lo0" . }}{{ range include "type" "IPv4" $ifSet | sort "address"}}{{ .SockAddr }} {{end}}{{ range include "type" "IPv6" $ifSet | sort "address"}}{{ .SockAddr }} {{end}}{{end}}`,
+ output: `127.0.0.1/8 ::1 fe80::1/64 `,
+ },
+ {
+ name: `sort desc address`,
+ input: `{{ . | include "name" "lo0" | sort "type,-address" | join "address" " " }}`,
+ output: `127.0.0.1 fe80::1 ::1`,
+ },
+ {
+ name: `sort desc address`,
+ input: `{{ . | include "name" "lo0" | include "type" "IPv6" | sort "type,-address" | join "address" " " }}`,
+ output: `fe80::1 ::1`,
+ },
+ {
+ name: `sort asc address`,
+ input: `{{with $ifSet := include "name" "lo0" . }}{{ range include "type" "IPv6" $ifSet | sort "address"}}{{ .SockAddr }} {{end}}{{end}}`,
+ output: `::1 fe80::1/64 `,
+ },
+ {
+ name: "lo0 limit 1",
+ input: `{{. | include "name" "lo0" | include "type" "IPv6" | sort "address" | limit 1 | len}}`,
+ output: `1`,
+ },
+ {
+ name: "join address",
+ input: `{{. | include "name" "lo0" | include "type" "IPv6" | sort "address" | join "address" " " }}`,
+ output: `::1 fe80::1`,
+ },
+ {
+ name: "join name",
+ input: `{{. | include "name" "lo0" | include "type" "IPv6" | sort "address" | join "name" " " }}`,
+ output: `lo0 lo0`,
+ },
+ {
+ name: "lo0 flags up and limit 1",
+ input: `{{. | include "name" "lo0" | include "flag" "up" | sort "-type,+address" | attr "address" }}`,
+ output: `::1`,
+ },
+ {
+ // NOTE(sean@): This is the HashiCorp default in 2016.
+ // Indented for effect. Using "true" as the output
+ // instead of printing the correct $rfc*Addrs values.
+ name: "HashiCorpDefault2016",
+ input: `
+{{- with $addr := GetAllInterfaces | include "type" "IP" | include "rfc" "1918|6598" | sort "address" | attr "address" -}}
+
+ {{- if ($addr | len) gt 0 -}}
+ {{- print "true" -}}{{/* print $addr*/ -}}
+ {{- end -}}
+{{- end -}}`,
+ output: `true`,
+ },
+ }
+
+ for i, test := range tests {
+ test := test // capture range variable
+ if test.name == "" {
+ t.Fatalf("test number %d has an empty test name", i)
+ }
+ t.Run(test.name, func(t *testing.T) {
+ t.Parallel()
+ out, err := socktmpl.Parse(test.input)
+ if err != nil && !test.fail {
+ t.Fatalf("%q: bad: %v", test.name, err)
+ }
+
+ if out != test.output && !test.fail {
+ t.Fatalf("%q: Expected %+q, received %+q\n%+q", test.name, test.output, out, test.input)
+ }
+ })
+ }
+}