From e36b9574037d3ddea06a65351b57840fe05bc4a8 Mon Sep 17 00:00:00 2001 From: Keuin Date: Fri, 16 Sep 2022 21:14:50 +0800 Subject: Add test for core bilibili API wrappers. --- bilibili/danmaku_server_info_test.go | 39 ++++++++++++++++++++++++++++++ bilibili/play_url_test.go | 35 +++++++++++++++++++++++++++ bilibili/room_profile_test.go | 36 ++++++++++++++++++++++++++++ bilibili/room_status_test.go | 35 +++++++++++++++++++++++++++ bilibili/streaming_test.go | 44 ++++++++++++++++++++++++++++++++++ common/testutil.go | 46 ++++++++++++++++++++++++++++++++++++ 6 files changed, 235 insertions(+) create mode 100644 bilibili/danmaku_server_info_test.go create mode 100644 bilibili/play_url_test.go create mode 100644 bilibili/room_profile_test.go create mode 100644 bilibili/room_status_test.go create mode 100644 bilibili/streaming_test.go create mode 100644 common/testutil.go diff --git a/bilibili/danmaku_server_info_test.go b/bilibili/danmaku_server_info_test.go new file mode 100644 index 0000000..3166304 --- /dev/null +++ b/bilibili/danmaku_server_info_test.go @@ -0,0 +1,39 @@ +package bilibili + +import ( + "github.com/keuin/slbr/common" + "github.com/keuin/slbr/logging" + "log" + "testing" +) + +func TestBilibili_GetDanmakuServerInfo(t *testing.T) { + // get an online live room for testing + liveList, err := common.GetLiveListForGuestUser() + if err != nil { + t.Fatalf("Cannot get live list for testing: %v", err) + } + lives := liveList.Data.Data + if len(lives) <= 0 { + t.Fatalf("No available live for guest user") + } + roomId := common.RoomId(lives[0].Roomid) + + logger := log.Default() + bi := NewBilibili(logging.NewWrappedLogger(logger, "test-logger")) + dmInfo, err := bi.GetDanmakuServerInfo(roomId) + if err != nil { + t.Fatalf("GetDanmakuServerInfo: %v", err) + } + if dmInfo.Code != 0 || + dmInfo.Message != "0" || + len(dmInfo.Data.Token) < 10 || + len(dmInfo.Data.HostList) <= 0 { + t.Fatalf("Invalid GetDanmakuServerInfo response: %v", dmInfo) + } + for _, h := range dmInfo.Data.HostList { + if h.Port == 0 || h.WssPort == 0 || h.WsPort == 0 || h.Host == "" { + t.Fatalf("Invalid host: %v", h) + } + } +} diff --git a/bilibili/play_url_test.go b/bilibili/play_url_test.go new file mode 100644 index 0000000..7ec17ee --- /dev/null +++ b/bilibili/play_url_test.go @@ -0,0 +1,35 @@ +package bilibili + +import ( + "github.com/keuin/slbr/common" + "github.com/keuin/slbr/logging" + "log" + "testing" +) + +func TestBilibili_GetStreamingInfo(t *testing.T) { + // get an online live room for testing + liveList, err := common.GetLiveListForGuestUser() + if err != nil { + t.Fatalf("cannot get live list for testing: %v", err) + } + lives := liveList.Data.Data + if len(lives) <= 0 { + t.Fatalf("no live for guest available") + } + roomId := common.RoomId(lives[0].Roomid) + + logger := log.Default() + bi := NewBilibili(logging.NewWrappedLogger(logger, "test-logger")) + info, err := bi.GetStreamingInfo(roomId) + if err != nil { + t.Fatalf("GetStreamingInfo: %v", err) + } + if info.Code != 0 || + info.Message != "0" || + len(info.Data.URLs) <= 0 || + len(info.Data.AcceptQuality) <= 0 || + len(info.Data.QualityDescription) <= 0 { + t.Fatalf("Invalid GetStreamingInfo response: %v", info) + } +} diff --git a/bilibili/room_profile_test.go b/bilibili/room_profile_test.go new file mode 100644 index 0000000..0abd8dd --- /dev/null +++ b/bilibili/room_profile_test.go @@ -0,0 +1,36 @@ +package bilibili + +import ( + "github.com/keuin/slbr/common" + "github.com/keuin/slbr/logging" + "log" + "testing" +) + +func TestBilibili_GetRoomProfile(t *testing.T) { + // get an online live room for testing + liveList, err := common.GetLiveListForGuestUser() + if err != nil { + t.Fatalf("cannot get live list for testing: %v", err) + } + lives := liveList.Data.Data + if len(lives) <= 0 { + t.Fatalf("no live for guest available") + } + roomId := common.RoomId(lives[0].Roomid) + + logger := log.Default() + bi := NewBilibili(logging.NewWrappedLogger(logger, "test-logger")) + resp, err := bi.GetRoomProfile(roomId) + if err != nil { + t.Fatalf("GetRoomProfile: %v", err) + } + if resp.Code != 0 || + resp.Message != "ok" || + resp.Data.UID <= 0 || + resp.Data.RoomID != int(roomId) || + resp.Data.LiveStatus != int(Streaming) || + resp.Data.Title == "" { + t.Fatalf("Invalid GetRoomProfile response: %v", resp) + } +} diff --git a/bilibili/room_status_test.go b/bilibili/room_status_test.go new file mode 100644 index 0000000..f97cf51 --- /dev/null +++ b/bilibili/room_status_test.go @@ -0,0 +1,35 @@ +package bilibili + +import ( + "github.com/keuin/slbr/common" + "github.com/keuin/slbr/logging" + "log" + "testing" +) + +func TestBilibili_GetRoomPlayInfo(t *testing.T) { + // get an online live room for testing + liveList, err := common.GetLiveListForGuestUser() + if err != nil { + t.Fatalf("cannot get live list for testing: %v", err) + } + lives := liveList.Data.Data + if len(lives) <= 0 { + t.Fatalf("no live for guest available") + } + roomId := common.RoomId(lives[0].Roomid) + + logger := log.Default() + bi := NewBilibili(logging.NewWrappedLogger(logger, "test-logger")) + resp, err := bi.GetRoomPlayInfo(roomId) + if err != nil { + t.Fatalf("GetRoomPlayInfo: %v", err) + } + if resp.Code != 0 || + resp.Message != "0" || + resp.Data.UID <= 0 || + resp.Data.RoomID != uint64(roomId) || + resp.Data.LiveStatus != Streaming { + t.Fatalf("Invalid GetRoomPlayInfo response: %v", resp) + } +} diff --git a/bilibili/streaming_test.go b/bilibili/streaming_test.go new file mode 100644 index 0000000..ef438db --- /dev/null +++ b/bilibili/streaming_test.go @@ -0,0 +1,44 @@ +package bilibili + +import ( + "context" + "errors" + "fmt" + "github.com/keuin/slbr/common" + "github.com/keuin/slbr/logging" + "log" + "os" + "testing" +) + +func TestBilibili_CopyLiveStream(t *testing.T) { + // get an online live room for testing + liveList, err := common.GetLiveListForGuestUser() + if err != nil { + t.Fatalf("cannot get live list for testing: %v", err) + } + lives := liveList.Data.Data + if len(lives) <= 0 { + t.Fatalf("no live for guest available") + } + roomId := common.RoomId(lives[0].Roomid) + + logger := log.Default() + bi := NewBilibili(logging.NewWrappedLogger(logger, "test-logger")) + + si, err := bi.GetStreamingInfo(roomId) + if err != nil { + t.Fatalf("GetStreamingInfo: %v", err) + } + + // test file open failure + testErr := fmt.Errorf("test error") + err = bi.CopyLiveStream(context.Background(), roomId, si.Data.URLs[0], func() (*os.File, error) { + return nil, testErr + }, 1048576) + if !errors.Is(err, testErr) { + t.Fatalf("Unexpected error from CopyLiveStream: %v", err) + } + + // TODO more tests +} diff --git a/common/testutil.go b/common/testutil.go new file mode 100644 index 0000000..d6c3899 --- /dev/null +++ b/common/testutil.go @@ -0,0 +1,46 @@ +package common + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +/* +Some utility function for test-purpose only. +*/ + +type LiveList struct { + Code int `json:"code"` + Message string `json:"message"` + TTL int `json:"ttl"` + Data struct { + Count int `json:"count"` + Data []struct { + Face string `json:"face"` + Link string `json:"link"` + Roomid int `json:"roomid"` + Roomname string `json:"roomname"` + Nickname string `json:"nickname"` + } `json:"data"` + } `json:"data"` +} + +func GetLiveListForGuestUser() (liveList LiveList, err error) { + url := "https://api.live.bilibili.com/xlive/web-interface/v1/index/WebGetUnLoginRecList" + resp, err := http.Get(url) + if err != nil { + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("bad http response: %v", resp.StatusCode) + return + } + b, err := io.ReadAll(resp.Body) + if err != nil { + return + } + err = json.Unmarshal(b, &liveList) + return +} -- cgit v1.2.3