2019-01-09 10:04:38 +03:00
|
|
|
/*
|
|
|
|
NAME
|
|
|
|
rtmp_test.go
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
RTMP tests
|
|
|
|
|
|
|
|
AUTHORS
|
|
|
|
Alan Noble <alan@ausocean.org>
|
|
|
|
|
|
|
|
LICENSE
|
|
|
|
rtmp_test.go is Copyright (C) 2017-2019 the Australian Ocean Lab (AusOcean)
|
|
|
|
|
|
|
|
It is free software: you can redistribute it and/or modify them
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation, either version 3 of the License, or (at your
|
|
|
|
option) any later version.
|
|
|
|
|
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package rtmp
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"runtime"
|
|
|
|
"testing"
|
2019-01-10 06:26:20 +03:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"bitbucket.org/ausocean/av/stream/flv"
|
|
|
|
"bitbucket.org/ausocean/av/stream/lex"
|
2019-01-10 05:21:18 +03:00
|
|
|
"io/ioutil"
|
2019-01-09 10:04:38 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
rtmpProtocol = "rtmp"
|
|
|
|
testHost = "a.rtmp.youtube.com"
|
|
|
|
testApp = "live2"
|
|
|
|
testBaseURL = rtmpProtocol + "://" + testHost + "/" + testApp + "/"
|
|
|
|
testTimeout = 30
|
|
|
|
)
|
|
|
|
|
|
|
|
// debug enables extra logging
|
2019-01-10 06:26:20 +03:00
|
|
|
var testDebug = true
|
2019-01-09 10:04:38 +03:00
|
|
|
|
|
|
|
// testKey is the RTMP key required for YouTube streaming (RTMP_TEST_KEY env var)
|
|
|
|
var testKey string
|
|
|
|
|
|
|
|
// testFile is the test video file (RTMP_TEST_FILE env var)
|
|
|
|
var testFile string
|
|
|
|
|
|
|
|
// testLog is a bare bones logger that logs to stdout.
|
|
|
|
func testLog(level int8, msg string, params ...interface{}) {
|
|
|
|
logLevels := [...]string{"Debug", "Info", "Warn", "Error", "", "", "Fatal"}
|
|
|
|
if level < -1 || level > 5 {
|
|
|
|
panic("Invalid log level")
|
|
|
|
}
|
|
|
|
if testDebug && len(params) >= 2 {
|
|
|
|
switch params[0].(string) {
|
|
|
|
case "error":
|
|
|
|
fmt.Printf("%s: %s, error=%v\n", logLevels[level+1], msg, params[1].(string))
|
|
|
|
case "size":
|
|
|
|
fmt.Printf("%s: %s, size=%d\n", logLevels[level+1], msg, params[1].(int))
|
|
|
|
default:
|
|
|
|
fmt.Printf("%s: %s\n", logLevels[level+1], msg)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
fmt.Printf("%s: %s\n", logLevels[level+1], msg)
|
|
|
|
}
|
|
|
|
if level == 5 {
|
|
|
|
// Fatal
|
|
|
|
buf := make([]byte, 1<<16)
|
|
|
|
size := runtime.Stack(buf, true)
|
|
|
|
fmt.Printf("%s\n", string(buf[:size]))
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestKey(t *testing.T) {
|
|
|
|
testLog(0, "TestKey")
|
2019-01-10 06:26:20 +03:00
|
|
|
testKey = os.Getenv("RTMP_TEST_KEY")
|
2019-01-09 10:04:38 +03:00
|
|
|
if testKey == "" {
|
2019-01-10 05:21:18 +03:00
|
|
|
fmt.Printf("RTMP_TEST_KEY environment variable not defined\n")
|
2019-01-09 10:04:38 +03:00
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
testLog(0, "Testing against URL "+testBaseURL+testKey)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetupURL(t *testing.T) {
|
|
|
|
testLog(0, "TestSetupURL")
|
|
|
|
// test with just the base URL
|
|
|
|
s := NewSession(testBaseURL, testTimeout, testLog)
|
|
|
|
if s.url != testBaseURL && s.link.timeout != testTimeout {
|
|
|
|
t.Errorf("NewSession failed")
|
|
|
|
}
|
|
|
|
err := setupURL(s, s.url)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("setupURL(testBaseURL) failed with error: %v", err)
|
|
|
|
}
|
|
|
|
// test again with the full URL
|
|
|
|
s = NewSession(testBaseURL+testKey, testTimeout, testLog)
|
|
|
|
err = setupURL(s, s.url)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("setupURL(testBaseURL+testKey) failed with error: %v", err)
|
|
|
|
}
|
|
|
|
// test the parts are as expected
|
|
|
|
if rtmpProtocolStrings[s.link.protocol] != rtmpProtocol {
|
|
|
|
t.Errorf("setupURL returned wrong protocol: %v", s.link.protocol)
|
|
|
|
}
|
|
|
|
if s.link.host != testHost {
|
|
|
|
t.Errorf("setupURL returned wrong host: %v", s.link.host)
|
|
|
|
}
|
|
|
|
if s.link.app != testApp {
|
|
|
|
t.Errorf("setupURL returned wrong app: %v", s.link.app)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-10 05:21:18 +03:00
|
|
|
func TestOpen(t *testing.T) {
|
|
|
|
testLog(0, "TestOpen")
|
|
|
|
s := NewSession(testBaseURL+testKey, testTimeout, testLog)
|
|
|
|
err := setupURL(s, s.url)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("setupURL failed with error: %v", err)
|
|
|
|
}
|
|
|
|
s.enableWrite()
|
|
|
|
err = s.Open()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("connect failed with error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-09 10:04:38 +03:00
|
|
|
func TestOpenClose(t *testing.T) {
|
|
|
|
testLog(0, "TestOpenClose")
|
|
|
|
s := NewSession(testBaseURL+testKey, testTimeout, testLog)
|
|
|
|
err := s.Open()
|
|
|
|
if err != nil {
|
2019-01-10 05:21:18 +03:00
|
|
|
t.Errorf("Open failed with error: %v", err)
|
2019-01-09 10:04:38 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFromFile(t *testing.T) {
|
|
|
|
testLog(0, "TestFromFile")
|
|
|
|
s := NewSession(testBaseURL+testKey, testTimeout, testLog)
|
|
|
|
err := s.Open()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Session.Open failed with error: %v", err)
|
|
|
|
}
|
2019-01-10 06:26:20 +03:00
|
|
|
|
|
|
|
// This read from a h264 file
|
|
|
|
if true {
|
|
|
|
// Open file
|
|
|
|
f, err := os.Open("../../test/test-data/av/input/betterInput.h264")
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Cannot open video file: %v", testFile)
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
// Passing rtmp session, true for audio, true for video, and 25 fps
|
|
|
|
flvEncoder := flv.NewEncoder(s, true, true, 25)
|
|
|
|
err = lex.H264(flvEncoder, f, time.Second/time.Duration(25))
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Lexing and encoding failed with error: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// This reads a single h264 frame and sends
|
|
|
|
} else {
|
|
|
|
b, err := ioutil.ReadFile("/home/saxon/Downloads/ausoceanFrame.h264") // b has type []byte
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Could not read file, failed with error: %v", err)
|
|
|
|
}
|
|
|
|
flvEncoder := flv.NewEncoder(s, true, true, 25)
|
|
|
|
for i := 0; i < 10000; i++ {
|
|
|
|
err := flvEncoder.Encode(b)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Encoding failed!")
|
|
|
|
}
|
|
|
|
}
|
2019-01-09 10:04:38 +03:00
|
|
|
}
|
2019-01-10 06:26:20 +03:00
|
|
|
|
2019-01-09 10:04:38 +03:00
|
|
|
err = s.Close()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Session.Close failed with error: %v", err)
|
|
|
|
}
|
|
|
|
}
|