Skip to content

Commit cd2cf48

Browse files
GODRIVER-1210 Add String for readpref.Mode and readpref.Readpref (#382)
1 parent 1ecf305 commit cd2cf48

File tree

6 files changed

+140
-0
lines changed

6 files changed

+140
-0
lines changed

mongo/readpref/mode.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,21 @@ func ModeFromString(mode string) (Mode, error) {
5454
}
5555
return Mode(0), fmt.Errorf("unknown read preference %v", mode)
5656
}
57+
58+
// String returns the string representation of mode.
59+
func (mode Mode) String() string {
60+
switch mode {
61+
case PrimaryMode:
62+
return "primary"
63+
case PrimaryPreferredMode:
64+
return "primaryPreferred"
65+
case SecondaryMode:
66+
return "secondary"
67+
case SecondaryPreferredMode:
68+
return "secondaryPreferred"
69+
case NearestMode:
70+
return "nearest"
71+
default:
72+
return "unknown"
73+
}
74+
}

mongo/readpref/mode_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (C) MongoDB, Inc. 2020-present.
2+
3+
// Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
// not use this file except in compliance with the License. You may obtain
5+
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6+
7+
package readpref
8+
9+
import (
10+
"testing"
11+
12+
"go.mongodb.org/mongo-driver/internal/testutil/assert"
13+
)
14+
15+
func TestMode_String(t *testing.T) {
16+
t.Parallel()
17+
18+
testCases := []struct {
19+
name string
20+
mode Mode
21+
}{
22+
{"primary", PrimaryMode},
23+
{"primaryPreferred", PrimaryPreferredMode},
24+
{"secondary", SecondaryMode},
25+
{"secondaryPreferred", SecondaryPreferredMode},
26+
{"nearest", NearestMode},
27+
{"unknown", Mode(42)},
28+
}
29+
30+
for _, tc := range testCases {
31+
t.Run(tc.name, func(t *testing.T) {
32+
assert.Equal(t, tc.name, tc.mode.String(), "expected %q, got %q", tc.name, tc.mode.String())
33+
})
34+
}
35+
}

mongo/readpref/readpref.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
package readpref // import "go.mongodb.org/mongo-driver/mongo/readpref"
88

99
import (
10+
"bytes"
1011
"errors"
12+
"fmt"
1113
"time"
1214

1315
"go.mongodb.org/mongo-driver/tag"
@@ -104,3 +106,26 @@ func (r *ReadPref) TagSets() []tag.Set {
104106
func (r *ReadPref) HedgeEnabled() *bool {
105107
return r.hedgeEnabled
106108
}
109+
110+
// String returns a human-readable description of the read preference.
111+
func (r *ReadPref) String() string {
112+
var b bytes.Buffer
113+
b.WriteString(r.mode.String())
114+
delim := "("
115+
if r.maxStalenessSet {
116+
fmt.Fprintf(&b, "%smaxStaleness=%v", delim, r.maxStaleness)
117+
delim = " "
118+
}
119+
for _, tagSet := range r.tagSets {
120+
fmt.Fprintf(&b, "%stagSet=%s", delim, tagSet.String())
121+
delim = " "
122+
}
123+
if r.hedgeEnabled != nil {
124+
fmt.Fprintf(&b, "%shedgeEnabled=%v", delim, *r.hedgeEnabled)
125+
delim = " "
126+
}
127+
if delim != "(" {
128+
b.WriteString(")")
129+
}
130+
return b.String()
131+
}

mongo/readpref/readpref_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,25 @@ func TestHedge(t *testing.T) {
134134
assert.True(t, *enabled, "expected HedgeEnabled to return true, got false")
135135
})
136136
}
137+
138+
func TestReadPref_String(t *testing.T) {
139+
t.Run("ReadPref.String() with all options", func(t *testing.T) {
140+
readPref := Nearest(
141+
WithMaxStaleness(120*time.Second),
142+
WithTagSets(tag.Set{{"a", "1"}, {"b", "2"}}, tag.Set{{"q", "5"}, {"r", "6"}}),
143+
WithHedgeEnabled(true),
144+
)
145+
expected := "nearest(maxStaleness=2m0s tagSet=a=1,b=2 tagSet=q=5,r=6 hedgeEnabled=true)"
146+
assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
147+
})
148+
t.Run("ReadPref.String() with one option", func(t *testing.T) {
149+
readPref := Secondary(WithTags("a", "1", "b", "2"))
150+
expected := "secondary(tagSet=a=1,b=2)"
151+
assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
152+
})
153+
t.Run("ReadPref.String() with no options", func(t *testing.T) {
154+
readPref := Primary()
155+
expected := "primary"
156+
assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
157+
})
158+
}

tag/tag.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,22 @@
66

77
package tag // import "go.mongodb.org/mongo-driver/tag"
88

9+
import (
10+
"bytes"
11+
"fmt"
12+
)
13+
914
// Tag is a name/vlaue pair.
1015
type Tag struct {
1116
Name string
1217
Value string
1318
}
1419

20+
// String returns a human-readable human-readable description of the tag.
21+
func (tag Tag) String() string {
22+
return fmt.Sprintf("%s=%s", tag.Name, tag.Value)
23+
}
24+
1525
// NewTagSetFromMap creates a new tag set from a map.
1626
func NewTagSetFromMap(m map[string]string) Set {
1727
var set Set
@@ -55,3 +65,15 @@ func (ts Set) ContainsAll(other []Tag) bool {
5565

5666
return true
5767
}
68+
69+
// String returns a human-readable human-readable description of the tagset.
70+
func (ts Set) String() string {
71+
var b bytes.Buffer
72+
for i, tag := range ts {
73+
if i > 0 {
74+
b.WriteString(",")
75+
}
76+
b.WriteString(tag.String())
77+
}
78+
return b.String()
79+
}

tag/tag_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ import (
1010
"testing"
1111

1212
"github.com/stretchr/testify/require"
13+
"go.mongodb.org/mongo-driver/internal/testutil/assert"
1314
)
1415

16+
func TestTag_String(t *testing.T) {
17+
t.Parallel()
18+
19+
tag := Tag{Name: "a", Value: "1"}
20+
assert.Equal(t, "a=1", tag.String(), `expected "a=1", got %q`, tag.String())
21+
}
22+
1523
func TestTagSets_NewTagSet(t *testing.T) {
1624
t.Parallel()
1725

@@ -76,3 +84,13 @@ func TestTagSets_ContainsAll(t *testing.T) {
7684
test = Set{Tag{Name: "a", Value: "2"}, Tag{Name: "b", Value: "2"}}
7785
require.False(t, ts.ContainsAll(test))
7886
}
87+
88+
func TestTagSets_String(t *testing.T) {
89+
t.Parallel()
90+
91+
ts := Set{
92+
Tag{Name: "a", Value: "1"},
93+
Tag{Name: "b", Value: "2"},
94+
}
95+
assert.Equal(t, "a=1,b=2", ts.String(), `expected "a=1,b=2", got %q`, ts.String())
96+
}

0 commit comments

Comments
 (0)