diff --git a/cmd/cli/commands/rtc.go b/cmd/cli/commands/rtc.go index e4a7da84b..c14321278 100644 --- a/cmd/cli/commands/rtc.go +++ b/cmd/cli/commands/rtc.go @@ -29,7 +29,7 @@ var ( rtcHostFlag, &cli.StringFlag{ Name: "token", - Usage: "room token, not required in dev mode", + Usage: "access token, not required in dev mode", }, &cli.StringFlag{ Name: "name", diff --git a/pkg/rtc/errors.go b/pkg/rtc/errors.go index 17ddec651..4a9778b41 100644 --- a/pkg/rtc/errors.go +++ b/pkg/rtc/errors.go @@ -4,6 +4,7 @@ import "errors" var ( ErrRoomIdMissing = errors.New("room is not passed in") + ErrInvalidRoomName = errors.New("room must have a unique name") ErrRoomNotFound = errors.New("requested room does not exist") ErrPermissionDenied = errors.New("no permissions to access the room") ) diff --git a/pkg/rtc/manager.go b/pkg/rtc/manager.go index be31e274c..e603252a8 100644 --- a/pkg/rtc/manager.go +++ b/pkg/rtc/manager.go @@ -65,13 +65,21 @@ func (m *RoomManager) GetRoomWithConstraint(idOrName string, onlyName string) (* return rm, nil } -func (m *RoomManager) CreateRoom(req *livekit.CreateRoomRequest) (r *Room, err error) { - r = NewRoomForRequest(req, &m.config) +func (m *RoomManager) CreateRoom(req *livekit.CreateRoomRequest) (*Room, error) { + if req.Name == "" { + return nil, ErrInvalidRoomName + } + r := NewRoomForRequest(req, &m.config) m.roomLock.Lock() defer m.roomLock.Unlock() + + if m.roomsByName[req.Name] != nil { + return nil, ErrInvalidRoomName + } + m.rooms[r.Sid] = r m.roomsByName[r.Name] = r - return + return r, nil } func (m *RoomManager) DeleteRoom(idOrName string) error { diff --git a/pkg/rtc/manager_test.go b/pkg/rtc/manager_test.go index b7ca6c9e7..a60bb9f96 100644 --- a/pkg/rtc/manager_test.go +++ b/pkg/rtc/manager_test.go @@ -1 +1,83 @@ package rtc_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/livekit/livekit-server/pkg/config" + "github.com/livekit/livekit-server/pkg/rtc" + "github.com/livekit/livekit-server/proto/livekit" +) + +func TestRoomManager_CreateRoom(t *testing.T) { + man := newRoomManager(t) + + t.Run("creation and duplicates", func(t *testing.T) { + r := &livekit.CreateRoomRequest{Name: "basic"} + rm, err := man.CreateRoom(r) + assert.NoError(t, err) + assert.NotNil(t, rm) + + rm, err = man.CreateRoom(r) + assert.Equal(t, rtc.ErrInvalidRoomName, err) + assert.Nil(t, rm) + }) + + t.Run("name is required", func(t *testing.T) { + _, err := man.CreateRoom(&livekit.CreateRoomRequest{}) + assert.Equal(t, rtc.ErrInvalidRoomName, err) + }) +} + +func TestRoomManager_GetRoomByName(t *testing.T) { + man := newRoomManager(t) + _, err := man.CreateRoom(&livekit.CreateRoomRequest{ + Name: "hello", + }) + assert.NoError(t, err) + + rm := man.GetRoom("hello") + assert.Equal(t, "hello", rm.Name) +} + +func TestRoomManager_GetRoomWithConstraint(t *testing.T) { + man := newRoomManager(t) + rm, _ := man.CreateRoom(&livekit.CreateRoomRequest{ + Name: "hello", + }) + + t.Run("no constraint, get by id", func(t *testing.T) { + r, err := man.GetRoomWithConstraint(rm.Sid, "") + assert.NoError(t, err) + assert.Equal(t, r, rm) + }) + + t.Run("no constraint, get by name", func(t *testing.T) { + r, err := man.GetRoomWithConstraint(rm.Name, "") + assert.NoError(t, err) + assert.Equal(t, r, rm) + }) + + t.Run("no constraint, room doesn't exist", func(t *testing.T) { + _, err := man.GetRoomWithConstraint("wtf", "") + assert.Equal(t, rtc.ErrRoomNotFound, err) + }) + + t.Run("constraint, no name", func(t *testing.T) { + r, err := man.GetRoomWithConstraint("", rm.Name) + assert.NoError(t, err) + assert.Equal(t, r, rm) + }) + + t.Run("constraint does not match name", func(t *testing.T) { + _, err := man.GetRoomWithConstraint(rm.Name, "anotherroom") + assert.Equal(t, rtc.ErrPermissionDenied, err) + }) +} + +func newRoomManager(t *testing.T) *rtc.RoomManager { + man, err := rtc.NewRoomManager(config.RTCConfig{}, "1.2.3.4") + assert.NoError(t, err) + return man +}