|
|
|
@ -49,6 +49,8 @@ func getTcURL(u string) string {
@@ -49,6 +49,8 @@ func getTcURL(u string) string {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestClientHandshake(t *testing.T) { |
|
|
|
|
for _, ca := range []string{"read", "publish"} { |
|
|
|
|
t.Run(ca, func(t *testing.T) { |
|
|
|
|
ln, err := net.Listen("tcp", "127.0.0.1:9121") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer ln.Close() |
|
|
|
@ -152,6 +154,7 @@ func TestClientHandshake(t *testing.T) {
@@ -152,6 +154,7 @@ func TestClientHandshake(t *testing.T) {
|
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
if ca == "read" { |
|
|
|
|
// C->S create stream
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
@ -213,6 +216,89 @@ func TestClientHandshake(t *testing.T) {
@@ -213,6 +216,89 @@ func TestClientHandshake(t *testing.T) {
|
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
} else { |
|
|
|
|
// C->S releaseStream
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, &message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"releaseStream", |
|
|
|
|
float64(2), |
|
|
|
|
nil, |
|
|
|
|
"", |
|
|
|
|
}, |
|
|
|
|
}, msg) |
|
|
|
|
|
|
|
|
|
// C->S FCPublish
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, &message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"FCPublish", |
|
|
|
|
float64(3), |
|
|
|
|
nil, |
|
|
|
|
"", |
|
|
|
|
}, |
|
|
|
|
}, msg) |
|
|
|
|
|
|
|
|
|
// C->S createStream
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, &message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"createStream", |
|
|
|
|
float64(4), |
|
|
|
|
nil, |
|
|
|
|
}, |
|
|
|
|
}, msg) |
|
|
|
|
|
|
|
|
|
// S->C result
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"_result", |
|
|
|
|
float64(4), |
|
|
|
|
nil, |
|
|
|
|
float64(1), |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
// C->S publish
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, &message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 4, |
|
|
|
|
MessageStreamID: 16777216, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"publish", |
|
|
|
|
float64(5), |
|
|
|
|
nil, |
|
|
|
|
"", |
|
|
|
|
"stream", |
|
|
|
|
}, |
|
|
|
|
}, msg) |
|
|
|
|
|
|
|
|
|
// S->C onStatus
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 5, |
|
|
|
|
MessageStreamID: 16777216, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"onStatus", |
|
|
|
|
float64(5), |
|
|
|
|
nil, |
|
|
|
|
flvio.AMFMap{ |
|
|
|
|
{K: "level", V: "status"}, |
|
|
|
|
{K: "code", V: "NetStream.Publish.Start"}, |
|
|
|
|
{K: "description", V: "publish start"}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
close(done) |
|
|
|
|
}() |
|
|
|
@ -225,13 +311,17 @@ func TestClientHandshake(t *testing.T) {
@@ -225,13 +311,17 @@ func TestClientHandshake(t *testing.T) {
|
|
|
|
|
defer nconn.Close() |
|
|
|
|
conn := NewClientConn(nconn, u) |
|
|
|
|
|
|
|
|
|
err = conn.ClientHandshake(true) |
|
|
|
|
err = conn.ClientHandshake(ca == "read") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
<-done |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestServerHandshake(t *testing.T) { |
|
|
|
|
for _, ca := range []string{"read", "publish"} { |
|
|
|
|
t.Run(ca, func(t *testing.T) { |
|
|
|
|
ln, err := net.Listen("tcp", "127.0.0.1:9121") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer ln.Close() |
|
|
|
@ -352,6 +442,50 @@ func TestServerHandshake(t *testing.T) {
@@ -352,6 +442,50 @@ func TestServerHandshake(t *testing.T) {
|
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
if ca == "read" { |
|
|
|
|
// C->S createStream
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"createStream", |
|
|
|
|
float64(2), |
|
|
|
|
nil, |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
// S->C result
|
|
|
|
|
msg, err = mrw.Read() |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, &message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"_result", |
|
|
|
|
float64(2), |
|
|
|
|
nil, |
|
|
|
|
float64(1), |
|
|
|
|
}, |
|
|
|
|
}, msg) |
|
|
|
|
|
|
|
|
|
// C->S user control set buffer length
|
|
|
|
|
err = mrw.Write(&message.MsgUserControlSetBufferLength{ |
|
|
|
|
BufferLength: 0x64, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
// C->S play
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 4, |
|
|
|
|
MessageStreamID: 16777216, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"play", |
|
|
|
|
float64(0), |
|
|
|
|
nil, |
|
|
|
|
"", |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
} else { |
|
|
|
|
// C->S releaseStream
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 3, |
|
|
|
@ -402,19 +536,22 @@ func TestServerHandshake(t *testing.T) {
@@ -402,19 +536,22 @@ func TestServerHandshake(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
// C->S publish
|
|
|
|
|
err = mrw.Write(&message.MsgCommandAMF0{ |
|
|
|
|
ChunkStreamID: 8, |
|
|
|
|
MessageStreamID: 1, |
|
|
|
|
ChunkStreamID: 4, |
|
|
|
|
MessageStreamID: 16777216, |
|
|
|
|
Payload: []interface{}{ |
|
|
|
|
"publish", |
|
|
|
|
float64(5), |
|
|
|
|
nil, |
|
|
|
|
"", |
|
|
|
|
"live", |
|
|
|
|
"stream", |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
<-done |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestReadTracks(t *testing.T) { |
|
|
|
|