protocol_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package via
  2. import (
  3. "bytes"
  4. "testing"
  5. )
  6. type fakeTransport struct {
  7. reportIDs []byte
  8. reports [][]byte
  9. response []byte
  10. queue [][]byte
  11. readCalls int
  12. readErr error
  13. readErrAfter int
  14. }
  15. func (f *fakeTransport) SendReport(reportID byte, report []byte) (int, error) {
  16. f.reportIDs = append(f.reportIDs, reportID)
  17. f.reports = append(f.reports, bytes.Clone(report))
  18. return len(report), nil
  19. }
  20. func (f *fakeTransport) Read(buf []byte) (int, error) {
  21. f.readCalls++
  22. if f.readErr != nil && f.readCalls > f.readErrAfter {
  23. return 0, f.readErr
  24. }
  25. if len(f.queue) > 0 {
  26. next := f.queue[0]
  27. f.queue = f.queue[1:]
  28. return copy(buf, next), nil
  29. }
  30. if len(f.response) > 0 {
  31. return copy(buf, f.response), nil
  32. }
  33. if len(f.reports) > 0 {
  34. return copy(buf, f.reports[len(f.reports)-1]), nil
  35. }
  36. return copy(buf, make([]byte, 32)), nil
  37. }
  38. func (f *fakeTransport) Close() error { return nil }
  39. func TestSetValueUsesQMKRGBLightPayload(t *testing.T) {
  40. transport := &fakeTransport{}
  41. protocol := Protocol{handle: transport}
  42. if err := protocol.SetValue(ChannelRgblight, 0x02, 0x00); err != nil {
  43. t.Fatalf("SetValue() error = %v", err)
  44. }
  45. want := make([]byte, 32)
  46. want[0] = 0x07
  47. want[1] = 0x02
  48. want[2] = 0x02
  49. want[3] = 0x00
  50. if len(transport.reports) != 1 {
  51. t.Fatalf("SendReport() calls = %d, want 1", len(transport.reports))
  52. }
  53. if transport.reportIDs[0] != 0x00 {
  54. t.Errorf("report ID = 0x%02x, want 0x00", transport.reportIDs[0])
  55. }
  56. if !bytes.Equal(transport.reports[0], want) {
  57. t.Errorf("report = %v, want %v", transport.reports[0], want)
  58. }
  59. }
  60. func TestSetValueConsumesQMKResponse(t *testing.T) {
  61. response := make([]byte, 32)
  62. response[0] = 0x07
  63. response[1] = 0x02
  64. response[2] = 0x02
  65. response[3] = 0x00
  66. transport := &fakeTransport{response: response}
  67. protocol := Protocol{handle: transport}
  68. if err := protocol.SetValue(ChannelRgblight, 0x02, 0x00); err != nil {
  69. t.Fatalf("SetValue() error = %v", err)
  70. }
  71. if transport.readCalls != 1 {
  72. t.Errorf("Read() calls = %d, want 1", transport.readCalls)
  73. }
  74. }
  75. func TestSetColorUsesQMKColorValue(t *testing.T) {
  76. transport := &fakeTransport{}
  77. protocol := Protocol{handle: transport}
  78. if err := protocol.SetColor(ChannelRgblight, 0x2a, 0x80); err != nil {
  79. t.Fatalf("SetColor() error = %v", err)
  80. }
  81. want := make([]byte, 32)
  82. want[0] = 0x07
  83. want[1] = 0x02
  84. want[2] = 0x04
  85. want[3] = 0x2a
  86. want[4] = 0x80
  87. if !bytes.Equal(transport.reports[0], want) {
  88. t.Errorf("report = %v, want %v", transport.reports[0], want)
  89. }
  90. }
  91. func TestGetValueReturnsQMKValueData(t *testing.T) {
  92. response := make([]byte, 32)
  93. response[0] = 0x08
  94. response[1] = 0x02
  95. response[2] = 0x01
  96. response[3] = 0xc8
  97. transport := &fakeTransport{response: response}
  98. protocol := Protocol{handle: transport}
  99. got, err := protocol.GetValue(ChannelRgblight, 0x01)
  100. if err != nil {
  101. t.Fatalf("GetValue() error = %v", err)
  102. }
  103. if !bytes.Equal(got, []byte{0xc8}) {
  104. t.Errorf("GetValue() = %v, want [192]", got)
  105. }
  106. want := make([]byte, 32)
  107. want[0] = 0x08
  108. want[1] = 0x02
  109. want[2] = 0x01
  110. if !bytes.Equal(transport.reports[0], want) {
  111. t.Errorf("request = %v, want %v", transport.reports[0], want)
  112. }
  113. }
  114. func TestGetValueRejectsUnhandledResponse(t *testing.T) {
  115. response := make([]byte, 32)
  116. response[0] = 0xff
  117. protocol := Protocol{handle: &fakeTransport{response: response}}
  118. if _, err := protocol.GetValue(ChannelRgblight, 0x01); err == nil {
  119. t.Fatal("GetValue() error = nil, want unhandled response error")
  120. }
  121. }
  122. func TestSetValueWritesEachImpact80EffectChannel(t *testing.T) {
  123. transport := &fakeTransport{}
  124. protocol := Protocol{handle: transport}
  125. cases := []struct {
  126. channel Channel
  127. effect byte
  128. }{
  129. {ChannelRgblight, 4},
  130. {ChannelRgbMatrix, 5},
  131. {ChannelAudio, 4},
  132. }
  133. for _, tc := range cases {
  134. if err := protocol.SetValue(tc.channel, 0x02, tc.effect); err != nil {
  135. t.Fatalf("SetValue(%d) error = %v", tc.channel, err)
  136. }
  137. }
  138. if len(transport.reports) != len(cases) {
  139. t.Fatalf("SendReport() calls = %d, want %d", len(transport.reports), len(cases))
  140. }
  141. for i, tc := range cases {
  142. report := transport.reports[i]
  143. if report[0] != 0x07 || report[1] != byte(tc.channel) || report[2] != 0x02 || report[3] != tc.effect {
  144. t.Errorf("effect report %d = %v, want channel 0x%02x effect %d", i, report, tc.channel, tc.effect)
  145. }
  146. }
  147. }
  148. func TestGetValueReturnsTwoByteColor(t *testing.T) {
  149. response := make([]byte, 32)
  150. response[0] = 0x08
  151. response[1] = 0x03
  152. response[2] = 0x04
  153. response[3] = 0x2a
  154. response[4] = 0x80
  155. transport := &fakeTransport{response: response}
  156. protocol := Protocol{handle: transport}
  157. got, err := protocol.GetValue(ChannelRgbMatrix, 0x04)
  158. if err != nil {
  159. t.Fatalf("GetValue() error = %v", err)
  160. }
  161. if !bytes.Equal(got, []byte{0x2a, 0x80}) {
  162. t.Errorf("GetValue() = %v, want [42 128]", got)
  163. }
  164. want := make([]byte, 32)
  165. want[0] = 0x08
  166. want[1] = 0x03
  167. want[2] = 0x04
  168. if !bytes.Equal(transport.reports[0], want) {
  169. t.Errorf("request = %v, want %v", transport.reports[0], want)
  170. }
  171. }