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 }