mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-19 17:50:03 -08:00
Reply with "status": "ok" in case of success, and with "status": "error" in case of error. This makes the API more accessible and user friendly.
136 lines
3.5 KiB
Go
136 lines
3.5 KiB
Go
package api //nolint:revive
|
|
|
|
import (
|
|
"net/http"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/conf"
|
|
"github.com/bluenviron/mediamtx/internal/defs"
|
|
"github.com/bluenviron/mediamtx/internal/test"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type testPathManager struct {
|
|
paths map[string]*defs.APIPath
|
|
}
|
|
|
|
func (m *testPathManager) APIPathsList() (*defs.APIPathList, error) {
|
|
items := make([]*defs.APIPath, 0, len(m.paths))
|
|
for _, path := range m.paths {
|
|
items = append(items, path)
|
|
}
|
|
return &defs.APIPathList{Items: items}, nil
|
|
}
|
|
|
|
func (m *testPathManager) APIPathsGet(name string) (*defs.APIPath, error) {
|
|
path, ok := m.paths[name]
|
|
if !ok {
|
|
return nil, conf.ErrPathNotFound
|
|
}
|
|
return path, nil
|
|
}
|
|
|
|
func TestPathsList(t *testing.T) {
|
|
now := time.Now()
|
|
pathManager := &testPathManager{
|
|
paths: map[string]*defs.APIPath{
|
|
"test1": {
|
|
Name: "test1",
|
|
ConfName: "test1",
|
|
Source: &defs.APIPathSourceOrReader{Type: "publisher", ID: "pub1"},
|
|
Ready: true,
|
|
ReadyTime: &now,
|
|
Tracks: []string{"H264", "Opus"},
|
|
BytesReceived: 1000,
|
|
BytesSent: 2000,
|
|
Readers: []defs.APIPathSourceOrReader{
|
|
{Type: "reader", ID: "reader1"},
|
|
},
|
|
},
|
|
"test2": {
|
|
Name: "test2",
|
|
ConfName: "test2",
|
|
Ready: false,
|
|
Tracks: []string{},
|
|
BytesReceived: 500,
|
|
BytesSent: 100,
|
|
Readers: []defs.APIPathSourceOrReader{},
|
|
},
|
|
},
|
|
}
|
|
|
|
api := API{
|
|
Address: "localhost:9997",
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
WriteTimeout: conf.Duration(10 * time.Second),
|
|
AuthManager: test.NilAuthManager,
|
|
PathManager: pathManager,
|
|
Parent: &testParent{},
|
|
}
|
|
err := api.Initialize()
|
|
require.NoError(t, err)
|
|
defer api.Close()
|
|
|
|
tr := &http.Transport{}
|
|
defer tr.CloseIdleConnections()
|
|
hc := &http.Client{Transport: tr}
|
|
|
|
var out defs.APIPathList
|
|
httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v3/paths/list", nil, &out)
|
|
|
|
require.Equal(t, 2, out.ItemCount)
|
|
require.Equal(t, 1, out.PageCount)
|
|
require.Len(t, out.Items, 2)
|
|
}
|
|
|
|
func TestPathsGet(t *testing.T) {
|
|
now := time.Now()
|
|
pathManager := &testPathManager{
|
|
paths: map[string]*defs.APIPath{
|
|
"mystream": {
|
|
Name: "mystream",
|
|
ConfName: "mystream",
|
|
Source: &defs.APIPathSourceOrReader{Type: "rtspSession", ID: "session123"},
|
|
Ready: true,
|
|
ReadyTime: &now,
|
|
Tracks: []string{"H264", "Opus"},
|
|
BytesReceived: 123456,
|
|
BytesSent: 789012,
|
|
Readers: []defs.APIPathSourceOrReader{
|
|
{Type: "hlsMuxer", ID: "muxer1"},
|
|
{Type: "webRTCSession", ID: "session456"},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
api := API{
|
|
Address: "localhost:9997",
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
WriteTimeout: conf.Duration(10 * time.Second),
|
|
AuthManager: test.NilAuthManager,
|
|
PathManager: pathManager,
|
|
Parent: &testParent{},
|
|
}
|
|
err := api.Initialize()
|
|
require.NoError(t, err)
|
|
defer api.Close()
|
|
|
|
tr := &http.Transport{}
|
|
defer tr.CloseIdleConnections()
|
|
hc := &http.Client{Transport: tr}
|
|
|
|
var out defs.APIPath
|
|
httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v3/paths/get/mystream", nil, &out)
|
|
|
|
require.Equal(t, "mystream", out.Name)
|
|
require.Equal(t, "mystream", out.ConfName)
|
|
require.True(t, out.Ready)
|
|
require.NotNil(t, out.Source)
|
|
require.Equal(t, "rtspSession", out.Source.Type)
|
|
require.Len(t, out.Tracks, 2)
|
|
require.Len(t, out.Readers, 2)
|
|
require.Equal(t, uint64(123456), out.BytesReceived)
|
|
require.Equal(t, uint64(789012), out.BytesSent)
|
|
}
|