package streams import ( "bytes" "io" "sync" "testing" . "github.com/smartystreets/goconvey/convey" ) var ( exampleMetadataStr = `StreamTitle='Test 123';` exampleMetadata = map[string]string{ "StreamTitle": "Test 123", } exampleData = []byte{ 0, 1, 2, 3, 4, 5, 6, 7, } exampleMetadataInterval = 4 exampleCompleteData = []byte{} ) func init() { metadataBytes := make([]byte, 2*16) copy(metadataBytes, []byte(exampleMetadataStr)) exampleCompleteData = append(exampleCompleteData, exampleData[0:4]...) exampleCompleteData = append(exampleCompleteData, 2) exampleCompleteData = append(exampleCompleteData, metadataBytes...) exampleCompleteData = append(exampleCompleteData, exampleData[4:8]...) exampleCompleteData = append(exampleCompleteData, 0) } func Test_MetadataExtractor(t *testing.T) { Convey("MetadataExtractor", t, func(c C) { me := NewMetadataExtractor(bytes.NewReader(exampleCompleteData), exampleMetadataInterval) metastream := me.Metadata() buf := make([]byte, 32) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() So := c.So meta, err := metastream.Read() t.Log("Metastream.Read:", meta, err) So(err, ShouldBeNil) So(meta, ShouldNotBeNil) So(meta, ShouldContainKey, "StreamTitle") So(meta["StreamTitle"], ShouldEqual, "Test 123") /*meta, err = metastream.Read() t.Log("Metastream.Read:", meta, err) So(err, ShouldBeNil) So(meta, ShouldNotBeNil) So(meta, ShouldBeEmpty)*/ meta, err = metastream.Read() t.Log("Metastream.Read:", meta, err) So(err, ShouldEqual, io.EOF) So(meta, ShouldBeNil) }() allData := []byte{} attempts := 0 for { attempts++ if attempts == 100 { t.Fail() return } n, err := me.Read(buf) t.Logf("Read: %d %s %q", n, err, buf[0:n]) if err == io.EOF { break } So(err, ShouldBeNil) allData = append(allData, buf[0:n]...) } wg.Wait() So(allData, ShouldResemble, exampleData[0:8]) }) }