in lib/auditlogsapi/itest/main.go [124:229]
func TestAuditLog(ctx context.Context, s *auditlogsapi.AuditLogs, c lgrpcpb.LoggingServiceV2Client, logger *logging.Client, projectName string, userID string) {
glog.Infof("## TestAuditLog started. ##")
defer glog.Infof("## TestAuditLog finished. ##\n\n")
// Generate random user id if no user is specified.
randomUser := false
if userID == "" {
userID = "fake-user-id-" + uuid.New()
randomUser = true
}
// Write an access and a policy log.
al := &auditlog.RequestLog{
TokenID: "fake-token-id",
TokenSubject: userID,
TokenIssuer: "fake-issuer-id",
TracingID: "fake-tracing-id",
RequestMethod: "fake-method",
RequestEndpoint: "fake-endpoint",
RequestPath: "fake-path",
RequestIP: "fake-requester-ip",
ErrorType: "fake-error-type",
ResponseCode: 1234,
Request: httputils.MustNewReq(http.MethodGet, "http://fake.org/fake-path", nil),
PassAuthCheck: true,
Payload: "fake-reason",
}
auditlog.WriteRequestLog(ctx, logger, al)
pl := &auditlog.PolicyDecisionLog{
TokenID: "fake-token-id",
TokenSubject: userID,
TokenIssuer: "fake-issuer-id",
Resource: "fake-resource",
TTL: time.Hour.String(),
PassAuthCheck: true,
ErrorType: "fake-error-type",
Message: "fake-reason",
}
auditlog.WritePolicyDecisionLog(logger, pl)
// It takes a while before written logs are visible on Stackdriver.
var got *apb.ListAuditLogsResponse
end := time.Now().Add(time.Minute)
for len(got.GetAuditLogs()) < 2 && time.Now().Before(end) {
var err error
got, err = s.ListAuditLogs(ctx, &apb.ListAuditLogsRequest{UserId: userID})
if err != nil {
glog.Errorf("ListAuditLogs() failed: %v", err)
return
}
time.Sleep(time.Second)
}
for _, l := range got.GetAuditLogs() {
glog.Infof("AuditLog: %v\n\n", l)
}
if !randomUser {
return
}
// If it was a randomly generated user, we can check if the logs are correct.
got.AuditLogs[0].Name = ""
got.AuditLogs[0].Time = nil
got.AuditLogs[1].Name = ""
got.AuditLogs[1].Time = nil
want := &apb.ListAuditLogsResponse{
AuditLogs: []*apb.AuditLog{
{
Name: "",
ServiceName: "unset-serviceinfo-Name",
ServiceType: "unset-serviceinfo-Type",
TokenId: "fake-token-id",
TokenSubject: userID,
TokenIssuer: "fake-issuer-id",
Decision: apb.Decision_PASS,
ErrorType: "fake-error-type",
Reason: "fake-reason",
MethodName: http.MethodGet,
ResourceName: "fake-endpoint",
TracingId: "fake-tracing-id",
CallerIp: "fake-requester-ip",
HttpResponseCode: 1234,
HttpRequest: nil,
},
{
Name: "",
ServiceName: "unset-serviceinfo-Name",
ServiceType: "unset-serviceinfo-Type",
TokenId: "fake-token-id",
TokenSubject: userID,
TokenIssuer: "fake-issuer-id",
Decision: apb.Decision_PASS,
ErrorType: "fake-error-type",
Reason: "fake-reason",
ResourceName: "fake-resource",
Ttl: &dpb.Duration{Seconds: int64(time.Hour / time.Second)},
},
},
}
if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" {
glog.Errorf("ListAuditLogs() returned diff (-want +got):\n%s", diff)
}
}