available_ring_internal_test.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package virtqueue
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestAvailableRing_MemoryLayout(t *testing.T) {
  7. const queueSize = 2
  8. memory := make([]byte, availableRingSize(queueSize))
  9. r := newAvailableRing(queueSize, memory)
  10. *r.flags = 0x01ff
  11. *r.ringIndex = 1
  12. r.ring[0] = 0x1234
  13. r.ring[1] = 0x5678
  14. assert.Equal(t, []byte{
  15. 0xff, 0x01,
  16. 0x01, 0x00,
  17. 0x34, 0x12,
  18. 0x78, 0x56,
  19. 0x00, 0x00,
  20. }, memory)
  21. }
  22. func TestAvailableRing_Offer(t *testing.T) {
  23. const queueSize = 8
  24. chainHeads := []uint16{42, 33, 69}
  25. tests := []struct {
  26. name string
  27. startRingIndex uint16
  28. expectedRingIndex uint16
  29. expectedRing []uint16
  30. }{
  31. {
  32. name: "no overflow",
  33. startRingIndex: 0,
  34. expectedRingIndex: 3,
  35. expectedRing: []uint16{42, 33, 69, 0, 0, 0, 0, 0},
  36. },
  37. {
  38. name: "ring overflow",
  39. startRingIndex: 6,
  40. expectedRingIndex: 9,
  41. expectedRing: []uint16{69, 0, 0, 0, 0, 0, 42, 33},
  42. },
  43. {
  44. name: "index overflow",
  45. startRingIndex: 65535,
  46. expectedRingIndex: 2,
  47. expectedRing: []uint16{33, 69, 0, 0, 0, 0, 0, 42},
  48. },
  49. }
  50. for _, tt := range tests {
  51. t.Run(tt.name, func(t *testing.T) {
  52. memory := make([]byte, availableRingSize(queueSize))
  53. r := newAvailableRing(queueSize, memory)
  54. *r.ringIndex = tt.startRingIndex
  55. r.offer(chainHeads)
  56. assert.Equal(t, tt.expectedRingIndex, *r.ringIndex)
  57. assert.Equal(t, tt.expectedRing, r.ring)
  58. })
  59. }
  60. }