blob: c68600f75e2ef3666d1b860e2150e29f177ad526 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package tools
import (
"bytes"
"context"
"errors"
"log"
"strings"
"testing"
fnpb "github.com/apache/beam/sdks/v2/go/pkg/beam/model/fnexecution_v1"
)
type logCatcher struct {
msgs []*fnpb.LogEntry_List
err error
}
func (l *logCatcher) Send(msg *fnpb.LogEntry_List) error {
l.msgs = append(l.msgs, msg)
return l.err
}
func (l *logCatcher) CloseSend() error {
return nil
}
func TestLogger(t *testing.T) {
ctx := context.Background()
t.Run("SuccessfulLogging", func(t *testing.T) {
catcher := &logCatcher{}
l := &Logger{client: catcher}
l.Printf(ctx, "foo %v", "bar")
received := catcher.msgs[0].GetLogEntries()[0]
if got, want := received.Message, "foo bar"; got != want {
t.Errorf("l.Printf(\"foo %%v\", \"bar\"): got message %q, want %q", got, want)
}
if got, want := received.Severity, fnpb.LogEntry_Severity_DEBUG; got != want {
t.Errorf("l.Printf(\"foo %%v\", \"bar\"): got severity %v, want %v", got, want)
}
})
t.Run("SuccessfulLoggingAtError", func(t *testing.T) {
catcher := &logCatcher{}
l := &Logger{client: catcher}
l.Errorf(ctx, "failed to install dependency %v", "bar")
received := catcher.msgs[0].GetLogEntries()[0]
if got, want := received.Message, "failed to install dependency bar"; got != want {
t.Errorf("l.Printf(\"foo %%v\", \"bar\"): got message %q, want %q", got, want)
}
if got, want := received.Severity, fnpb.LogEntry_Severity_ERROR; got != want {
t.Errorf("l.Errorf(\"failed to install dependency %%v\", \"bar\"): got severity %v, want %v", got, want)
}
})
t.Run("backup path", func(t *testing.T) {
catcher := &logCatcher{}
l := &Logger{client: catcher}
// Validate error outputs.
var buf bytes.Buffer
ll := log.Default()
ll.SetOutput(&buf)
catcher.err = errors.New("test error")
wantMsg := "checking for error?"
l.Printf(ctx, "%s", wantMsg)
line, err := buf.ReadString('\n')
if err != nil {
t.Errorf("unexpected error reading form backup log buffer: %v", err)
}
if got, want := line, "boot.go: error logging message over FnAPI"; !strings.Contains(got, want) {
t.Errorf("backup log buffer didn't contain expected log, got %q, want it to contain %q", got, want)
}
if got, want := line, "test error"; !strings.Contains(got, want) {
t.Errorf("backup log buffer didn't contain expected log, got %q, want it to contain %q", got, want)
}
line, err = buf.ReadString('\n')
if err != nil {
t.Errorf("unexpected error reading form backup log buffer: %v", err)
}
if got, want := line, wantMsg; !strings.Contains(got, want) {
t.Errorf("backup log buffer didn't contain the message, got %q, want it to contain %q", got, want)
}
})
t.Run("no endpoint", func(t *testing.T) {
l := &Logger{}
var buf bytes.Buffer
ll := log.Default()
ll.SetOutput(&buf)
l.Printf(ctx, "trying to log")
line, err := buf.ReadString('\n')
if err != nil {
t.Errorf("unexpected error reading form backup log buffer: %v", err)
}
if got, want := line, "no logging endpoint set"; !strings.Contains(got, want) {
t.Errorf("backup log buffer didn't contain expected error, got %q, want it to contain %q", got, want)
}
})
}