4fd7fad2e5
Updates #2280.
Squashed commit of the following:
commit d8c6aacb664361a13dde8522de2470dd137bed00
Merge: 84df492b 12f1e4ed
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 15 17:21:41 2021 +0300
Merge branch 'master' into 2280-dns-timeout
commit 84df492b0134e88e031f586333437f503b90b7ae
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 15 16:49:41 2021 +0300
home: fix docs & naming
commit af44a86a60ea815ca7100edc34db8acbdcc2cccf
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 15 15:55:12 2021 +0300
all: imp docs & tests
commit 6ed6599fa0024cc7d14dc7c75ddda62e5179fe00
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 15 15:26:22 2021 +0300
home: imp duration tests
commit 8fe7cb099dccfce3f9329d7207ef48f488f07e83
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Tue Jun 15 15:04:16 2021 +0300
all: imp code, docs & tests
commit a989e8a5a6acede0063141cdbfc103b150b33d97
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Sat Jun 12 19:02:23 2021 +0300
WIP
commit b0362e22040a1d38f81dcc775c5ef6f7d1e94eee
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Sat Jun 12 18:58:09 2021 +0300
all: imp docs & tests
commit 64b00fd0854f3ddcb0189f3c93f3ffa2a31a98be
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Sat Jun 12 03:44:29 2021 +0300
home: introduce marshalable duration
commit bfb1a5706c37fcd27bccce4a5aec37dca3cf238b
Author: Eugene Burkov <e.burkov@adguard.com>
Date: Sat Jun 12 01:56:10 2021 +0300
all: add upstream timeout setting
194 lines
4.3 KiB
Go
194 lines
4.3 KiB
Go
package home
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
yaml "gopkg.in/yaml.v2"
|
|
)
|
|
|
|
// durationEncodingTester is a helper struct to simplify testing different
|
|
// Duration marshalling and unmarshalling cases.
|
|
type durationEncodingTester struct {
|
|
PtrMap map[string]*Duration `json:"ptr_map" yaml:"ptr_map"`
|
|
PtrSlice []*Duration `json:"ptr_slice" yaml:"ptr_slice"`
|
|
PtrValue *Duration `json:"ptr_value" yaml:"ptr_value"`
|
|
PtrArray [1]*Duration `json:"ptr_array" yaml:"ptr_array"`
|
|
Map map[string]Duration `json:"map" yaml:"map"`
|
|
Slice []Duration `json:"slice" yaml:"slice"`
|
|
Value Duration `json:"value" yaml:"value"`
|
|
Array [1]Duration `json:"array" yaml:"array"`
|
|
}
|
|
|
|
const nl = "\n"
|
|
const (
|
|
jsonStr = `{` +
|
|
`"ptr_map":{"dur":"1ms"},` +
|
|
`"ptr_slice":["1ms"],` +
|
|
`"ptr_value":"1ms",` +
|
|
`"ptr_array":["1ms"],` +
|
|
`"map":{"dur":"1ms"},` +
|
|
`"slice":["1ms"],` +
|
|
`"value":"1ms",` +
|
|
`"array":["1ms"]` +
|
|
`}`
|
|
yamlStr = `ptr_map:` + nl +
|
|
` dur: 1ms` + nl +
|
|
`ptr_slice:` + nl +
|
|
`- 1ms` + nl +
|
|
`ptr_value: 1ms` + nl +
|
|
`ptr_array:` + nl +
|
|
`- 1ms` + nl +
|
|
`map:` + nl +
|
|
` dur: 1ms` + nl +
|
|
`slice:` + nl +
|
|
`- 1ms` + nl +
|
|
`value: 1ms` + nl +
|
|
`array:` + nl +
|
|
`- 1ms`
|
|
)
|
|
|
|
// defaultTestDur is the default time.Duration value to be used throughout the tests of
|
|
// Duration.
|
|
const defaultTestDur = time.Millisecond
|
|
|
|
// checkFields verifies m's fields. It expects the m to be unmarshalled from
|
|
// one of the constant strings above.
|
|
func (m *durationEncodingTester) checkFields(t *testing.T, d Duration) {
|
|
t.Run("pointers_map", func(t *testing.T) {
|
|
require.NotNil(t, m.PtrMap)
|
|
|
|
fromPtrMap, ok := m.PtrMap["dur"]
|
|
require.True(t, ok)
|
|
require.NotNil(t, fromPtrMap)
|
|
|
|
assert.Equal(t, d, *fromPtrMap)
|
|
})
|
|
|
|
t.Run("pointers_slice", func(t *testing.T) {
|
|
require.Len(t, m.PtrSlice, 1)
|
|
|
|
fromPtrSlice := m.PtrSlice[0]
|
|
require.NotNil(t, fromPtrSlice)
|
|
|
|
assert.Equal(t, d, *fromPtrSlice)
|
|
})
|
|
|
|
t.Run("pointers_array", func(t *testing.T) {
|
|
fromPtrArray := m.PtrArray[0]
|
|
require.NotNil(t, fromPtrArray)
|
|
|
|
assert.Equal(t, d, *fromPtrArray)
|
|
})
|
|
|
|
t.Run("pointer_value", func(t *testing.T) {
|
|
require.NotNil(t, m.PtrValue)
|
|
|
|
assert.Equal(t, d, *m.PtrValue)
|
|
})
|
|
|
|
t.Run("map", func(t *testing.T) {
|
|
fromMap, ok := m.Map["dur"]
|
|
require.True(t, ok)
|
|
|
|
assert.Equal(t, d, fromMap)
|
|
})
|
|
|
|
t.Run("slice", func(t *testing.T) {
|
|
require.Len(t, m.Slice, 1)
|
|
|
|
assert.Equal(t, d, m.Slice[0])
|
|
})
|
|
|
|
t.Run("array", func(t *testing.T) {
|
|
assert.Equal(t, d, m.Array[0])
|
|
})
|
|
|
|
t.Run("value", func(t *testing.T) {
|
|
assert.Equal(t, d, m.Value)
|
|
})
|
|
}
|
|
|
|
func TestDuration_MarshalText(t *testing.T) {
|
|
d := Duration{defaultTestDur}
|
|
dPtr := &d
|
|
|
|
v := durationEncodingTester{
|
|
PtrMap: map[string]*Duration{"dur": dPtr},
|
|
PtrSlice: []*Duration{dPtr},
|
|
PtrValue: dPtr,
|
|
PtrArray: [1]*Duration{dPtr},
|
|
Map: map[string]Duration{"dur": d},
|
|
Slice: []Duration{d},
|
|
Value: d,
|
|
Array: [1]Duration{d},
|
|
}
|
|
|
|
b := &bytes.Buffer{}
|
|
t.Run("json", func(t *testing.T) {
|
|
t.Cleanup(b.Reset)
|
|
err := json.NewEncoder(b).Encode(v)
|
|
require.NoError(t, err)
|
|
|
|
assert.JSONEq(t, jsonStr, b.String())
|
|
})
|
|
|
|
t.Run("yaml", func(t *testing.T) {
|
|
t.Cleanup(b.Reset)
|
|
err := yaml.NewEncoder(b).Encode(v)
|
|
require.NoError(t, err)
|
|
|
|
assert.YAMLEq(t, yamlStr, b.String(), b.String())
|
|
})
|
|
|
|
t.Run("direct", func(t *testing.T) {
|
|
data, err := d.MarshalText()
|
|
require.NoError(t, err)
|
|
|
|
assert.EqualValues(t, []byte(defaultTestDur.String()), data)
|
|
})
|
|
}
|
|
|
|
func TestDuration_UnmarshalText(t *testing.T) {
|
|
d := Duration{defaultTestDur}
|
|
var v *durationEncodingTester
|
|
|
|
t.Run("json", func(t *testing.T) {
|
|
v = &durationEncodingTester{}
|
|
|
|
r := strings.NewReader(jsonStr)
|
|
err := json.NewDecoder(r).Decode(v)
|
|
require.NoError(t, err)
|
|
|
|
v.checkFields(t, d)
|
|
})
|
|
|
|
t.Run("yaml", func(t *testing.T) {
|
|
v = &durationEncodingTester{}
|
|
|
|
r := strings.NewReader(yamlStr)
|
|
err := yaml.NewDecoder(r).Decode(v)
|
|
require.NoError(t, err)
|
|
|
|
v.checkFields(t, d)
|
|
})
|
|
|
|
t.Run("direct", func(t *testing.T) {
|
|
dd := &Duration{}
|
|
|
|
err := dd.UnmarshalText([]byte(d.String()))
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, d, *dd)
|
|
})
|
|
|
|
t.Run("bad_data", func(t *testing.T) {
|
|
assert.Error(t, (&Duration{}).UnmarshalText([]byte(`abc`)))
|
|
})
|
|
}
|