Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package sharding | |
import ( | |
"encoding/json" | |
"errors" | |
"testing" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
) | |
func Test_Config(t *testing.T) { | |
type test struct { | |
name string | |
input interface{} | |
expected Config | |
expectedErr error | |
} | |
tests := []test{ | |
{ | |
name: "nothing specified, all defaults", | |
input: nil, | |
expected: Config{ | |
VirtualPerPhysical: DefaultVirtualPerPhysical, | |
DesiredCount: 7, // cluster size | |
DesiredVirtualCount: DefaultVirtualPerPhysical * 7, | |
ActualCount: 7, // cluster size | |
ActualVirtualCount: DefaultVirtualPerPhysical * 7, | |
Key: DefaultKey, | |
Strategy: DefaultStrategy, | |
Function: DefaultFunction, | |
}, | |
}, | |
{ | |
name: "everything specified, everything legal", | |
input: map[string]interface{}{ | |
"virtualPerPhysical": json.Number("64"), | |
"desiredCount": json.Number("3"), | |
"desiredVirtualCount": json.Number("192"), | |
"replicas": json.Number("3"), | |
"key": "_id", | |
"strategy": "hash", | |
"function": "murmur3", | |
}, | |
expected: Config{ | |
VirtualPerPhysical: 64, | |
DesiredCount: 3, | |
DesiredVirtualCount: 192, | |
ActualCount: 3, | |
ActualVirtualCount: 192, | |
Key: "_id", | |
Strategy: "hash", | |
Function: "murmur3", | |
}, | |
}, | |
{ | |
name: "everything specified, everything legal, from disk using floats for numbers", | |
input: map[string]interface{}{ | |
"virtualPerPhysical": float64(64), | |
"desiredCount": float64(3), | |
"desiredVirtualCount": float64(192), | |
"replicas": float64(4), | |
"key": "_id", | |
"strategy": "hash", | |
"function": "murmur3", | |
}, | |
expected: Config{ | |
VirtualPerPhysical: 64, | |
DesiredCount: 3, | |
DesiredVirtualCount: 192, | |
ActualCount: 3, | |
ActualVirtualCount: 192, | |
Key: "_id", | |
Strategy: "hash", | |
Function: "murmur3", | |
}, | |
}, | |
{ | |
name: "unsupported sharding key", | |
input: map[string]interface{}{ | |
"key": "myCustomField", | |
"strategy": "hash", | |
"function": "murmur3", | |
}, | |
expectedErr: errors.New("sharding only supported on key '_id' " + | |
"for now, got: myCustomField"), | |
}, | |
{ | |
name: "unsupported sharding strategy", | |
input: map[string]interface{}{ | |
"key": "_id", | |
"strategy": "range", | |
"function": "murmur3", | |
}, | |
expectedErr: errors.New("sharding only supported with strategy 'hash' " + | |
"for now, got: range"), | |
}, | |
{ | |
name: "unsupported sharding function", | |
input: map[string]interface{}{ | |
"key": "_id", | |
"strategy": "hash", | |
"function": "md5", | |
}, | |
expectedErr: errors.New("sharding only supported with function 'murmur3' " + | |
"for now, got: md5"), | |
}, | |
} | |
for _, test := range tests { | |
t.Run(test.name, func(t *testing.T) { | |
cfg, err := ParseConfig(test.input, 7) // pretend cluster size is 7 | |
if test.expectedErr == nil { | |
assert.Nil(t, err) | |
assert.Equal(t, test.expected, cfg) | |
} else { | |
require.NotNil(t, err, "should have error'd") | |
assert.Equal(t, test.expectedErr.Error(), err.Error()) | |
} | |
}) | |
} | |
} | |