Browse Source

add vlc tests

pull/31/head v0.8.6
aler9 5 years ago
parent
commit
6dbefec876
  1. 261
      main_test.go
  2. 2
      test-images/ffmpeg/start.sh
  3. 11
      test-images/vlc/Dockerfile
  4. 15
      test-images/vlc/start.sh

261
main_test.go

@ -5,6 +5,8 @@ import (
"net" "net"
"os" "os"
"os/exec" "os/exec"
"strconv"
"strings"
"testing" "testing"
"time" "time"
@ -47,14 +49,12 @@ var ownDockerIp = func() string {
}() }()
type container struct { type container struct {
name string name string
stdout *bytes.Buffer
} }
func newContainer(image string, name string, args []string) (*container, error) { func newContainer(image string, name string, args []string) (*container, error) {
c := &container{ c := &container{
name: name, name: name,
stdout: bytes.NewBuffer(nil),
} }
exec.Command("docker", "kill", "rtsp-simple-server-test-"+name).Run() exec.Command("docker", "kill", "rtsp-simple-server-test-"+name).Run()
@ -65,8 +65,7 @@ func newContainer(image string, name string, args []string) (*container, error)
"rtsp-simple-server-test-" + image} "rtsp-simple-server-test-" + image}
cmd = append(cmd, args...) cmd = append(cmd, args...)
ecmd := exec.Command(cmd[0], cmd[1:]...) ecmd := exec.Command(cmd[0], cmd[1:]...)
ecmd.Stdout = nil
ecmd.Stdout = c.stdout
ecmd.Stderr = os.Stderr ecmd.Stderr = os.Stderr
err := ecmd.Start() err := ecmd.Start()
@ -85,18 +84,24 @@ func (c *container) close() {
exec.Command("docker", "rm", "rtsp-simple-server-test-"+c.name).Run() exec.Command("docker", "rm", "rtsp-simple-server-test-"+c.name).Run()
} }
func (c *container) wait() { func (c *container) wait() int {
exec.Command("docker", "wait", "rtsp-simple-server-test-"+c.name).Run() exec.Command("docker", "wait", "rtsp-simple-server-test-"+c.name).Run()
out, _ := exec.Command("docker", "inspect", "rtsp-simple-server-test-"+c.name,
"--format={{.State.ExitCode}}").Output()
code, _ := strconv.ParseInt(string(out[:len(out)-1]), 10, 64)
return int(code)
} }
func TestProtocols(t *testing.T) { func TestProtocols(t *testing.T) {
for _, pair := range [][2]string{ for _, conf := range [][3]string{
{"udp", "udp"}, {"udp", "udp", "ffmpeg"},
{"udp", "tcp"}, {"udp", "tcp", "ffmpeg"},
{"tcp", "udp"}, {"tcp", "udp", "ffmpeg"},
{"tcp", "tcp"}, {"tcp", "tcp", "ffmpeg"},
{"tcp", "udp", "vlc"},
{"tcp", "tcp", "vlc"},
} { } {
t.Run(pair[0]+"_"+pair[1], func(t *testing.T) { t.Run(strings.Join(conf[:], "_"), func(t *testing.T) {
p, err := newProgram([]string{}, bytes.NewBuffer(nil)) p, err := newProgram([]string{}, bytes.NewBuffer(nil))
require.NoError(t, err) require.NoError(t, err)
defer p.close() defer p.close()
@ -111,7 +116,7 @@ func TestProtocols(t *testing.T) {
"-i", "/emptyvideo.ts", "-i", "/emptyvideo.ts",
"-c", "copy", "-c", "copy",
"-f", "rtsp", "-f", "rtsp",
"-rtsp_transport", pair[0], "-rtsp_transport", conf[0],
"rtsp://" + ownDockerIp + ":8554/teststream", "rtsp://" + ownDockerIp + ":8554/teststream",
}) })
require.NoError(t, err) require.NoError(t, err)
@ -119,115 +124,146 @@ func TestProtocols(t *testing.T) {
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
cnt2, err := newContainer("ffmpeg", "dest", []string{ if conf[2] == "ffmpeg" {
"-hide_banner", cnt2, err := newContainer("ffmpeg", "dest", []string{
"-loglevel", "panic", "-hide_banner",
"-rtsp_transport", pair[1], "-loglevel", "panic",
"-i", "rtsp://" + ownDockerIp + ":8554/teststream", "-rtsp_transport", conf[1],
"-vframes", "1", "-i", "rtsp://" + ownDockerIp + ":8554/teststream",
"-f", "image2", "-vframes", "1",
"-y", "/dev/null", "-f", "image2",
}) "-y", "/dev/null",
require.NoError(t, err) })
defer cnt2.close() require.NoError(t, err)
defer cnt2.close()
code := cnt2.wait()
require.Equal(t, 0, code)
} else {
args := []string{}
if conf[1] == "tcp" {
args = append(args, "--rtsp-tcp")
}
args = append(args, "rtsp://"+ownDockerIp+":8554/teststream")
cnt2.wait() cnt2, err := newContainer("vlc", "dest", args)
require.NoError(t, err)
defer cnt2.close()
require.Equal(t, "all right\n", string(cnt2.stdout.Bytes())) code := cnt2.wait()
require.Equal(t, 0, code)
}
}) })
} }
} }
func TestPublishAuth(t *testing.T) { func TestAuth(t *testing.T) {
stdin := []byte("\n" + t.Run("publish", func(t *testing.T) {
"paths:\n" + stdin := []byte("\n" +
" all:\n" + "paths:\n" +
" publishUser: testuser\n" + " all:\n" +
" publishPass: testpass\n" + " publishUser: testuser\n" +
" publishIps: [172.17.0.0/16]\n") " publishPass: testpass\n" +
p, err := newProgram([]string{"stdin"}, bytes.NewBuffer(stdin)) " publishIps: [172.17.0.0/16]\n")
require.NoError(t, err) p, err := newProgram([]string{"stdin"}, bytes.NewBuffer(stdin))
defer p.close() require.NoError(t, err)
defer p.close()
time.Sleep(1 * time.Second)
time.Sleep(1 * time.Second)
cnt1, err := newContainer("ffmpeg", "source", []string{
"-hide_banner", cnt1, err := newContainer("ffmpeg", "source", []string{
"-loglevel", "panic", "-hide_banner",
"-re", "-loglevel", "panic",
"-stream_loop", "-1", "-re",
"-i", "/emptyvideo.ts", "-stream_loop", "-1",
"-c", "copy", "-i", "/emptyvideo.ts",
"-f", "rtsp", "-c", "copy",
"-rtsp_transport", "udp", "-f", "rtsp",
"rtsp://testuser:testpass@" + ownDockerIp + ":8554/teststream", "-rtsp_transport", "udp",
}) "rtsp://testuser:testpass@" + ownDockerIp + ":8554/teststream",
require.NoError(t, err) })
defer cnt1.close() require.NoError(t, err)
defer cnt1.close()
time.Sleep(1 * time.Second)
time.Sleep(1 * time.Second)
cnt2, err := newContainer("ffmpeg", "dest", []string{
"-hide_banner",
"-loglevel", "panic",
"-rtsp_transport", "udp",
"-i", "rtsp://" + ownDockerIp + ":8554/teststream",
"-vframes", "1",
"-f", "image2",
"-y", "/dev/null",
})
require.NoError(t, err)
defer cnt2.close()
cnt2, err := newContainer("ffmpeg", "dest", []string{ code := cnt2.wait()
"-hide_banner", require.Equal(t, 0, code)
"-loglevel", "panic",
"-rtsp_transport", "udp",
"-i", "rtsp://" + ownDockerIp + ":8554/teststream",
"-vframes", "1",
"-f", "image2",
"-y", "/dev/null",
}) })
require.NoError(t, err)
defer cnt2.close()
cnt2.wait()
require.Equal(t, "all right\n", string(cnt2.stdout.Bytes())) for _, soft := range []string{
} "ffmpeg",
"vlc",
func TestReadAuth(t *testing.T) { } {
stdin := []byte("\n" + t.Run("read_"+soft, func(t *testing.T) {
"paths:\n" + stdin := []byte("\n" +
" all:\n" + "paths:\n" +
" readUser: testuser\n" + " all:\n" +
" readPass: testpass\n" + " readUser: testuser\n" +
" readIps: [172.17.0.0/16]\n") " readPass: testpass\n" +
p, err := newProgram([]string{"stdin"}, bytes.NewBuffer(stdin)) " readIps: [172.17.0.0/16]\n")
require.NoError(t, err) p, err := newProgram([]string{"stdin"}, bytes.NewBuffer(stdin))
defer p.close() require.NoError(t, err)
defer p.close()
time.Sleep(1 * time.Second)
cnt1, err := newContainer("ffmpeg", "source", []string{
"-hide_banner",
"-loglevel", "panic",
"-re",
"-stream_loop", "-1",
"-i", "/emptyvideo.ts",
"-c", "copy",
"-f", "rtsp",
"-rtsp_transport", "udp",
"rtsp://" + ownDockerIp + ":8554/teststream",
})
require.NoError(t, err)
defer cnt1.close()
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
cnt2, err := newContainer("ffmpeg", "dest", []string{ cnt1, err := newContainer("ffmpeg", "source", []string{
"-hide_banner", "-hide_banner",
"-loglevel", "panic", "-loglevel", "panic",
"-rtsp_transport", "udp", "-re",
"-i", "rtsp://testuser:testpass@" + ownDockerIp + ":8554/teststream", "-stream_loop", "-1",
"-vframes", "1", "-i", "/emptyvideo.ts",
"-f", "image2", "-c", "copy",
"-y", "/dev/null", "-f", "rtsp",
}) "-rtsp_transport", "udp",
require.NoError(t, err) "rtsp://" + ownDockerIp + ":8554/teststream",
defer cnt2.close() })
require.NoError(t, err)
defer cnt1.close()
cnt2.wait() time.Sleep(1 * time.Second)
require.Equal(t, "all right\n", string(cnt2.stdout.Bytes())) if soft == "ffmpeg" {
cnt2, err := newContainer("ffmpeg", "dest", []string{
"-hide_banner",
"-loglevel", "panic",
"-rtsp_transport", "udp",
"-i", "rtsp://testuser:testpass@" + ownDockerIp + ":8554/teststream",
"-vframes", "1",
"-f", "image2",
"-y", "/dev/null",
})
require.NoError(t, err)
defer cnt2.close()
code := cnt2.wait()
require.Equal(t, 0, code)
} else {
cnt2, err := newContainer("vlc", "dest",
[]string{"rtsp://testuser:testpass@" + ownDockerIp + ":8554/teststream"})
require.NoError(t, err)
defer cnt2.close()
code := cnt2.wait()
require.Equal(t, 0, code)
}
})
}
} }
func TestProxy(t *testing.T) { func TestProxy(t *testing.T) {
@ -290,9 +326,8 @@ func TestProxy(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer cnt2.close() defer cnt2.close()
cnt2.wait() code := cnt2.wait()
require.Equal(t, 0, code)
require.Equal(t, "all right\n", string(cnt2.stdout.Bytes()))
}) })
} }
} }

2
test-images/ffmpeg/start.sh

@ -1,5 +1,3 @@
#!/bin/sh -e #!/bin/sh -e
ffmpeg $@ ffmpeg $@
echo "all right"

11
test-images/vlc/Dockerfile

@ -0,0 +1,11 @@
FROM amd64/alpine:3.12
RUN apk add --no-cache \
vlc
RUN adduser -D -H -s /bin/sh -u 9337 user
COPY start.sh /
RUN chmod +x /start.sh
ENTRYPOINT [ "/start.sh" ]

15
test-images/vlc/start.sh

@ -0,0 +1,15 @@
#!/bin/sh -e
mkdir /out
chown user:user /out
CMD="cvlc --play-and-exit --no-audio --no-video --sout file/ts:/out/stream.ts -vvv $@"
su - user -c "$CMD" 2>&1 &
sleep 10
if [ $(stat -c "%s" /out/stream.ts) -gt 0 ]; then
exit 0
else
exit 1
fi
Loading…
Cancel
Save