11 type OssBucketLiveChannelSuite struct {
16 var _ = Suite(&OssBucketLiveChannelSuite{})
18 // SetUpSuite Run once when the suite starts running
19 func (s *OssBucketLiveChannelSuite) SetUpSuite(c *C) {
20 client, err := New(endpoint, accessID, accessKey)
24 err = s.client.CreateBucket(bucketName)
26 time.Sleep(5 * time.Second)
28 bucket, err := s.client.Bucket(bucketName)
32 testLogger.Println("test livechannel started...")
35 // TearDownSuite Run once after all tests or benchmarks
36 func (s *OssBucketLiveChannelSuite) TearDownSuite(c *C) {
39 result, err := s.bucket.ListLiveChannel(Marker(marker))
42 for _, channel := range result.LiveChannel {
43 err := s.bucket.DeleteLiveChannel(channel.Name)
47 if result.IsTruncated {
48 marker = result.NextMarker
54 testLogger.Println("test livechannel done...")
57 // SetUpTest Run before each test or benchmark starts
58 func (s *OssBucketLiveChannelSuite) SetUpTest(c *C) {
62 // TearDownTest Run after each test or benchmark runs.
63 func (s *OssBucketLiveChannelSuite) TearDownTest(c *C) {
67 // TestCreateLiveChannel
68 func (s *OssBucketLiveChannelSuite) TestCreateLiveChannel(c *C) {
69 channelName := "test-create-channel"
70 playlistName := "test-create-channel.m3u8"
72 target := LiveChannelTarget{
73 PlaylistName: playlistName,
77 config := LiveChannelConfiguration{
78 Description: "livechannel for test",
83 result, err := s.bucket.CreateLiveChannel(channelName, config)
86 playURL := getPlayURL(bucketName, channelName, playlistName)
87 publishURL := getPublishURL(bucketName, channelName)
88 c.Assert(result.PlayUrls[0], Equals, playURL)
89 c.Assert(result.PublishUrls[0], Equals, publishURL)
91 err = s.bucket.DeleteLiveChannel(channelName)
94 invalidType := RandStr(4)
95 invalidTarget := LiveChannelTarget{
96 PlaylistName: playlistName,
100 invalidConfig := LiveChannelConfiguration{
101 Description: "livechannel for test",
103 Target: invalidTarget,
106 _, err = s.bucket.CreateLiveChannel(channelName, invalidConfig)
107 c.Assert(err, NotNil)
110 // TestDeleteLiveChannel
111 func (s *OssBucketLiveChannelSuite) TestDeleteLiveChannel(c *C) {
112 channelName := "test-delete-channel"
114 target := LiveChannelTarget{
118 config := LiveChannelConfiguration{
122 _, err := s.bucket.CreateLiveChannel(channelName, config)
125 err = s.bucket.DeleteLiveChannel(channelName)
128 emptyChannelName := ""
129 err = s.bucket.DeleteLiveChannel(emptyChannelName)
130 c.Assert(err, NotNil)
132 longChannelName := RandStr(65)
133 err = s.bucket.DeleteLiveChannel(longChannelName)
134 c.Assert(err, NotNil)
136 config, err = s.bucket.GetLiveChannelInfo(channelName)
137 c.Assert(err, NotNil)
140 // TestGetLiveChannelInfo
141 func (s *OssBucketLiveChannelSuite) TestGetLiveChannelInfo(c *C) {
142 channelName := "test-get-channel-status"
144 _, err := s.bucket.GetLiveChannelInfo(channelName)
145 c.Assert(err, NotNil)
147 createCfg := LiveChannelConfiguration{
148 Target: LiveChannelTarget{
152 PlaylistName: "test-get-channel-status.m3u8",
156 _, err = s.bucket.CreateLiveChannel(channelName, createCfg)
159 getCfg, err := s.bucket.GetLiveChannelInfo(channelName)
161 c.Assert("enabled", Equals, getCfg.Status) //The default value is enabled
162 c.Assert("HLS", Equals, getCfg.Target.Type)
163 c.Assert(10, Equals, getCfg.Target.FragDuration)
164 c.Assert(4, Equals, getCfg.Target.FragCount)
165 c.Assert("test-get-channel-status.m3u8", Equals, getCfg.Target.PlaylistName)
167 err = s.bucket.DeleteLiveChannel(channelName)
171 // TestPutLiveChannelStatus
172 func (s *OssBucketLiveChannelSuite) TestPutLiveChannelStatus(c *C) {
173 channelName := "test-put-channel-status"
175 config := LiveChannelConfiguration{
177 Target: LiveChannelTarget{
182 _, err := s.bucket.CreateLiveChannel(channelName, config)
184 getCfg, err := s.bucket.GetLiveChannelInfo(channelName)
186 c.Assert("disabled", Equals, getCfg.Status)
188 err = s.bucket.PutLiveChannelStatus(channelName, "enabled")
190 getCfg, err = s.bucket.GetLiveChannelInfo(channelName)
192 c.Assert("enabled", Equals, getCfg.Status)
194 err = s.bucket.PutLiveChannelStatus(channelName, "disabled")
196 getCfg, err = s.bucket.GetLiveChannelInfo(channelName)
198 c.Assert("disabled", Equals, getCfg.Status)
200 invalidStatus := RandLowStr(9)
201 err = s.bucket.PutLiveChannelStatus(channelName, invalidStatus)
202 c.Assert(err, NotNil)
204 err = s.bucket.DeleteLiveChannel(channelName)
208 // TestGetLiveChannelHistory
209 func (s *OssBucketLiveChannelSuite) TestGetLiveChannelHistory(c *C) {
210 channelName := "test-get-channel-history"
212 _, err := s.bucket.GetLiveChannelHistory(channelName)
213 c.Assert(err, NotNil)
215 config := LiveChannelConfiguration{
216 Target: LiveChannelTarget{
221 _, err = s.bucket.CreateLiveChannel(channelName, config)
224 history, err := s.bucket.GetLiveChannelHistory(channelName)
226 c.Assert(len(history.Record), Equals, 0)
228 err = s.bucket.DeleteLiveChannel(channelName)
232 // TestGetLiveChannelStat
233 func (s *OssBucketLiveChannelSuite) TestGetLiveChannelStat(c *C) {
234 channelName := "test-get-channel-stat"
236 _, err := s.bucket.GetLiveChannelStat(channelName)
237 c.Assert(err, NotNil)
239 config := LiveChannelConfiguration{
240 Target: LiveChannelTarget{
245 _, err = s.bucket.CreateLiveChannel(channelName, config)
248 stat, err := s.bucket.GetLiveChannelStat(channelName)
250 c.Assert(stat.Status, Equals, "Idle")
252 err = s.bucket.DeleteLiveChannel(channelName)
256 // TestPostVodPlaylist
257 func (s *OssBucketLiveChannelSuite) TestPostVodPlaylist(c *C) {
258 channelName := "test-post-vod-playlist"
259 playlistName := "test-post-vod-playlist.m3u8"
261 config := LiveChannelConfiguration{
262 Target: LiveChannelTarget{
267 _, err := s.bucket.CreateLiveChannel(channelName, config)
270 endTime := time.Now().Add(-1 * time.Minute)
271 startTime := endTime.Add(-60 * time.Minute)
273 err = s.bucket.PostVodPlaylist(channelName, playlistName, startTime, endTime)
274 c.Assert(err, NotNil)
276 err = s.bucket.DeleteLiveChannel(channelName)
280 // TestPostVodPlaylist
281 func (s *OssBucketLiveChannelSuite) TestGetVodPlaylist(c *C) {
282 channelName := "test-get-vod-playlist"
284 config := LiveChannelConfiguration{
285 Target: LiveChannelTarget{
290 _, err := s.bucket.CreateLiveChannel(channelName, config)
293 endTime := time.Now().Add(-1 * time.Minute)
294 startTime := endTime.Add(-60 * time.Minute)
296 _, err = s.bucket.GetVodPlaylist(channelName, startTime, endTime)
297 c.Assert(err, NotNil)
299 err = s.bucket.DeleteLiveChannel(channelName)
303 // TestListLiveChannel
304 func (s *OssBucketLiveChannelSuite) TestListLiveChannel(c *C) {
305 result, err := s.bucket.ListLiveChannel()
307 ok := compareListResult(result, "", "", "", 100, false, 0)
308 c.Assert(ok, Equals, true)
310 prefix := "test-list-channel"
311 for i := 0; i < 200; i++ {
312 channelName := fmt.Sprintf("%s-%03d", prefix, i)
314 config := LiveChannelConfiguration{
315 Target: LiveChannelTarget{
320 _, err := s.bucket.CreateLiveChannel(channelName, config)
324 result, err = s.bucket.ListLiveChannel()
326 nextMarker := fmt.Sprintf("%s-099", prefix)
327 ok = compareListResult(result, "", "", nextMarker, 100, true, 100)
328 c.Assert(ok, Equals, true)
330 randPrefix := RandStr(5)
331 result, err = s.bucket.ListLiveChannel(Prefix(randPrefix))
333 ok = compareListResult(result, randPrefix, "", "", 100, false, 0)
334 c.Assert(ok, Equals, true)
336 marker := fmt.Sprintf("%s-100", prefix)
337 result, err = s.bucket.ListLiveChannel(Prefix(prefix), Marker(marker))
339 ok = compareListResult(result, prefix, marker, "", 100, false, 99)
340 c.Assert(ok, Equals, true)
343 result, err = s.bucket.ListLiveChannel(MaxKeys(maxKeys))
345 ok = compareListResult(result, "", "", "", maxKeys, false, 200)
348 result, err = s.bucket.ListLiveChannel(MaxKeys(invalidMaxKeys))
349 c.Assert(err, NotNil)
351 for i := 0; i < 200; i++ {
352 channelName := fmt.Sprintf("%s-%03d", prefix, i)
353 err := s.bucket.DeleteLiveChannel(channelName)
359 func (s *OssBucketLiveChannelSuite) TestSignRtmpURL(c *C) {
360 channelName := "test-sign-rtmp-url"
361 playlistName := "test-sign-rtmp-url.m3u8"
363 config := LiveChannelConfiguration{
364 Target: LiveChannelTarget{
366 PlaylistName: playlistName,
370 _, err := s.bucket.CreateLiveChannel(channelName, config)
373 expires := int64(3600)
374 signedRtmpURL, err := s.bucket.SignRtmpURL(channelName, playlistName, expires)
376 playURL := getPublishURL(s.bucket.BucketName, channelName)
377 hasPrefix := strings.HasPrefix(signedRtmpURL, playURL)
378 c.Assert(hasPrefix, Equals, true)
380 invalidExpires := int64(-1)
381 signedRtmpURL, err = s.bucket.SignRtmpURL(channelName, playlistName, invalidExpires)
382 c.Assert(err, NotNil)
384 err = s.bucket.DeleteLiveChannel(channelName)
389 // getPlayURL Get the play url of the live channel
390 func getPlayURL(bucketName, channelName, playlistName string) string {
393 if strings.Contains(endpoint, "https://") {
396 } else if strings.Contains(endpoint, "http://") {
403 return fmt.Sprintf("https://%s.%s/%s/%s", bucketName, host, channelName, playlistName)
405 return fmt.Sprintf("http://%s.%s/%s/%s", bucketName, host, channelName, playlistName)
408 // getPublistURL Get the push url of the live stream channel
409 func getPublishURL(bucketName, channelName string) string {
411 if strings.Contains(endpoint, "https://") {
413 } else if strings.Contains(endpoint, "http://") {
419 return fmt.Sprintf("rtmp://%s.%s/live/%s", bucketName, host, channelName)
422 func compareListResult(result ListLiveChannelResult, prefix, marker, nextMarker string, maxKey int, isTruncated bool, count int) bool {
423 if result.Prefix != prefix || result.Marker != marker || result.NextMarker != nextMarker || result.MaxKeys != maxKey || result.IsTruncated != isTruncated || len(result.LiveChannel) != count {