// Copyright 2020, Chef. All rights reserved. // https://github.com/q191201771/lal // // Use of this source code is governed by a MIT-style license // that can be found in the License file. // // Author: Chef (191201771@qq.com) package base_test import ( "testing" "github.com/q191201771/lal/pkg/base" "github.com/q191201771/naza/pkg/assert" ) type in struct { rawUrl string defaultPort int } // TODO chef: 测试IPv6的case func TestParseUrl(t *testing.T) { // 非法url _, err := base.ParseUrl("invalidurl", -1) assert.IsNotNil(t, err) golden := map[in]base.UrlContext{ // 常见url,url中无端口,另外设置默认端口 {rawUrl: "rtmp://127.0.0.1/live/test110", defaultPort: 1935}: { Url: "rtmp://127.0.0.1/live/test110", Scheme: "rtmp", StdHost: "127.0.0.1", HostWithPort: "127.0.0.1:1935", Host: "127.0.0.1", Port: 1935, PathWithRawQuery: "/live/test110", Path: "/live/test110", PathWithoutLastItem: "live", LastItemOfPath: "test110", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1/live/test110", }, // 域名url {rawUrl: "rtmp://localhost/live/test110", defaultPort: 1935}: { Url: "rtmp://localhost/live/test110", Scheme: "rtmp", StdHost: "localhost", HostWithPort: "localhost:1935", Host: "localhost", Port: 1935, PathWithRawQuery: "/live/test110", Path: "/live/test110", PathWithoutLastItem: "live", LastItemOfPath: "test110", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://localhost/live/test110", }, // 带参数url {rawUrl: "rtmp://127.0.0.1/live/test110?a=1", defaultPort: 1935}: { Url: "rtmp://127.0.0.1/live/test110?a=1", Scheme: "rtmp", StdHost: "127.0.0.1", HostWithPort: "127.0.0.1:1935", Host: "127.0.0.1", Port: 1935, PathWithRawQuery: "/live/test110?a=1", Path: "/live/test110", PathWithoutLastItem: "live", LastItemOfPath: "test110", RawQuery: "a=1", RawUrlWithoutUserInfo: "rtmp://127.0.0.1/live/test110?a=1", }, // path多级 {rawUrl: "rtmp://127.0.0.1:19350/a/b/test110", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350/a/b/test110", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "/a/b/test110", Path: "/a/b/test110", PathWithoutLastItem: "a/b", LastItemOfPath: "test110", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350/a/b/test110", }, // url中无端口,没有设置默认端口 {rawUrl: "rtmp://127.0.0.1/live/test110?a=1", defaultPort: -1}: { Url: "rtmp://127.0.0.1/live/test110?a=1", Scheme: "rtmp", StdHost: "127.0.0.1", HostWithPort: "127.0.0.1:1935", Host: "127.0.0.1", Port: 1935, PathWithRawQuery: "/live/test110?a=1", Path: "/live/test110", PathWithoutLastItem: "live", LastItemOfPath: "test110", RawQuery: "a=1", RawUrlWithoutUserInfo: "rtmp://127.0.0.1/live/test110?a=1", }, // url中有端口,设置默认端口 {rawUrl: "rtmp://127.0.0.1:19350/live/test110?a=1", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350/live/test110?a=1", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "/live/test110?a=1", Path: "/live/test110", PathWithoutLastItem: "live", LastItemOfPath: "test110", RawQuery: "a=1", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350/live/test110?a=1", }, // 无path {rawUrl: "rtmp://127.0.0.1:19350", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "", Path: "", PathWithoutLastItem: "", LastItemOfPath: "", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350", }, // 无path2 {rawUrl: "rtmp://127.0.0.1:19350/", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350/", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "/", Path: "/", PathWithoutLastItem: "", LastItemOfPath: "", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350/", }, // path不完整 {rawUrl: "rtmp://127.0.0.1:19350/live", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350/live", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "/live", Path: "/live", PathWithoutLastItem: "", LastItemOfPath: "live", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350/live", }, // path不完整2 {rawUrl: "rtmp://127.0.0.1:19350/live/", defaultPort: 1935}: { Url: "rtmp://127.0.0.1:19350/live/", Scheme: "rtmp", StdHost: "127.0.0.1:19350", HostWithPort: "127.0.0.1:19350", Host: "127.0.0.1", Port: 19350, PathWithRawQuery: "/live/", Path: "/live/", PathWithoutLastItem: "live", LastItemOfPath: "", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1:19350/live/", }, } for k, v := range golden { ctx, err := base.ParseUrl(k.rawUrl, k.defaultPort) assert.Equal(t, nil, err) assert.Equal(t, v, ctx, k.rawUrl) } } func TestParseRtmpUrl(t *testing.T) { golden := map[string]base.UrlContext{ // 其他测试见ParseUrl "rtmp://127.0.0.1/test110": { Url: "rtmp://127.0.0.1/test110", Scheme: "rtmp", StdHost: "127.0.0.1", HostWithPort: "127.0.0.1:1935", Host: "127.0.0.1", Port: 1935, PathWithRawQuery: "/test110", Path: "/test110", PathWithoutLastItem: "test110", LastItemOfPath: "", RawQuery: "", RawUrlWithoutUserInfo: "rtmp://127.0.0.1/test110", }, } for k, v := range golden { ctx, err := base.ParseRtmpUrl(k) assert.Equal(t, nil, err) assert.Equal(t, v, ctx, k) } } func TestParseRtspUrl(t *testing.T) { golden := map[string]base.UrlContext{ // 其他测试见ParseUrl "rtsp://admin:P!@1988@127.0.0.1:5554/h264/ch33/main/av_stream": { Url: "rtsp://admin:P!@1988@127.0.0.1:5554/h264/ch33/main/av_stream", Scheme: "rtsp", Username: "admin", Password: "P!@1988", StdHost: "127.0.0.1:5554", HostWithPort: "127.0.0.1:5554", Host: "127.0.0.1", Port: 5554, PathWithRawQuery: "/h264/ch33/main/av_stream", Path: "/h264/ch33/main/av_stream", PathWithoutLastItem: "h264/ch33/main", LastItemOfPath: "av_stream", RawQuery: "", RawUrlWithoutUserInfo: "rtsp://127.0.0.1:5554/h264/ch33/main/av_stream", }, } for k, v := range golden { ctx, err := base.ParseRtspUrl(k) assert.Equal(t, nil, err) assert.Equal(t, v, ctx, k) } }