in pkg/targettesting/targettest.go [180:267]
func (tc *ReviewTestcase) run(t *testing.T) {
// matching_constraints needs differing constraints for the match blocks,
// to get test coverage, this gets exercised on calls to client.Review
ctx := context.Background()
var logOutput bytes.Buffer
log.SetOutput(&logOutput)
defer func() {
log.SetOutput(os.Stderr)
}()
// create client
cfClient := createClient(t, tc.newTargetHandler)
// add template
resp, err := cfClient.AddTemplate(ctx, tc.constraintTemplate)
if err != nil {
t.Fatalf("loading template %v: %v", tc.constraintTemplate, err)
}
if !resp.Handled[tc.targetName] {
t.Fatal("expected target name")
}
// Create synthetic constraint
constraintSpec := map[string]interface{}{
"parameters": map[string]interface{}{
"fail": true,
"msg": "it matched",
},
}
if tc.Match != nil {
constraintSpec["match"] = tc.Match
}
constraint := map[string]interface{}{
"apiVersion": "constraints.gatekeeper.sh/v1beta1",
"kind": testConstraintKind,
"metadata": map[string]interface{}{
"name": strings.ToLower(testConstraintKind),
},
"spec": constraintSpec,
}
resp, err = cfClient.AddConstraint(ctx, &unstructured.Unstructured{Object: constraint})
if tc.WantConstraintError {
if err == nil {
t.Fatal("expected constraint add error, got none")
}
return
}
if err != nil {
t.Fatal(err)
}
if !resp.Handled[tc.targetName] {
t.Fatal("expected target name")
}
// create review from tc, input needs to be GCP hierarchy path
reviewObj := tc.Object(t)
resp, err = cfClient.Review(ctx, reviewObj, drivers.Tracing(true))
if err != nil {
t.Fatal(err)
}
review, ok := resp.ByTarget[tc.targetName]
if !ok {
t.Fatal("expected target name in reviews")
}
if tc.WantMatch {
if len(review.Results) != 1 {
unitTestTraceDump(t, review)
t.Logf("match block: %v", tc.Match)
t.Fatalf("expected exactly one results in review, got %d", len(review.Results))
}
} else {
if len(review.Results) != 0 {
unitTestTraceDump(t, review)
t.Logf("match block: %v", tc.Match)
t.Fatalf("unexpected results in review")
}
}
if tc.WantLogged != nil {
if !tc.WantLogged.Match(logOutput.Bytes()) {
t.Fatalf("expected log output to match %s; got %s", tc.WantLogged.String(), logOutput.String())
}
}
}