From 559017c6a389ae6f3d0f0cd83bb12e69f4a7139b Mon Sep 17 00:00:00 2001 From: Mohamed Awnallah Date: Wed, 10 Jul 2024 12:45:14 +0300 Subject: [PATCH] client/v3/watch_test.go: test fmt metadata print Signed-off-by: Mohamed Awnallah Co-authored-by: Benjamin Wang --- client/v3/watch_test.go | 59 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/client/v3/watch_test.go b/client/v3/watch_test.go index 2a56ca4a9383..a5d4c59178d7 100644 --- a/client/v3/watch_test.go +++ b/client/v3/watch_test.go @@ -15,8 +15,11 @@ package clientv3 import ( + "context" "testing" + "google.golang.org/grpc/metadata" + "go.etcd.io/etcd/api/v3/mvccpb" ) @@ -53,3 +56,59 @@ func TestEvent(t *testing.T) { } } } + +// TestStreamKeyFromCtx tests the streamKeyFromCtx function to ensure it correctly +// formats metadata as a map[string][]string when extracting metadata from the context. +// +// The fmt package in Go guarantees that maps are printed in a consistent order, +// sorted by the keys. This test verifies that the streamKeyFromCtx function +// produces the expected formatted string representation of metadata maps when called with +// various context scenarios. +func TestStreamKeyFromCtx(t *testing.T) { + tests := []struct { + name string + ctx context.Context + expected string + }{ + { + name: "multiple keys", + ctx: metadata.NewOutgoingContext(context.Background(), metadata.MD{ + "key1": []string{"value1"}, + "key2": []string{"value2a", "value2b"}, + }), + expected: "map[key1:[value1] key2:[value2a value2b]]", + }, + { + name: "no keys", + ctx: metadata.NewOutgoingContext(context.Background(), metadata.MD{}), + expected: "map[]", + }, + { + name: "only one key", + ctx: metadata.NewOutgoingContext(context.Background(), metadata.MD{ + "key1": []string{"value1", "value1a"}, + }), + expected: "map[key1:[value1 value1a]]", + }, + { + name: "no metadata", + ctx: context.Background(), + expected: "", + }, + } + + // Iterate through each test case and verify the function's output matches + // the expected result. + for _, tt := range tests { + // Capture range variable to ensure each closure gets its own copy of tt. + tt := tt + t.Run(tt.name, func(t *testing.T) { + // Run tests in parallel. + t.Parallel() + actual := streamKeyFromCtx(tt.ctx) + if actual != tt.expected { + t.Errorf("streamKeyFromCtx() = %v, expected %v", actual, tt.expected) + } + }) + } +}