Commit 3e740d41 authored by Geoff Simmons's avatar Geoff Simmons

Maintenance for testing generation from templates.

Use a diff package for verbose error display when a gold file does
not match. This has been especially difficult when there are
whitespace mismatches.

Encapsulate the test idiom in a single function. Lotsa DRY.

Tidy up the module list while we're here.
parent cfb18c7b
...@@ -2,6 +2,8 @@ module code.uplex.de/uplex-varnish/k8s-ingress ...@@ -2,6 +2,8 @@ module code.uplex.de/uplex-varnish/k8s-ingress
require ( require (
code.uplex.de/uplex-varnish/varnishapi v0.0.0-20191205154529-31e610a4139d code.uplex.de/uplex-varnish/varnishapi v0.0.0-20191205154529-31e610a4139d
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883
github.com/go-openapi/spec v0.19.2 // indirect
github.com/go-openapi/strfmt v0.19.0 github.com/go-openapi/strfmt v0.19.0
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff // indirect github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff // indirect
github.com/google/go-cmp v0.3.0 github.com/google/go-cmp v0.3.0
...@@ -9,10 +11,10 @@ require ( ...@@ -9,10 +11,10 @@ require (
github.com/haproxytech/models v1.2.4 github.com/haproxytech/models v1.2.4
github.com/imdario/mergo v0.3.6 // indirect github.com/imdario/mergo v0.3.6 // indirect
github.com/prometheus/client_golang v0.9.2 github.com/prometheus/client_golang v0.9.2
github.com/sergi/go-diff v1.1.0 // indirect
github.com/sirupsen/logrus v1.2.0 github.com/sirupsen/logrus v1.2.0
gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/api v0.16.4 k8s.io/api v0.16.4
k8s.io/apimachinery v0.16.4 k8s.io/apimachinery v0.16.4
k8s.io/client-go v0.16.4 k8s.io/client-go v0.16.4
k8s.io/code-generator v0.16.5-beta.1 // indirect
) )
This diff is collapsed.
...@@ -28,10 +28,7 @@ ...@@ -28,10 +28,7 @@
package vcl package vcl
import ( import "testing"
"bytes"
"testing"
)
var extWhiskeySvc = Service{ var extWhiskeySvc = Service{
Name: "whiskey-svc", Name: "whiskey-svc",
...@@ -83,22 +80,7 @@ var barSpec = Spec{ ...@@ -83,22 +80,7 @@ var barSpec = Spec{
} }
func TestExternalNameSvc(t *testing.T) { func TestExternalNameSvc(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, barSpec, "extname.golden")
gold := "extname.golden"
if err := ingressTmpl.Execute(&buf, barSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var extTequilaSvc = Service{ var extTequilaSvc = Service{
...@@ -173,20 +155,5 @@ var boozeSpec = Spec{ ...@@ -173,20 +155,5 @@ var boozeSpec = Spec{
} }
func TestExternalNameBcfg(t *testing.T) { func TestExternalNameBcfg(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, boozeSpec, "extname_bcfg.golden")
gold := "extname_bcfg.golden"
if err := ingressTmpl.Execute(&buf, boozeSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
...@@ -28,12 +28,7 @@ ...@@ -28,12 +28,7 @@
package vcl package vcl
import ( import "testing"
"bytes"
_ "io/ioutil"
_ "path/filepath"
"testing"
)
var cafeNoHostSpec = Spec{ var cafeNoHostSpec = Spec{
Rules: []Rule{ Rules: []Rule{
...@@ -57,22 +52,8 @@ var cafeNoHostSpec = Spec{ ...@@ -57,22 +52,8 @@ var cafeNoHostSpec = Spec{
} }
func TestIngressFanoutNoHost(t *testing.T) { func TestIngressFanoutNoHost(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, cafeNoHostSpec,
gold := "ingress_fanout_nohost.golden" "ingress_fanout_nohost.golden")
if err := ingressTmpl.Execute(&buf, cafeNoHostSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var h2oSvc = Service{ var h2oSvc = Service{
...@@ -121,22 +102,8 @@ var cafeVhostNoHostSpec = Spec{ ...@@ -121,22 +102,8 @@ var cafeVhostNoHostSpec = Spec{
} }
func TestIngressVhostNoHost(t *testing.T) { func TestIngressVhostNoHost(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, cafeVhostNoHostSpec,
gold := "ingress_vhost_nohost.golden" "ingress_vhost_nohost.golden")
if err := ingressTmpl.Execute(&buf, cafeVhostNoHostSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var singleSvcSpec = Spec{ var singleSvcSpec = Spec{
...@@ -145,22 +112,7 @@ var singleSvcSpec = Spec{ ...@@ -145,22 +112,7 @@ var singleSvcSpec = Spec{
} }
func TestIngressSingleSvc(t *testing.T) { func TestIngressSingleSvc(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, singleSvcSpec, "ingress_single_svc.golden")
gold := "ingress_single_svc.golden"
if err := ingressTmpl.Execute(&buf, singleSvcSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var defaultSvcProbeDir = Spec{ var defaultSvcProbeDir = Spec{
...@@ -169,22 +121,8 @@ var defaultSvcProbeDir = Spec{ ...@@ -169,22 +121,8 @@ var defaultSvcProbeDir = Spec{
} }
func TestIngressDefaultProbeDir(t *testing.T) { func TestIngressDefaultProbeDir(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, defaultSvcProbeDir,
gold := "ingress_default_probe_dir.golden" "ingress_default_probe_dir.golden")
if err := ingressTmpl.Execute(&buf, defaultSvcProbeDir); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var barDefaultProbeDir = Spec{ var barDefaultProbeDir = Spec{
...@@ -195,20 +133,6 @@ var barDefaultProbeDir = Spec{ ...@@ -195,20 +133,6 @@ var barDefaultProbeDir = Spec{
} }
func TestIngressDefaultRules(t *testing.T) { func TestIngressDefaultRules(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, barDefaultProbeDir,
gold := "ingress_default_rules.golden" "ingress_default_rules.golden")
if err := ingressTmpl.Execute(&buf, barDefaultProbeDir); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
...@@ -133,7 +133,7 @@ var builtinRecvSpec = Spec{ ...@@ -133,7 +133,7 @@ var builtinRecvSpec = Spec{
func TestReqDispBuiltinRecv(t *testing.T) { func TestReqDispBuiltinRecv(t *testing.T) {
gold := "recv_disp_builtin.golden" gold := "recv_disp_builtin.golden"
testTemplate(t, reqDispTmpl, builtinRecvSpec, gold) templateTest(t, reqDispTmpl, builtinRecvSpec, gold)
} }
var pipeOnConnectSpec = Spec{ var pipeOnConnectSpec = Spec{
...@@ -151,7 +151,7 @@ var pipeOnConnectSpec = Spec{ ...@@ -151,7 +151,7 @@ var pipeOnConnectSpec = Spec{
func TestReqDispPipeOnConnect(t *testing.T) { func TestReqDispPipeOnConnect(t *testing.T) {
gold := "recv_disp_pipe_on_connect.golden" gold := "recv_disp_pipe_on_connect.golden"
testTemplate(t, reqDispTmpl, pipeOnConnectSpec, gold) templateTest(t, reqDispTmpl, pipeOnConnectSpec, gold)
} }
var methodNotAllowedSpec = Spec{ var methodNotAllowedSpec = Spec{
...@@ -182,7 +182,7 @@ var methodNotAllowedSpec = Spec{ ...@@ -182,7 +182,7 @@ var methodNotAllowedSpec = Spec{
func TestReqDispMethodNotAllowed(t *testing.T) { func TestReqDispMethodNotAllowed(t *testing.T) {
gold := "recv_disp_method_not_allowed.golden" gold := "recv_disp_method_not_allowed.golden"
testTemplate(t, reqDispTmpl, methodNotAllowedSpec, gold) templateTest(t, reqDispTmpl, methodNotAllowedSpec, gold)
} }
var urlWhitelistSpec = Spec{ var urlWhitelistSpec = Spec{
...@@ -211,7 +211,7 @@ var urlWhitelistSpec = Spec{ ...@@ -211,7 +211,7 @@ var urlWhitelistSpec = Spec{
func TestReqDispURLWhitelist(t *testing.T) { func TestReqDispURLWhitelist(t *testing.T) {
gold := "recv_disp_url_whitelist.golden" gold := "recv_disp_url_whitelist.golden"
testTemplate(t, reqDispTmpl, urlWhitelistSpec, gold) templateTest(t, reqDispTmpl, urlWhitelistSpec, gold)
} }
var purgeMethodSpec = Spec{ var purgeMethodSpec = Spec{
...@@ -229,7 +229,7 @@ var purgeMethodSpec = Spec{ ...@@ -229,7 +229,7 @@ var purgeMethodSpec = Spec{
func TestReqDispPurgeMethod(t *testing.T) { func TestReqDispPurgeMethod(t *testing.T) {
gold := "recv_disp_purge_method.golden" gold := "recv_disp_purge_method.golden"
testTemplate(t, reqDispTmpl, purgeMethodSpec, gold) templateTest(t, reqDispTmpl, purgeMethodSpec, gold)
} }
var cacheableSpec = Spec{ var cacheableSpec = Spec{
...@@ -255,7 +255,7 @@ var cacheableSpec = Spec{ ...@@ -255,7 +255,7 @@ var cacheableSpec = Spec{
func TestReqDispCacheable(t *testing.T) { func TestReqDispCacheable(t *testing.T) {
gold := "recv_disp_cacheable.golden" gold := "recv_disp_cacheable.golden"
testTemplate(t, reqDispTmpl, cacheableSpec, gold) templateTest(t, reqDispTmpl, cacheableSpec, gold)
} }
var nonCacheableSpec = Spec{ var nonCacheableSpec = Spec{
...@@ -281,23 +281,5 @@ var nonCacheableSpec = Spec{ ...@@ -281,23 +281,5 @@ var nonCacheableSpec = Spec{
func TestReqDispNonCacheable(t *testing.T) { func TestReqDispNonCacheable(t *testing.T) {
gold := "recv_disp_non_cacheable.golden" gold := "recv_disp_non_cacheable.golden"
testTemplate(t, reqDispTmpl, nonCacheableSpec, gold) templateTest(t, reqDispTmpl, nonCacheableSpec, gold)
} }
// Code boilerplate for writing the golden file.
// import ioutils
// func TestRewriteXXX(t *testing.T) {
// gold := "rewrite_XXX.golden"
// var buf bytes.Buffer
// if err := rewriteTmpl.Execute(&buf, spec); err != nil {
// t.Fatal("Execute():", err)
// }
// if err := ioutil.WriteFile("testdata/"+gold, buf.Bytes(), 0644); err != nil {
// t.Fatal("WriteFile():", err)
// }
// if testing.Verbose() {
// t.Logf("Generated: %s", buf.String())
// }
// }
...@@ -32,28 +32,8 @@ import ( ...@@ -32,28 +32,8 @@ import (
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"testing" "testing"
"text/template"
) )
func testTemplate(t *testing.T, tmpl *template.Template, spec Spec, gold string) {
var buf bytes.Buffer
if err := tmpl.Execute(&buf, spec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL does not match gold file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
}
var replaceFromStringTest = Spec{ var replaceFromStringTest = Spec{
Rewrites: []Rewrite{{ Rewrites: []Rewrite{{
Rules: []RewriteRule{{ Rules: []RewriteRule{{
...@@ -69,7 +49,7 @@ var replaceFromStringTest = Spec{ ...@@ -69,7 +49,7 @@ var replaceFromStringTest = Spec{
func TestReplaceFromString(t *testing.T) { func TestReplaceFromString(t *testing.T) {
gold := "rewrite_replace_from_string.golden" gold := "rewrite_replace_from_string.golden"
testTemplate(t, rewriteTmpl, replaceFromStringTest, gold) templateTest(t, rewriteTmpl, replaceFromStringTest, gold)
} }
var replaceFromSourceTest = Spec{ var replaceFromSourceTest = Spec{
...@@ -85,7 +65,7 @@ var replaceFromSourceTest = Spec{ ...@@ -85,7 +65,7 @@ var replaceFromSourceTest = Spec{
func TestReplaceFromSource(t *testing.T) { func TestReplaceFromSource(t *testing.T) {
gold := "rewrite_replace_from_source.golden" gold := "rewrite_replace_from_source.golden"
testTemplate(t, rewriteTmpl, replaceFromSourceTest, gold) templateTest(t, rewriteTmpl, replaceFromSourceTest, gold)
} }
var replaceFromRewriteTest = Spec{ var replaceFromRewriteTest = Spec{
...@@ -112,7 +92,7 @@ var replaceFromRewriteTest = Spec{ ...@@ -112,7 +92,7 @@ var replaceFromRewriteTest = Spec{
func TestReplaceFromRewrite(t *testing.T) { func TestReplaceFromRewrite(t *testing.T) {
gold := "rewrite_replace_from_rewrite.golden" gold := "rewrite_replace_from_rewrite.golden"
testTemplate(t, rewriteTmpl, replaceFromRewriteTest, gold) templateTest(t, rewriteTmpl, replaceFromRewriteTest, gold)
} }
var rewriteSubTest = Spec{ var rewriteSubTest = Spec{
...@@ -140,7 +120,7 @@ var rewriteSubTest = Spec{ ...@@ -140,7 +120,7 @@ var rewriteSubTest = Spec{
func TestRewriteSub(t *testing.T) { func TestRewriteSub(t *testing.T) {
gold := "rewrite_sub.golden" gold := "rewrite_sub.golden"
testTemplate(t, rewriteTmpl, rewriteSubTest, gold) templateTest(t, rewriteTmpl, rewriteSubTest, gold)
} }
var rewriteAppendTest = Spec{ var rewriteAppendTest = Spec{
...@@ -159,7 +139,7 @@ var rewriteAppendTest = Spec{ ...@@ -159,7 +139,7 @@ var rewriteAppendTest = Spec{
func TestRewriteAppend(t *testing.T) { func TestRewriteAppend(t *testing.T) {
gold := "rewrite_append.golden" gold := "rewrite_append.golden"
testTemplate(t, rewriteTmpl, rewriteAppendTest, gold) templateTest(t, rewriteTmpl, rewriteAppendTest, gold)
} }
var rewritePrependTest = Spec{ var rewritePrependTest = Spec{
...@@ -178,7 +158,7 @@ var rewritePrependTest = Spec{ ...@@ -178,7 +158,7 @@ var rewritePrependTest = Spec{
func TestRewritePrepend(t *testing.T) { func TestRewritePrepend(t *testing.T) {
gold := "rewrite_prepend.golden" gold := "rewrite_prepend.golden"
testTemplate(t, rewriteTmpl, rewritePrependTest, gold) templateTest(t, rewriteTmpl, rewritePrependTest, gold)
} }
var rewriteDeleteTest = Spec{ var rewriteDeleteTest = Spec{
...@@ -194,7 +174,7 @@ var rewriteDeleteTest = Spec{ ...@@ -194,7 +174,7 @@ var rewriteDeleteTest = Spec{
func TestRewriteDelete(t *testing.T) { func TestRewriteDelete(t *testing.T) {
gold := "rewrite_delete.golden" gold := "rewrite_delete.golden"
testTemplate(t, rewriteTmpl, rewriteDeleteTest, gold) templateTest(t, rewriteTmpl, rewriteDeleteTest, gold)
} }
var conditionalDeleteTest = Spec{ var conditionalDeleteTest = Spec{
...@@ -217,7 +197,7 @@ var conditionalDeleteTest = Spec{ ...@@ -217,7 +197,7 @@ var conditionalDeleteTest = Spec{
func TestConditionalDelete(t *testing.T) { func TestConditionalDelete(t *testing.T) {
gold := "rewrite_conditional_delete.golden" gold := "rewrite_conditional_delete.golden"
testTemplate(t, rewriteTmpl, conditionalDeleteTest, gold) templateTest(t, rewriteTmpl, conditionalDeleteTest, gold)
} }
var rewriteExtractTest = Spec{ var rewriteExtractTest = Spec{
...@@ -239,7 +219,7 @@ var rewriteExtractTest = Spec{ ...@@ -239,7 +219,7 @@ var rewriteExtractTest = Spec{
func TestRewriteExtract(t *testing.T) { func TestRewriteExtract(t *testing.T) {
gold := "rewrite_extract.golden" gold := "rewrite_extract.golden"
testTemplate(t, rewriteTmpl, rewriteExtractTest, gold) templateTest(t, rewriteTmpl, rewriteExtractTest, gold)
} }
var rewriteFixedPrefixTest = Spec{ var rewriteFixedPrefixTest = Spec{
...@@ -266,7 +246,7 @@ var rewriteFixedPrefixTest = Spec{ ...@@ -266,7 +246,7 @@ var rewriteFixedPrefixTest = Spec{
func TestRewriteFixedPrefix(t *testing.T) { func TestRewriteFixedPrefix(t *testing.T) {
gold := "rewrite_fixed_prefix.golden" gold := "rewrite_fixed_prefix.golden"
testTemplate(t, rewriteTmpl, rewriteFixedPrefixTest, gold) templateTest(t, rewriteTmpl, rewriteFixedPrefixTest, gold)
} }
var rewriteFixedEqualTest = Spec{ var rewriteFixedEqualTest = Spec{
...@@ -293,7 +273,7 @@ var rewriteFixedEqualTest = Spec{ ...@@ -293,7 +273,7 @@ var rewriteFixedEqualTest = Spec{
func TestRewriteFixedEqual(t *testing.T) { func TestRewriteFixedEqual(t *testing.T) {
gold := "rewrite_fixed_equal.golden" gold := "rewrite_fixed_equal.golden"
testTemplate(t, rewriteTmpl, rewriteFixedEqualTest, gold) templateTest(t, rewriteTmpl, rewriteFixedEqualTest, gold)
} }
var rewriteFixedSuballTest = Spec{ var rewriteFixedSuballTest = Spec{
...@@ -320,7 +300,7 @@ var rewriteFixedSuballTest = Spec{ ...@@ -320,7 +300,7 @@ var rewriteFixedSuballTest = Spec{
func TestRewriteFixedSuball(t *testing.T) { func TestRewriteFixedSuball(t *testing.T) {
gold := "rewrite_fixed_suball.golden" gold := "rewrite_fixed_suball.golden"
testTemplate(t, rewriteTmpl, rewriteFixedSuballTest, gold) templateTest(t, rewriteTmpl, rewriteFixedSuballTest, gold)
} }
var rewritePrefixRegex = Spec{ var rewritePrefixRegex = Spec{
...@@ -349,7 +329,7 @@ var rewritePrefixRegex = Spec{ ...@@ -349,7 +329,7 @@ var rewritePrefixRegex = Spec{
func TestRewritePrefixRegex(t *testing.T) { func TestRewritePrefixRegex(t *testing.T) {
gold := "rewrite_prefix_regex.golden" gold := "rewrite_prefix_regex.golden"
testTemplate(t, rewriteTmpl, rewritePrefixRegex, gold) templateTest(t, rewriteTmpl, rewritePrefixRegex, gold)
} }
var rewritePrependIfExists = Spec{ var rewritePrependIfExists = Spec{
...@@ -372,7 +352,7 @@ var rewritePrependIfExists = Spec{ ...@@ -372,7 +352,7 @@ var rewritePrependIfExists = Spec{
func TestRewritePrependIfExists(t *testing.T) { func TestRewritePrependIfExists(t *testing.T) {
gold := "rewrite_prepend_if_exists.golden" gold := "rewrite_prepend_if_exists.golden"
testTemplate(t, rewriteTmpl, rewritePrependIfExists, gold) templateTest(t, rewriteTmpl, rewritePrependIfExists, gold)
} }
var rewriteExtractCookie = Spec{ var rewriteExtractCookie = Spec{
...@@ -393,7 +373,7 @@ var rewriteExtractCookie = Spec{ ...@@ -393,7 +373,7 @@ var rewriteExtractCookie = Spec{
func TestExtractCookie(t *testing.T) { func TestExtractCookie(t *testing.T) {
gold := "rewrite_extract_cookie.golden" gold := "rewrite_extract_cookie.golden"
testTemplate(t, rewriteTmpl, rewriteExtractCookie, gold) templateTest(t, rewriteTmpl, rewriteExtractCookie, gold)
} }
var rewriteXCacheHdr = Spec{ var rewriteXCacheHdr = Spec{
...@@ -444,7 +424,7 @@ var rewriteXCacheHdr = Spec{ ...@@ -444,7 +424,7 @@ var rewriteXCacheHdr = Spec{
func TestXCacheHdr(t *testing.T) { func TestXCacheHdr(t *testing.T) {
gold := "rewrite_x_cache_hdr.golden" gold := "rewrite_x_cache_hdr.golden"
testTemplate(t, rewriteTmpl, rewriteXCacheHdr, gold) templateTest(t, rewriteTmpl, rewriteXCacheHdr, gold)
} }
var rewriteAppendFromSrcTest = Spec{ var rewriteAppendFromSrcTest = Spec{
...@@ -457,7 +437,7 @@ var rewriteAppendFromSrcTest = Spec{ ...@@ -457,7 +437,7 @@ var rewriteAppendFromSrcTest = Spec{
func TestRewriteAppendFromSrcTest(t *testing.T) { func TestRewriteAppendFromSrcTest(t *testing.T) {
gold := "rewrite_append_from_src.golden" gold := "rewrite_append_from_src.golden"
testTemplate(t, rewriteTmpl, rewriteAppendFromSrcTest, gold) templateTest(t, rewriteTmpl, rewriteAppendFromSrcTest, gold)
} }
var rewriteAppendRule = Spec{ var rewriteAppendRule = Spec{
...@@ -478,7 +458,7 @@ var rewriteAppendRule = Spec{ ...@@ -478,7 +458,7 @@ var rewriteAppendRule = Spec{
func TestRewriteAppendRule(t *testing.T) { func TestRewriteAppendRule(t *testing.T) {
gold := "rewrite_append_rule.golden" gold := "rewrite_append_rule.golden"
testTemplate(t, rewriteTmpl, rewriteAppendRule, gold) templateTest(t, rewriteTmpl, rewriteAppendRule, gold)
} }
var rewritePrependHdr = Spec{ var rewritePrependHdr = Spec{
...@@ -494,7 +474,7 @@ var rewritePrependHdr = Spec{ ...@@ -494,7 +474,7 @@ var rewritePrependHdr = Spec{
func TestRewritePrependHdr(t *testing.T) { func TestRewritePrependHdr(t *testing.T) {
gold := "rewrite_prepend_hdr.golden" gold := "rewrite_prepend_hdr.golden"
testTemplate(t, rewriteTmpl, rewritePrependHdr, gold) templateTest(t, rewriteTmpl, rewritePrependHdr, gold)
} }
var rewriteSelectFirst = Spec{ var rewriteSelectFirst = Spec{
...@@ -529,7 +509,7 @@ var rewriteSelectFirst = Spec{ ...@@ -529,7 +509,7 @@ var rewriteSelectFirst = Spec{
func TestRewriteSelectFirst(t *testing.T) { func TestRewriteSelectFirst(t *testing.T) {
gold := "rewrite_select_first.golden" gold := "rewrite_select_first.golden"
testTemplate(t, rewriteTmpl, rewriteSelectFirst, gold) templateTest(t, rewriteTmpl, rewriteSelectFirst, gold)
} }
var rewriteSelectPermutations = Spec{ var rewriteSelectPermutations = Spec{
...@@ -617,7 +597,7 @@ var rewriteSelectPermutations = Spec{ ...@@ -617,7 +597,7 @@ var rewriteSelectPermutations = Spec{
func TestRewriteSelectPermutations(t *testing.T) { func TestRewriteSelectPermutations(t *testing.T) {
gold := "rewrite_select_permute.golden" gold := "rewrite_select_permute.golden"
testTemplate(t, rewriteTmpl, rewriteSelectPermutations, gold) templateTest(t, rewriteTmpl, rewriteSelectPermutations, gold)
} }
var rewriteSelectOperations = Spec{ var rewriteSelectOperations = Spec{
...@@ -697,7 +677,7 @@ var rewriteSelectOperations = Spec{ ...@@ -697,7 +677,7 @@ var rewriteSelectOperations = Spec{
func TestRewriteSelectOperations(t *testing.T) { func TestRewriteSelectOperations(t *testing.T) {
gold := "rewrite_select_ops.golden" gold := "rewrite_select_ops.golden"
testTemplate(t, rewriteTmpl, rewriteSelectOperations, gold) templateTest(t, rewriteTmpl, rewriteSelectOperations, gold)
} }
// Test the use case that Auth should be executed, but the // Test the use case that Auth should be executed, but the
...@@ -737,21 +717,3 @@ func TestRewriteDeleteAuth(t *testing.T) { ...@@ -737,21 +717,3 @@ func TestRewriteDeleteAuth(t *testing.T) {
src) src)
} }
} }
// Code boilerplate for writing the golden file.
// import ioutils
// func TestRewriteXXX(t *testing.T) {
// gold := "rewrite_XXX.golden"
// var buf bytes.Buffer
// if err := rewriteTmpl.Execute(&buf, spec); err != nil {
// t.Fatal("Execute():", err)
// }
// if err := ioutil.WriteFile("testdata/"+gold, buf.Bytes(), 0644); err != nil {
// t.Fatal("WriteFile():", err)
// }
// if testing.Verbose() {
// t.Logf("Generated: %s", buf.String())
// }
// }
...@@ -72,46 +72,12 @@ var varnishCluster = ShardCluster{ ...@@ -72,46 +72,12 @@ var varnishCluster = ShardCluster{
} }
func TestShardTemplate(t *testing.T) { func TestShardTemplate(t *testing.T) {
var buf bytes.Buffer templateTest(t, shardTmpl, varnishCluster, "shard.golden")
gold := "shard.golden"
if err := shardTmpl.Execute(&buf, varnishCluster); err != nil {
t.Error("cluster template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for self-sharding does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
func TestPrimaryOnlyShardTemplate(t *testing.T) { func TestPrimaryOnlyShardTemplate(t *testing.T) {
var buf bytes.Buffer
gold := "primaryonly_shard.golden"
varnishCluster.PrimaryOnly = true varnishCluster.PrimaryOnly = true
if err := shardTmpl.Execute(&buf, varnishCluster); err != nil { templateTest(t, shardTmpl, varnishCluster, "primaryonly_shard.golden")
t.Error("cluster template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for primary-only self-sharding does "+
"not match gold file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
func TestGetSrc(t *testing.T) { func TestGetSrc(t *testing.T) {
...@@ -128,82 +94,35 @@ func TestGetSrc(t *testing.T) { ...@@ -128,82 +94,35 @@ func TestGetSrc(t *testing.T) {
t.Fatalf("Reading %s: %v", gold, err) t.Fatalf("Reading %s: %v", gold, err)
} }
if !ok { if !ok {
t.Errorf("Generated VCL from GetSrc() does not match gold "+ t.Errorf("Generated VCL does not match gold file: %s", gold)
"file: %s", gold)
if testing.Verbose() { if testing.Verbose() {
t.Logf("Generated: %s", src) buf := bytes.NewBufferString(src)
if msg, err := diffGold(*buf, gold); err == nil {
t.Logf("diff:\n%s", msg)
} else {
t.Logf("Generated:\n%s", src)
}
} }
} }
} }
func TestShardByURL(t *testing.T) { func TestShardByURL(t *testing.T) {
var buf bytes.Buffer
gold := "shard_by_url.golden"
varnishCluster.PrimaryOnly = true varnishCluster.PrimaryOnly = true
varnishCluster.By = URL varnishCluster.By = URL
if err := shardTmpl.Execute(&buf, varnishCluster); err != nil { templateTest(t, shardTmpl, varnishCluster, "shard_by_url.golden")
t.Error("cluster template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for self-sharding does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
func TestShardByKey(t *testing.T) { func TestShardByKey(t *testing.T) {
var buf bytes.Buffer
gold := "shard_by_key.golden"
varnishCluster.PrimaryOnly = true varnishCluster.PrimaryOnly = true
varnishCluster.By = Key varnishCluster.By = Key
varnishCluster.Key = "req.http.Host" varnishCluster.Key = "req.http.Host"
if err := shardTmpl.Execute(&buf, varnishCluster); err != nil { templateTest(t, shardTmpl, varnishCluster, "shard_by_key.golden")
t.Error("cluster template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for self-sharding does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
func TestShardByDigest(t *testing.T) { func TestShardByDigest(t *testing.T) {
var buf bytes.Buffer
gold := "shard_by_digest.golden"
varnishCluster.PrimaryOnly = true varnishCluster.PrimaryOnly = true
varnishCluster.By = Blob varnishCluster.By = Blob
varnishCluster.Key = "req.http.Host" varnishCluster.Key = "req.http.Host"
varnishCluster.Algo = Sha3_512 varnishCluster.Algo = Sha3_512
if err := shardTmpl.Execute(&buf, varnishCluster); err != nil { templateTest(t, shardTmpl, varnishCluster, "shard_by_digest.golden")
t.Error("cluster template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for self-sharding does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
...@@ -33,17 +33,59 @@ import ( ...@@ -33,17 +33,59 @@ import (
"io/ioutil" "io/ioutil"
"path/filepath" "path/filepath"
"testing" "testing"
"text/template"
"github.com/andreyvit/diff"
) )
func cmpGold(got []byte, goldfile string) (bool, error) { func goldBytes(goldfile string) ([]byte, error) {
goldpath := filepath.Join("testdata", goldfile) goldpath := filepath.Join("testdata", goldfile)
gold, err := ioutil.ReadFile(goldpath) gold, err := ioutil.ReadFile(goldpath)
if err != nil {
return nil, err
}
return gold, nil
}
func cmpGold(got []byte, goldfile string) (bool, error) {
gold, err := goldBytes(goldfile)
if err != nil { if err != nil {
return false, err return false, err
} }
return bytes.Equal(got, gold), nil return bytes.Equal(got, gold), nil
} }
func diffGold(got bytes.Buffer, goldfile string) (string, error) {
gold, err := goldBytes(goldfile)
if err != nil {
return "", err
}
return diff.LineDiff(string(gold), got.String()), nil
}
func templateTest(
t *testing.T, tmpl *template.Template, spec interface{}, gold string,
) {
var buf bytes.Buffer
if err := tmpl.Execute(&buf, spec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL does not match gold file: %s", gold)
if testing.Verbose() {
if msg, err := diffGold(buf, gold); err == nil {
t.Logf("diff:\n%s", msg)
} else {
t.Logf("Generated:\n%s", buf.String())
}
}
}
}
var teaSvc = Service{ var teaSvc = Service{
Name: "tea-svc", Name: "tea-svc",
Addresses: []Address{ Addresses: []Address{
...@@ -102,22 +144,7 @@ var cafeSpec = Spec{ ...@@ -102,22 +144,7 @@ var cafeSpec = Spec{
} }
func TestIngressTemplate(t *testing.T) { func TestIngressTemplate(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, cafeSpec, "ingressrule.golden")
gold := "ingressrule.golden"
if err := ingressTmpl.Execute(&buf, cafeSpec); err != nil {
t.Fatal("Execute():", err)
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for IngressSpec does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var auths = Spec{ var auths = Spec{
...@@ -191,24 +218,7 @@ var auths = Spec{ ...@@ -191,24 +218,7 @@ var auths = Spec{
} }
func TestAuthTemplate(t *testing.T) { func TestAuthTemplate(t *testing.T) {
var buf bytes.Buffer templateTest(t, authTmpl, auths, "auth.golden")
gold := "auth.golden"
if err := authTmpl.Execute(&buf, auths); err != nil {
t.Error("auths template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for authorization does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var acls = Spec{ var acls = Spec{
...@@ -356,24 +366,7 @@ var acls = Spec{ ...@@ -356,24 +366,7 @@ var acls = Spec{
} }
func TestAclTemplate(t *testing.T) { func TestAclTemplate(t *testing.T) {
var buf bytes.Buffer templateTest(t, aclTmpl, acls, "acl.golden")
gold := "acl.golden"
if err := aclTmpl.Execute(&buf, acls); err != nil {
t.Error("acls template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for authorization does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var aclResultHdr = Spec{ var aclResultHdr = Spec{
...@@ -408,23 +401,7 @@ var aclResultHdr = Spec{ ...@@ -408,23 +401,7 @@ var aclResultHdr = Spec{
} }
func TestAclResultHeader(t *testing.T) { func TestAclResultHeader(t *testing.T) {
var buf bytes.Buffer templateTest(t, aclTmpl, aclResultHdr, "acl_result_hdr.golden")
gold := "acl_result_hdr.golden"
if err := aclTmpl.Execute(&buf, aclResultHdr); err != nil {
t.Error("acls template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL does not match gold file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var aclNoFail = Spec{ var aclNoFail = Spec{
...@@ -459,23 +436,7 @@ var aclNoFail = Spec{ ...@@ -459,23 +436,7 @@ var aclNoFail = Spec{
} }
func TestAclNoFail(t *testing.T) { func TestAclNoFail(t *testing.T) {
var buf bytes.Buffer templateTest(t, aclTmpl, aclNoFail, "acl_no_fail.golden")
gold := "acl_no_fail.golden"
if err := aclTmpl.Execute(&buf, aclNoFail); err != nil {
t.Error("acls template Execute():", err)
return
}
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL does not match gold file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
} }
var customVCLSpec = Spec{ var customVCLSpec = Spec{
...@@ -509,10 +470,14 @@ func TestCustomVCL(t *testing.T) { ...@@ -509,10 +470,14 @@ func TestCustomVCL(t *testing.T) {
t.Fatalf("Reading %s: %v", gold, err) t.Fatalf("Reading %s: %v", gold, err)
} }
if !ok { if !ok {
t.Errorf("Generated VCL for custom VCL does not match gold "+ t.Errorf("Generated VCL does not match gold file: %s", gold)
"file: %s", gold)
if testing.Verbose() { if testing.Verbose() {
t.Log("Generated: ", vcl) buf := bytes.NewBufferString(vcl)
if msg, err := diffGold(*buf, gold); err == nil {
t.Logf("diff:\n%s", msg)
} else {
t.Logf("Generated:\n%s", vcl)
}
} }
} }
} }
...@@ -632,22 +597,23 @@ var cafeProbeDir = Spec{ ...@@ -632,22 +597,23 @@ var cafeProbeDir = Spec{
} }
func TestBackendConfig(t *testing.T) { func TestBackendConfig(t *testing.T) {
var buf bytes.Buffer templateTest(t, ingressTmpl, cafeProbeDir, "backendcfg.golden")
gold := "backendcfg.golden" }
if err := ingressTmpl.Execute(&buf, cafeProbeDir); err != nil { // Code boilerplate for writing the golden file.
t.Fatal("Execute():", err) // import ioutils
} // func TestXXX(t *testing.T) {
// gold := "XXX.golden"
// var buf bytes.Buffer
ok, err := cmpGold(buf.Bytes(), gold) // if err := xxxTmpl.Execute(&buf, spec); err != nil {
if err != nil { // t.Fatal("Execute():", err)
t.Fatalf("Reading %s: %v", gold, err) // }
}
if !ok { // if err := ioutil.WriteFile("testdata/"+gold, buf.Bytes(), 0644); err != nil {
t.Errorf("Generated VCL for BackendConfig does not match gold "+ // t.Fatal("WriteFile():", err)
"file: %s", gold) // }
if testing.Verbose() { // if testing.Verbose() {
t.Logf("Generated: %s", buf.String()) // t.Logf("Generated: %s", buf.String())
} // }
} // }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment