github.com/livekit/protocol@v1.39.3/ingress/validation_test.go (about) 1 // Copyright 2023 LiveKit, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package ingress 16 17 import ( 18 "testing" 19 20 "github.com/livekit/protocol/livekit" 21 "github.com/stretchr/testify/require" 22 ) 23 24 func TestValidate(t *testing.T) { 25 info := &livekit.IngressInfo{} 26 27 err := Validate(info) 28 require.Error(t, err) 29 30 info.StreamKey = "stream_key" 31 err = Validate(info) 32 require.Error(t, err) 33 34 info.RoomName = "room_name" 35 err = Validate(info) 36 require.Error(t, err) 37 38 info.ParticipantIdentity = "participant_identity" 39 err = Validate(info) 40 require.NoError(t, err) 41 42 // make sure video parameters are validated. Full validation logic tested in the next test 43 info.Video = &livekit.IngressVideoOptions{} 44 err = Validate(info) 45 require.NoError(t, err) 46 47 info.Video.Source = livekit.TrackSource_MICROPHONE 48 err = Validate(info) 49 require.Error(t, err) 50 51 info.Video.Source = livekit.TrackSource_CAMERA 52 53 // make sure audio parameters are validated. Full validation logic tested in the next test 54 info.Audio = &livekit.IngressAudioOptions{} 55 err = Validate(info) 56 require.NoError(t, err) 57 58 info.Audio.Source = livekit.TrackSource_CAMERA 59 err = Validate(info) 60 require.Error(t, err) 61 62 info.Audio.Source = livekit.TrackSource_SCREEN_SHARE_AUDIO 63 err = Validate(info) 64 require.NoError(t, err) 65 } 66 67 func TestValidateBypassTranscoding(t *testing.T) { 68 info := &livekit.IngressInfo{} 69 70 err := ValidateBypassTranscoding(info) 71 require.NoError(t, err) 72 73 info.BypassTranscoding = true 74 err = ValidateBypassTranscoding(info) 75 require.Error(t, err) 76 77 info.InputType = livekit.IngressInput_WHIP_INPUT 78 err = ValidateBypassTranscoding(info) 79 require.NoError(t, err) 80 81 info.Video = &livekit.IngressVideoOptions{} 82 err = ValidateBypassTranscoding(info) 83 require.NoError(t, err) 84 85 info.Video.EncodingOptions = &livekit.IngressVideoOptions_Preset{} 86 err = ValidateBypassTranscoding(info) 87 require.Error(t, err) 88 89 info.Video = nil 90 91 info.Audio = &livekit.IngressAudioOptions{} 92 err = ValidateBypassTranscoding(info) 93 require.NoError(t, err) 94 95 info.Audio.EncodingOptions = &livekit.IngressAudioOptions_Options{ 96 Options: &livekit.IngressAudioEncodingOptions{}, 97 } 98 err = ValidateBypassTranscoding(info) 99 require.Error(t, err) 100 101 } 102 103 func TestValidateEnableTranscoding(t *testing.T) { 104 info := &livekit.IngressInfo{} 105 T := true 106 F := false 107 108 err := ValidateEnableTranscoding(info) 109 require.NoError(t, err) 110 111 info.InputType = livekit.IngressInput_WHIP_INPUT 112 err = ValidateEnableTranscoding(info) 113 require.NoError(t, err) 114 115 info.Audio = &livekit.IngressAudioOptions{} 116 info.Audio.EncodingOptions = &livekit.IngressAudioOptions_Options{} 117 err = ValidateEnableTranscoding(info) 118 require.Error(t, err) 119 120 info.Audio.EncodingOptions = nil 121 122 info.EnableTranscoding = &T 123 err = ValidateEnableTranscoding(info) 124 require.NoError(t, err) 125 126 info.EnableTranscoding = &F 127 err = ValidateEnableTranscoding(info) 128 require.NoError(t, err) 129 130 info.Video = &livekit.IngressVideoOptions{} 131 info.Video.EncodingOptions = &livekit.IngressVideoOptions_Preset{} 132 err = ValidateEnableTranscoding(info) 133 require.Error(t, err) 134 135 info.Video.EncodingOptions = nil 136 137 info.InputType = livekit.IngressInput_RTMP_INPUT 138 err = ValidateEnableTranscoding(info) 139 require.Error(t, err) 140 141 info.EnableTranscoding = &T 142 err = ValidateEnableTranscoding(info) 143 require.NoError(t, err) 144 } 145 146 func TestValidateEnabled(t *testing.T) { 147 info := &livekit.IngressInfo{ 148 StreamKey: "sk", 149 RoomName: "room_name", 150 ParticipantIdentity: "id", 151 } 152 T := true 153 F := false 154 155 err := Validate(info) 156 require.NoError(t, err) 157 158 info.Enabled = &T 159 err = Validate(info) 160 require.NoError(t, err) 161 162 info.Enabled = &F 163 err = Validate(info) 164 require.NoError(t, err) 165 166 info.InputType = livekit.IngressInput_URL_INPUT 167 info.Url = "url" 168 info.Enabled = nil 169 err = Validate(info) 170 require.NoError(t, err) 171 172 info.Enabled = &T 173 err = Validate(info) 174 require.NoError(t, err) 175 176 info.Enabled = &F 177 err = Validate(info) 178 require.Error(t, err) 179 } 180 181 func TestValidateVideoOptionsConsistency(t *testing.T) { 182 video := &livekit.IngressVideoOptions{} 183 err := ValidateVideoOptionsConsistency(video) 184 require.NoError(t, err) 185 186 video.Source = livekit.TrackSource_MICROPHONE 187 err = ValidateVideoOptionsConsistency(video) 188 require.Error(t, err) 189 190 video.Source = livekit.TrackSource_CAMERA 191 video.EncodingOptions = &livekit.IngressVideoOptions_Preset{ 192 Preset: livekit.IngressVideoEncodingPreset(42), 193 } 194 err = ValidateVideoOptionsConsistency(video) 195 require.Error(t, err) 196 197 video.EncodingOptions = &livekit.IngressVideoOptions_Preset{ 198 Preset: livekit.IngressVideoEncodingPreset_H264_1080P_30FPS_1_LAYER, 199 } 200 err = ValidateVideoOptionsConsistency(video) 201 require.NoError(t, err) 202 203 video.EncodingOptions = &livekit.IngressVideoOptions_Options{ 204 Options: &livekit.IngressVideoEncodingOptions{ 205 VideoCodec: livekit.VideoCodec_H264_HIGH, 206 }, 207 } 208 err = ValidateVideoOptionsConsistency(video) 209 require.Error(t, err) 210 211 video.EncodingOptions = &livekit.IngressVideoOptions_Options{ 212 Options: &livekit.IngressVideoEncodingOptions{ 213 VideoCodec: livekit.VideoCodec_DEFAULT_VC, 214 }, 215 } 216 err = ValidateVideoOptionsConsistency(video) 217 require.NoError(t, err) 218 219 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 220 &livekit.VideoLayer{}, 221 } 222 err = ValidateVideoOptionsConsistency(video) 223 require.Error(t, err) 224 225 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 226 &livekit.VideoLayer{ 227 Width: 640, 228 Height: 480, 229 }, 230 } 231 err = ValidateVideoOptionsConsistency(video) 232 require.NoError(t, err) 233 234 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 235 &livekit.VideoLayer{ 236 Width: 641, 237 Height: 480, 238 }, 239 } 240 err = ValidateVideoOptionsConsistency(video) 241 require.Error(t, err) 242 243 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 244 &livekit.VideoLayer{ 245 Width: 640, 246 Height: 480, 247 Quality: livekit.VideoQuality_HIGH, 248 }, 249 &livekit.VideoLayer{ 250 Width: 640, 251 Height: 480, 252 Quality: livekit.VideoQuality_LOW, 253 }, 254 } 255 err = ValidateVideoOptionsConsistency(video) 256 require.NoError(t, err) 257 258 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 259 &livekit.VideoLayer{ 260 Width: 640, 261 Height: 480, 262 Quality: livekit.VideoQuality_HIGH, 263 }, 264 &livekit.VideoLayer{ 265 Width: 1280, 266 Height: 720, 267 Quality: livekit.VideoQuality_HIGH, 268 }, 269 } 270 err = ValidateVideoOptionsConsistency(video) 271 require.Error(t, err) 272 273 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 274 &livekit.VideoLayer{ 275 Width: 640, 276 Height: 480, 277 Quality: livekit.VideoQuality_HIGH, 278 }, 279 &livekit.VideoLayer{ 280 Width: 1280, 281 Height: 720, 282 Quality: livekit.VideoQuality_LOW, 283 }, 284 } 285 err = ValidateVideoOptionsConsistency(video) 286 require.Error(t, err) 287 288 video.EncodingOptions.(*livekit.IngressVideoOptions_Options).Options.Layers = []*livekit.VideoLayer{ 289 &livekit.VideoLayer{ 290 Width: 640, 291 Height: 480, 292 Quality: livekit.VideoQuality_LOW, 293 }, 294 &livekit.VideoLayer{ 295 Width: 1280, 296 Height: 720, 297 Quality: livekit.VideoQuality_HIGH, 298 }, 299 } 300 301 err = ValidateVideoOptionsConsistency(video) 302 require.NoError(t, err) 303 } 304 305 func TestValidateAudioOptionsConsistency(t *testing.T) { 306 audio := &livekit.IngressAudioOptions{} 307 err := ValidateAudioOptionsConsistency(audio) 308 require.NoError(t, err) 309 310 audio.Source = livekit.TrackSource_CAMERA 311 err = ValidateAudioOptionsConsistency(audio) 312 require.Error(t, err) 313 314 audio.Source = livekit.TrackSource_SCREEN_SHARE_AUDIO 315 audio.EncodingOptions = &livekit.IngressAudioOptions_Preset{ 316 Preset: livekit.IngressAudioEncodingPreset(42), 317 } 318 err = ValidateAudioOptionsConsistency(audio) 319 require.Error(t, err) 320 321 audio.EncodingOptions = &livekit.IngressAudioOptions_Preset{ 322 Preset: livekit.IngressAudioEncodingPreset_OPUS_MONO_64KBS, 323 } 324 err = ValidateAudioOptionsConsistency(audio) 325 require.NoError(t, err) 326 327 audio.EncodingOptions = &livekit.IngressAudioOptions_Options{ 328 Options: &livekit.IngressAudioEncodingOptions{ 329 AudioCodec: livekit.AudioCodec_AAC, 330 }, 331 } 332 err = ValidateAudioOptionsConsistency(audio) 333 require.Error(t, err) 334 335 audio.EncodingOptions = &livekit.IngressAudioOptions_Options{ 336 Options: &livekit.IngressAudioEncodingOptions{ 337 AudioCodec: livekit.AudioCodec_OPUS, 338 Channels: 3, 339 }, 340 } 341 err = ValidateAudioOptionsConsistency(audio) 342 require.Error(t, err) 343 344 audio.EncodingOptions.(*livekit.IngressAudioOptions_Options).Options.Channels = 2 345 err = ValidateAudioOptionsConsistency(audio) 346 require.NoError(t, err) 347 }