Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

78 linhas
1.8KB

  1. package icecast
  2. import (
  3. "bytes"
  4. "io"
  5. "testing"
  6. )
  7. func TestParseICYMetadataExtractsStreamTitle(t *testing.T) {
  8. meta := parseICYMetadata([]byte("StreamTitle='Artist - Track';StreamUrl='';"))
  9. if meta.StreamTitle != "Artist - Track" {
  10. t.Fatalf("streamTitle=%q want %q", meta.StreamTitle, "Artist - Track")
  11. }
  12. }
  13. func TestICYReaderStripsMetadataAndEmitsTitle(t *testing.T) {
  14. block := buildICYMetadataBlock("StreamTitle='Unit Test';")
  15. wire := append([]byte("ABCD"), byte(len(block)/16))
  16. wire = append(wire, block...)
  17. wire = append(wire, []byte("EFGH")...)
  18. var got icyMetadata
  19. r := newICYReader(bytes.NewReader(wire), 4, func(meta icyMetadata) {
  20. got = meta
  21. })
  22. audio, err := io.ReadAll(r)
  23. if err != nil {
  24. t.Fatalf("read: %v", err)
  25. }
  26. if string(audio) != "ABCDEFGH" {
  27. t.Fatalf("audio=%q want %q", string(audio), "ABCDEFGH")
  28. }
  29. if got.StreamTitle != "Unit Test" {
  30. t.Fatalf("streamTitle=%q want %q", got.StreamTitle, "Unit Test")
  31. }
  32. }
  33. func TestParseICYMetaInt(t *testing.T) {
  34. tests := []struct {
  35. name string
  36. in string
  37. want int
  38. wantErr bool
  39. }{
  40. {name: "empty", in: "", want: 0},
  41. {name: "valid", in: "16000", want: 16000},
  42. {name: "invalid", in: "x", wantErr: true},
  43. {name: "negative", in: "-1", wantErr: true},
  44. }
  45. for _, tc := range tests {
  46. tc := tc
  47. t.Run(tc.name, func(t *testing.T) {
  48. got, err := parseICYMetaInt(tc.in)
  49. if tc.wantErr {
  50. if err == nil {
  51. t.Fatalf("expected error for %q", tc.in)
  52. }
  53. return
  54. }
  55. if err != nil {
  56. t.Fatalf("parse: %v", err)
  57. }
  58. if got != tc.want {
  59. t.Fatalf("got=%d want %d", got, tc.want)
  60. }
  61. })
  62. }
  63. }
  64. func buildICYMetadataBlock(raw string) []byte {
  65. b := []byte(raw)
  66. if rem := len(b) % 16; rem != 0 {
  67. b = append(b, bytes.Repeat([]byte{0x00}, 16-rem)...)
  68. }
  69. return b
  70. }