write_buffer_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package proto_test
  2. import (
  3. "bytes"
  4. "encoding"
  5. "io/ioutil"
  6. "testing"
  7. "time"
  8. "github.com/go-redis/redis/v7/internal/proto"
  9. . "github.com/onsi/ginkgo"
  10. . "github.com/onsi/gomega"
  11. )
  12. type MyType struct{}
  13. var _ encoding.BinaryMarshaler = (*MyType)(nil)
  14. func (t *MyType) MarshalBinary() ([]byte, error) {
  15. return []byte("hello"), nil
  16. }
  17. var _ = Describe("WriteBuffer", func() {
  18. var buf *bytes.Buffer
  19. var wr *proto.Writer
  20. BeforeEach(func() {
  21. buf = new(bytes.Buffer)
  22. wr = proto.NewWriter(buf)
  23. })
  24. It("should write args", func() {
  25. err := wr.WriteArgs([]interface{}{
  26. "string",
  27. 12,
  28. 34.56,
  29. []byte{'b', 'y', 't', 'e', 's'},
  30. true,
  31. nil,
  32. })
  33. Expect(err).NotTo(HaveOccurred())
  34. err = wr.Flush()
  35. Expect(err).NotTo(HaveOccurred())
  36. Expect(buf.Bytes()).To(Equal([]byte("*6\r\n" +
  37. "$6\r\nstring\r\n" +
  38. "$2\r\n12\r\n" +
  39. "$5\r\n34.56\r\n" +
  40. "$5\r\nbytes\r\n" +
  41. "$1\r\n1\r\n" +
  42. "$0\r\n" +
  43. "\r\n")))
  44. })
  45. It("should append time", func() {
  46. err := wr.WriteArgs([]interface{}{time.Unix(1414141414, 0).UTC()})
  47. Expect(err).NotTo(HaveOccurred())
  48. err = wr.Flush()
  49. Expect(err).NotTo(HaveOccurred())
  50. Expect(buf.Len()).To(Equal(31))
  51. })
  52. It("should append marshalable args", func() {
  53. err := wr.WriteArgs([]interface{}{&MyType{}})
  54. Expect(err).NotTo(HaveOccurred())
  55. err = wr.Flush()
  56. Expect(err).NotTo(HaveOccurred())
  57. Expect(buf.Len()).To(Equal(15))
  58. })
  59. })
  60. func BenchmarkWriteBuffer_Append(b *testing.B) {
  61. buf := proto.NewWriter(ioutil.Discard)
  62. args := []interface{}{"hello", "world", "foo", "bar"}
  63. for i := 0; i < b.N; i++ {
  64. err := buf.WriteArgs(args)
  65. if err != nil {
  66. panic(err)
  67. }
  68. err = buf.Flush()
  69. if err != nil {
  70. panic(err)
  71. }
  72. }
  73. }