75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package hashtag
|
|
|
|
import (
|
|
"math/rand"
|
|
"testing"
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
func TestGinkgoSuite(t *testing.T) {
|
|
RegisterFailHandler(Fail)
|
|
RunSpecs(t, "hashtag")
|
|
}
|
|
|
|
var _ = Describe("CRC16", func() {
|
|
|
|
// http://redis.io/topics/cluster-spec#keys-distribution-model
|
|
It("should calculate CRC16", func() {
|
|
tests := []struct {
|
|
s string
|
|
n uint16
|
|
}{
|
|
{"123456789", 0x31C3},
|
|
{string([]byte{83, 153, 134, 118, 229, 214, 244, 75, 140, 37, 215, 215}), 21847},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
Expect(crc16sum(test.s)).To(Equal(test.n), "for %s", test.s)
|
|
}
|
|
})
|
|
|
|
})
|
|
|
|
var _ = Describe("HashSlot", func() {
|
|
|
|
It("should calculate hash slots", func() {
|
|
tests := []struct {
|
|
key string
|
|
slot int
|
|
}{
|
|
{"123456789", 12739},
|
|
{"{}foo", 9500},
|
|
{"foo{}", 5542},
|
|
{"foo{}{bar}", 8363},
|
|
{"", 10503},
|
|
{"", 5176},
|
|
{string([]byte{83, 153, 134, 118, 229, 214, 244, 75, 140, 37, 215, 215}), 5463},
|
|
}
|
|
// Empty keys receive random slot.
|
|
rand.Seed(100)
|
|
|
|
for _, test := range tests {
|
|
Expect(Slot(test.key)).To(Equal(test.slot), "for %s", test.key)
|
|
}
|
|
})
|
|
|
|
It("should extract keys from tags", func() {
|
|
tests := []struct {
|
|
one, two string
|
|
}{
|
|
{"foo{bar}", "bar"},
|
|
{"{foo}bar", "foo"},
|
|
{"{user1000}.following", "{user1000}.followers"},
|
|
{"foo{{bar}}zap", "{bar"},
|
|
{"foo{bar}{zap}", "bar"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
Expect(Slot(test.one)).To(Equal(Slot(test.two)), "for %s <-> %s", test.one, test.two)
|
|
}
|
|
})
|
|
|
|
})
|