github.com/qiniu/go-sdk/v7@v7.27.0/rtc/api_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package rtc
     5  
     6  import (
     7  	"encoding/json"
     8  	"fmt"
     9  	"io"
    10  	"net/http"
    11  	"os"
    12  	"strings"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/qiniu/go-sdk/v7/auth"
    17  )
    18  
    19  var manager *Manager
    20  
    21  func init() {
    22  	accessKey := os.Getenv("accessKey")
    23  	secretKey := os.Getenv("secretKey")
    24  
    25  	mac := auth.New(accessKey, secretKey)
    26  	manager = NewManager(mac)
    27  }
    28  
    29  func TestApp(t *testing.T) {
    30  	app := checkCreateApp(t)
    31  	defer func() {
    32  		checkDel(t, app.AppID)
    33  	}()
    34  	checkGetApp(t, app.AppID)
    35  	rooms := checkAllActiveRooms(t, app.AppID)
    36  	room := "roomName"
    37  	if len(rooms) > 0 {
    38  		room = string(rooms[0])
    39  	}
    40  	users := checkListUser(t, app.AppID, room)
    41  	userID := "userID"
    42  	if len(users) > 0 {
    43  		userID = users[0].UserID
    44  	}
    45  	checkKickUser(t, app.AppID, room, userID)
    46  	checkUpdate(t, app.AppID)
    47  	checkRoomToken(t, app.AppID)
    48  }
    49  
    50  func checkApp(t *testing.T, app *App) {
    51  	if app.Title != "gosdk-test" || !app.NoAutoKickUser {
    52  		t.Error(app)
    53  	}
    54  }
    55  
    56  func checkInfo(t *testing.T, err error) {
    57  	if err != nil {
    58  		t.Error(err)
    59  	}
    60  }
    61  
    62  func checkCreateApp(t *testing.T) *App {
    63  	appInitConf := AppInitConf{Hub: "hailong", Title: "gosdk-test", MaxUsers: 3, NoAutoKickUser: true}
    64  	app, err := manager.CreateApp(appInitConf)
    65  	checkApp(t, &app)
    66  	checkInfo(t, err)
    67  	return &app
    68  }
    69  
    70  func checkGetApp(t *testing.T, appID string) {
    71  	app, err := manager.GetApp(appID)
    72  	checkApp(t, &app)
    73  	checkInfo(t, err)
    74  }
    75  
    76  func checkUpdate(t *testing.T, appID string) {
    77  	appInfo := AppUpdateInfo{}
    78  	mergePublishRtmp := MergePublishRtmpInfo{}
    79  	mergePublishRtmp.Enable = &(&struct{ x bool }{true}).x
    80  
    81  	AudioOnly := true
    82  	mergePublishRtmp.AudioOnly = &AudioOnly
    83  	StreamTitle := "ddddddddd"
    84  	mergePublishRtmp.StreamTitle = &StreamTitle
    85  
    86  	appInfo.NoAutoKickUser = &(&struct{ x bool }{false}).x
    87  	appInfo.MergePublishRtmp = &mergePublishRtmp
    88  
    89  	m := struct2JsonMap(appInfo)
    90  	// should be nil , not ""
    91  	if m["Title"] != nil {
    92  		t.Errorf("m[\"Title\"] should be nil, but %v. and m is %v\n", m["Title"], m)
    93  	}
    94  
    95  	app, err := manager.UpdateApp(appID, appInfo)
    96  	checkInfo(t, err)
    97  	if app.MaxUsers != 3 || app.NoAutoKickUser || !app.MergePublishRtmp.AudioOnly || app.MergePublishRtmp.StreamTitle != StreamTitle || app.MergePublishRtmp.URL != "" {
    98  		t.Error(app)
    99  	}
   100  
   101  	appInfo = AppUpdateInfo{}
   102  	appInfo.MaxUsers = &(&struct{ x int }{4}).x
   103  	app, err = manager.UpdateApp(appID, appInfo)
   104  	checkInfo(t, err)
   105  	if app.MaxUsers != 4 || app.NoAutoKickUser || !app.MergePublishRtmp.AudioOnly || app.MergePublishRtmp.StreamTitle != StreamTitle || app.MergePublishRtmp.URL != "" {
   106  		t.Error(app)
   107  	}
   108  }
   109  
   110  func checkAllActiveRooms(t *testing.T, appID string) []RoomName {
   111  	rooms, err := manager.ListAllActiveRooms(appID, "l")
   112  	checkInfo(t, err)
   113  	t.Logf("Rooms: %v", rooms[:min(10, len(rooms))])
   114  	return rooms
   115  }
   116  
   117  func checkListUser(t *testing.T, appID, roomName string) []User {
   118  	users, err := manager.ListUser(appID, roomName)
   119  	checkInfo(t, err)
   120  	t.Logf("Users: %v", users[:min(10, len(users))])
   121  	return users
   122  }
   123  
   124  func min(a, b int) int {
   125  	if a > b {
   126  		return b
   127  	}
   128  	return a
   129  }
   130  
   131  func checkKickUser(t *testing.T, appID, roomName, userID string) {
   132  	err := manager.KickUser(appID, roomName, userID)
   133  	// 615   {"error":"room not active"}
   134  	if err != nil {
   135  		t.Log(err)
   136  		if strings.Index(err.Error(), "room not active") == -1 {
   137  			t.Error(err)
   138  		}
   139  	}
   140  }
   141  
   142  func checkRoomToken(t *testing.T, appID string) {
   143  	roomName := "sdhfuexx"
   144  	userID := "ghjkdfie"
   145  	token, err := manager.GetRoomToken(RoomAccess{AppID: appID, RoomName: roomName, UserID: userID, ExpireAt: time.Now().Unix() + 3600})
   146  	url := fmt.Sprintf("https://rtc.qiniuapi.com/v3/apps/%v/rooms/%v/auth?user=%v&token=%v", appID, roomName, userID, token)
   147  	req, err := http.NewRequest("GET", url, strings.NewReader(""))
   148  	res, err := http.DefaultClient.Do(req)
   149  	if err != nil {
   150  		t.Error(err)
   151  	}
   152  	if res.ContentLength > 2*1024*1024 {
   153  		t.Errorf("response is too long. url: %v, response headers: %v", req.URL.RequestURI(), res.Header)
   154  	}
   155  	resData, err := io.ReadAll(res.Body)
   156  	ret := string(resData)
   157  	if res.StatusCode != 200 || strings.Index(ret, "accessToken") == -1 {
   158  		t.Errorf("result is wrong: %v", ret)
   159  	}
   160  }
   161  
   162  func checkDel(t *testing.T, appID string) {
   163  	err := manager.DeleteApp(appID)
   164  	if err != nil {
   165  		t.Error(err)
   166  	}
   167  }
   168  
   169  func struct2JsonMap(obj interface{}) map[string]interface{} {
   170  	data := make(map[string]interface{})
   171  	j, _ := json.Marshal(obj)
   172  	json.Unmarshal(j, &data)
   173  	return data
   174  }