Explorar o código

Avoid nil panic when no progress writer in context, add noop writer. (Especially for gRPC invocations)

Signed-off-by: Guillaume Tardif <[email protected]>
Guillaume Tardif %!s(int64=5) %!d(string=hai) anos
pai
achega
7e534153f3
Modificáronse 3 ficheiros con 69 adicións e 1 borrados
  1. 34 0
      progress/noop.go
  2. 4 1
      progress/writer.go
  3. 31 0
      progress/writer_test.go

+ 34 - 0
progress/noop.go

@@ -0,0 +1,34 @@
+/*
+   Copyright 2020 Docker Compose CLI authors
+
+   Licensed 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 progress
+
+import (
+	"context"
+)
+
+type noopWriter struct {
+}
+
+func (p *noopWriter) Start(ctx context.Context) error {
+	return nil
+}
+
+func (p *noopWriter) Event(e Event) {
+}
+
+func (p *noopWriter) Stop() {
+}

+ 4 - 1
progress/writer.go

@@ -73,7 +73,10 @@ func WithContextWriter(ctx context.Context, writer Writer) context.Context {
 
 // ContextWriter returns the writer from the context
 func ContextWriter(ctx context.Context) Writer {
-	s, _ := ctx.Value(writerKey{}).(Writer)
+	s, ok := ctx.Value(writerKey{}).(Writer)
+	if !ok {
+		return &noopWriter{}
+	}
 	return s
 }
 

+ 31 - 0
progress/writer_test.go

@@ -0,0 +1,31 @@
+/*
+   Copyright 2020 Docker Compose CLI authors
+
+   Licensed 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 progress
+
+import (
+	"context"
+	"testing"
+
+	"gotest.tools/v3/assert"
+)
+
+func TestNoopWriter(t *testing.T) {
+	todo := context.TODO()
+	writer := ContextWriter(todo)
+
+	assert.Equal(t, writer, &noopWriter{})
+}