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
require (
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/golang/groupcache v0.0.0-20181024230925-c65c006176ff // indirect
github.com/google/go-cmp v0.3.0
......@@ -9,10 +11,10 @@ require (
github.com/haproxytech/models v1.2.4
github.com/imdario/mergo v0.3.6 // indirect
github.com/prometheus/client_golang v0.9.2
github.com/sergi/go-diff v1.1.0 // indirect
github.com/sirupsen/logrus v1.2.0
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/api v0.16.4
k8s.io/apimachinery 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 @@
package vcl
import (
"bytes"
"testing"
)
import "testing"
var extWhiskeySvc = Service{
Name: "whiskey-svc",
......@@ -83,22 +80,7 @@ var barSpec = Spec{
}
func TestExternalNameSvc(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, ingressTmpl, barSpec, "extname.golden")
}
var extTequilaSvc = Service{
......@@ -173,20 +155,5 @@ var boozeSpec = Spec{
}
func TestExternalNameBcfg(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, ingressTmpl, boozeSpec, "extname_bcfg.golden")
}
......@@ -28,12 +28,7 @@
package vcl
import (
"bytes"
_ "io/ioutil"
_ "path/filepath"
"testing"
)
import "testing"
var cafeNoHostSpec = Spec{
Rules: []Rule{
......@@ -57,22 +52,8 @@ var cafeNoHostSpec = Spec{
}
func TestIngressFanoutNoHost(t *testing.T) {
var buf bytes.Buffer
gold := "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())
}
}
templateTest(t, ingressTmpl, cafeNoHostSpec,
"ingress_fanout_nohost.golden")
}
var h2oSvc = Service{
......@@ -121,22 +102,8 @@ var cafeVhostNoHostSpec = Spec{
}
func TestIngressVhostNoHost(t *testing.T) {
var buf bytes.Buffer
gold := "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())
}
}
templateTest(t, ingressTmpl, cafeVhostNoHostSpec,
"ingress_vhost_nohost.golden")
}
var singleSvcSpec = Spec{
......@@ -145,22 +112,7 @@ var singleSvcSpec = Spec{
}
func TestIngressSingleSvc(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, ingressTmpl, singleSvcSpec, "ingress_single_svc.golden")
}
var defaultSvcProbeDir = Spec{
......@@ -169,22 +121,8 @@ var defaultSvcProbeDir = Spec{
}
func TestIngressDefaultProbeDir(t *testing.T) {
var buf bytes.Buffer
gold := "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())
}
}
templateTest(t, ingressTmpl, defaultSvcProbeDir,
"ingress_default_probe_dir.golden")
}
var barDefaultProbeDir = Spec{
......@@ -195,20 +133,6 @@ var barDefaultProbeDir = Spec{
}
func TestIngressDefaultRules(t *testing.T) {
var buf bytes.Buffer
gold := "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())
}
}
templateTest(t, ingressTmpl, barDefaultProbeDir,
"ingress_default_rules.golden")
}
......@@ -133,7 +133,7 @@ var builtinRecvSpec = Spec{
func TestReqDispBuiltinRecv(t *testing.T) {
gold := "recv_disp_builtin.golden"
testTemplate(t, reqDispTmpl, builtinRecvSpec, gold)
templateTest(t, reqDispTmpl, builtinRecvSpec, gold)
}
var pipeOnConnectSpec = Spec{
......@@ -151,7 +151,7 @@ var pipeOnConnectSpec = Spec{
func TestReqDispPipeOnConnect(t *testing.T) {
gold := "recv_disp_pipe_on_connect.golden"
testTemplate(t, reqDispTmpl, pipeOnConnectSpec, gold)
templateTest(t, reqDispTmpl, pipeOnConnectSpec, gold)
}
var methodNotAllowedSpec = Spec{
......@@ -182,7 +182,7 @@ var methodNotAllowedSpec = Spec{
func TestReqDispMethodNotAllowed(t *testing.T) {
gold := "recv_disp_method_not_allowed.golden"
testTemplate(t, reqDispTmpl, methodNotAllowedSpec, gold)
templateTest(t, reqDispTmpl, methodNotAllowedSpec, gold)
}
var urlWhitelistSpec = Spec{
......@@ -211,7 +211,7 @@ var urlWhitelistSpec = Spec{
func TestReqDispURLWhitelist(t *testing.T) {
gold := "recv_disp_url_whitelist.golden"
testTemplate(t, reqDispTmpl, urlWhitelistSpec, gold)
templateTest(t, reqDispTmpl, urlWhitelistSpec, gold)
}
var purgeMethodSpec = Spec{
......@@ -229,7 +229,7 @@ var purgeMethodSpec = Spec{
func TestReqDispPurgeMethod(t *testing.T) {
gold := "recv_disp_purge_method.golden"
testTemplate(t, reqDispTmpl, purgeMethodSpec, gold)
templateTest(t, reqDispTmpl, purgeMethodSpec, gold)
}
var cacheableSpec = Spec{
......@@ -255,7 +255,7 @@ var cacheableSpec = Spec{
func TestReqDispCacheable(t *testing.T) {
gold := "recv_disp_cacheable.golden"
testTemplate(t, reqDispTmpl, cacheableSpec, gold)
templateTest(t, reqDispTmpl, cacheableSpec, gold)
}
var nonCacheableSpec = Spec{
......@@ -281,23 +281,5 @@ var nonCacheableSpec = Spec{
func TestReqDispNonCacheable(t *testing.T) {
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 (
"bytes"
"io/ioutil"
"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{
Rewrites: []Rewrite{{
Rules: []RewriteRule{{
......@@ -69,7 +49,7 @@ var replaceFromStringTest = Spec{
func TestReplaceFromString(t *testing.T) {
gold := "rewrite_replace_from_string.golden"
testTemplate(t, rewriteTmpl, replaceFromStringTest, gold)
templateTest(t, rewriteTmpl, replaceFromStringTest, gold)
}
var replaceFromSourceTest = Spec{
......@@ -85,7 +65,7 @@ var replaceFromSourceTest = Spec{
func TestReplaceFromSource(t *testing.T) {
gold := "rewrite_replace_from_source.golden"
testTemplate(t, rewriteTmpl, replaceFromSourceTest, gold)
templateTest(t, rewriteTmpl, replaceFromSourceTest, gold)
}
var replaceFromRewriteTest = Spec{
......@@ -112,7 +92,7 @@ var replaceFromRewriteTest = Spec{
func TestReplaceFromRewrite(t *testing.T) {
gold := "rewrite_replace_from_rewrite.golden"
testTemplate(t, rewriteTmpl, replaceFromRewriteTest, gold)
templateTest(t, rewriteTmpl, replaceFromRewriteTest, gold)
}
var rewriteSubTest = Spec{
......@@ -140,7 +120,7 @@ var rewriteSubTest = Spec{
func TestRewriteSub(t *testing.T) {
gold := "rewrite_sub.golden"
testTemplate(t, rewriteTmpl, rewriteSubTest, gold)
templateTest(t, rewriteTmpl, rewriteSubTest, gold)
}
var rewriteAppendTest = Spec{
......@@ -159,7 +139,7 @@ var rewriteAppendTest = Spec{
func TestRewriteAppend(t *testing.T) {
gold := "rewrite_append.golden"
testTemplate(t, rewriteTmpl, rewriteAppendTest, gold)
templateTest(t, rewriteTmpl, rewriteAppendTest, gold)
}
var rewritePrependTest = Spec{
......@@ -178,7 +158,7 @@ var rewritePrependTest = Spec{
func TestRewritePrepend(t *testing.T) {
gold := "rewrite_prepend.golden"
testTemplate(t, rewriteTmpl, rewritePrependTest, gold)
templateTest(t, rewriteTmpl, rewritePrependTest, gold)
}
var rewriteDeleteTest = Spec{
......@@ -194,7 +174,7 @@ var rewriteDeleteTest = Spec{
func TestRewriteDelete(t *testing.T) {
gold := "rewrite_delete.golden"
testTemplate(t, rewriteTmpl, rewriteDeleteTest, gold)
templateTest(t, rewriteTmpl, rewriteDeleteTest, gold)
}
var conditionalDeleteTest = Spec{
......@@ -217,7 +197,7 @@ var conditionalDeleteTest = Spec{
func TestConditionalDelete(t *testing.T) {
gold := "rewrite_conditional_delete.golden"
testTemplate(t, rewriteTmpl, conditionalDeleteTest, gold)
templateTest(t, rewriteTmpl, conditionalDeleteTest, gold)
}
var rewriteExtractTest = Spec{
......@@ -239,7 +219,7 @@ var rewriteExtractTest = Spec{
func TestRewriteExtract(t *testing.T) {
gold := "rewrite_extract.golden"
testTemplate(t, rewriteTmpl, rewriteExtractTest, gold)
templateTest(t, rewriteTmpl, rewriteExtractTest, gold)
}
var rewriteFixedPrefixTest = Spec{
......@@ -266,7 +246,7 @@ var rewriteFixedPrefixTest = Spec{
func TestRewriteFixedPrefix(t *testing.T) {
gold := "rewrite_fixed_prefix.golden"
testTemplate(t, rewriteTmpl, rewriteFixedPrefixTest, gold)
templateTest(t, rewriteTmpl, rewriteFixedPrefixTest, gold)
}
var rewriteFixedEqualTest = Spec{
......@@ -293,7 +273,7 @@ var rewriteFixedEqualTest = Spec{
func TestRewriteFixedEqual(t *testing.T) {
gold := "rewrite_fixed_equal.golden"
testTemplate(t, rewriteTmpl, rewriteFixedEqualTest, gold)
templateTest(t, rewriteTmpl, rewriteFixedEqualTest, gold)
}
var rewriteFixedSuballTest = Spec{
......@@ -320,7 +300,7 @@ var rewriteFixedSuballTest = Spec{
func TestRewriteFixedSuball(t *testing.T) {
gold := "rewrite_fixed_suball.golden"
testTemplate(t, rewriteTmpl, rewriteFixedSuballTest, gold)
templateTest(t, rewriteTmpl, rewriteFixedSuballTest, gold)
}
var rewritePrefixRegex = Spec{
......@@ -349,7 +329,7 @@ var rewritePrefixRegex = Spec{
func TestRewritePrefixRegex(t *testing.T) {
gold := "rewrite_prefix_regex.golden"
testTemplate(t, rewriteTmpl, rewritePrefixRegex, gold)
templateTest(t, rewriteTmpl, rewritePrefixRegex, gold)
}
var rewritePrependIfExists = Spec{
......@@ -372,7 +352,7 @@ var rewritePrependIfExists = Spec{
func TestRewritePrependIfExists(t *testing.T) {
gold := "rewrite_prepend_if_exists.golden"
testTemplate(t, rewriteTmpl, rewritePrependIfExists, gold)
templateTest(t, rewriteTmpl, rewritePrependIfExists, gold)
}
var rewriteExtractCookie = Spec{
......@@ -393,7 +373,7 @@ var rewriteExtractCookie = Spec{
func TestExtractCookie(t *testing.T) {
gold := "rewrite_extract_cookie.golden"
testTemplate(t, rewriteTmpl, rewriteExtractCookie, gold)
templateTest(t, rewriteTmpl, rewriteExtractCookie, gold)
}
var rewriteXCacheHdr = Spec{
......@@ -444,7 +424,7 @@ var rewriteXCacheHdr = Spec{
func TestXCacheHdr(t *testing.T) {
gold := "rewrite_x_cache_hdr.golden"
testTemplate(t, rewriteTmpl, rewriteXCacheHdr, gold)
templateTest(t, rewriteTmpl, rewriteXCacheHdr, gold)
}
var rewriteAppendFromSrcTest = Spec{
......@@ -457,7 +437,7 @@ var rewriteAppendFromSrcTest = Spec{
func TestRewriteAppendFromSrcTest(t *testing.T) {
gold := "rewrite_append_from_src.golden"
testTemplate(t, rewriteTmpl, rewriteAppendFromSrcTest, gold)
templateTest(t, rewriteTmpl, rewriteAppendFromSrcTest, gold)
}
var rewriteAppendRule = Spec{
......@@ -478,7 +458,7 @@ var rewriteAppendRule = Spec{
func TestRewriteAppendRule(t *testing.T) {
gold := "rewrite_append_rule.golden"
testTemplate(t, rewriteTmpl, rewriteAppendRule, gold)
templateTest(t, rewriteTmpl, rewriteAppendRule, gold)
}
var rewritePrependHdr = Spec{
......@@ -494,7 +474,7 @@ var rewritePrependHdr = Spec{
func TestRewritePrependHdr(t *testing.T) {
gold := "rewrite_prepend_hdr.golden"
testTemplate(t, rewriteTmpl, rewritePrependHdr, gold)
templateTest(t, rewriteTmpl, rewritePrependHdr, gold)
}
var rewriteSelectFirst = Spec{
......@@ -529,7 +509,7 @@ var rewriteSelectFirst = Spec{
func TestRewriteSelectFirst(t *testing.T) {
gold := "rewrite_select_first.golden"
testTemplate(t, rewriteTmpl, rewriteSelectFirst, gold)
templateTest(t, rewriteTmpl, rewriteSelectFirst, gold)
}
var rewriteSelectPermutations = Spec{
......@@ -617,7 +597,7 @@ var rewriteSelectPermutations = Spec{
func TestRewriteSelectPermutations(t *testing.T) {
gold := "rewrite_select_permute.golden"
testTemplate(t, rewriteTmpl, rewriteSelectPermutations, gold)
templateTest(t, rewriteTmpl, rewriteSelectPermutations, gold)
}
var rewriteSelectOperations = Spec{
......@@ -697,7 +677,7 @@ var rewriteSelectOperations = Spec{
func TestRewriteSelectOperations(t *testing.T) {
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
......@@ -737,21 +717,3 @@ func TestRewriteDeleteAuth(t *testing.T) {
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{
}
func TestShardTemplate(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, shardTmpl, varnishCluster, "shard.golden")
}
func TestPrimaryOnlyShardTemplate(t *testing.T) {
var buf bytes.Buffer
gold := "primaryonly_shard.golden"
varnishCluster.PrimaryOnly = true
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 primary-only self-sharding does "+
"not match gold file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
templateTest(t, shardTmpl, varnishCluster, "primaryonly_shard.golden")
}
func TestGetSrc(t *testing.T) {
......@@ -128,82 +94,35 @@ func TestGetSrc(t *testing.T) {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL from GetSrc() does not match gold "+
"file: %s", gold)
t.Errorf("Generated VCL does not match gold file: %s", gold)
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) {
var buf bytes.Buffer
gold := "shard_by_url.golden"
varnishCluster.PrimaryOnly = true
varnishCluster.By = URL
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())
}
}
templateTest(t, shardTmpl, varnishCluster, "shard_by_url.golden")
}
func TestShardByKey(t *testing.T) {
var buf bytes.Buffer
gold := "shard_by_key.golden"
varnishCluster.PrimaryOnly = true
varnishCluster.By = Key
varnishCluster.Key = "req.http.Host"
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())
}
}
templateTest(t, shardTmpl, varnishCluster, "shard_by_key.golden")
}
func TestShardByDigest(t *testing.T) {
var buf bytes.Buffer
gold := "shard_by_digest.golden"
varnishCluster.PrimaryOnly = true
varnishCluster.By = Blob
varnishCluster.Key = "req.http.Host"
varnishCluster.Algo = Sha3_512
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())
}
}
templateTest(t, shardTmpl, varnishCluster, "shard_by_digest.golden")
}
......@@ -33,17 +33,59 @@ import (
"io/ioutil"
"path/filepath"
"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)
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 {
return false, err
}
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{
Name: "tea-svc",
Addresses: []Address{
......@@ -102,22 +144,7 @@ var cafeSpec = Spec{
}
func TestIngressTemplate(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, ingressTmpl, cafeSpec, "ingressrule.golden")
}
var auths = Spec{
......@@ -191,24 +218,7 @@ var auths = Spec{
}
func TestAuthTemplate(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, authTmpl, auths, "auth.golden")
}
var acls = Spec{
......@@ -356,24 +366,7 @@ var acls = Spec{
}
func TestAclTemplate(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, aclTmpl, acls, "acl.golden")
}
var aclResultHdr = Spec{
......@@ -408,23 +401,7 @@ var aclResultHdr = Spec{
}
func TestAclResultHeader(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, aclTmpl, aclResultHdr, "acl_result_hdr.golden")
}
var aclNoFail = Spec{
......@@ -459,23 +436,7 @@ var aclNoFail = Spec{
}
func TestAclNoFail(t *testing.T) {
var buf bytes.Buffer
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())
}
}
templateTest(t, aclTmpl, aclNoFail, "acl_no_fail.golden")
}
var customVCLSpec = Spec{
......@@ -509,10 +470,14 @@ func TestCustomVCL(t *testing.T) {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for custom VCL does not match gold "+
"file: %s", gold)
t.Errorf("Generated VCL does not match gold file: %s", gold)
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{
}
func TestBackendConfig(t *testing.T) {
var buf bytes.Buffer
gold := "backendcfg.golden"
templateTest(t, ingressTmpl, cafeProbeDir, "backendcfg.golden")
}
if err := ingressTmpl.Execute(&buf, cafeProbeDir); err != nil {
t.Fatal("Execute():", err)
}
// Code boilerplate for writing the golden file.
// import ioutils
// func TestXXX(t *testing.T) {
// gold := "XXX.golden"
// var buf bytes.Buffer
ok, err := cmpGold(buf.Bytes(), gold)
if err != nil {
t.Fatalf("Reading %s: %v", gold, err)
}
if !ok {
t.Errorf("Generated VCL for BackendConfig does not match gold "+
"file: %s", gold)
if testing.Verbose() {
t.Logf("Generated: %s", buf.String())
}
}
}
// if err := xxxTmpl.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())
// }
// }
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