http/http_test.go

117 lines
2.6 KiB
Go
Raw Normal View History

2024-10-15 10:45:04 +08:00
package http_test
import (
"strings"
"testing"
"time"
"apigo.cc/gojs"
_ "apigo.cc/gojs/console"
_ "apigo.cc/gojs/http"
"github.com/gorilla/websocket"
"github.com/ssgo/s"
"github.com/ssgo/u"
)
var as *s.AsyncServer
func TestStart(t *testing.T) {
s.Config.Listen = "18001,http|18002,h2c"
s.Register(0, "/echo", func(in struct{ Name string }) string {
return in.Name
}, "")
s.RegisterWebsocket(0, "/ws", nil, func(conn *websocket.Conn) {
typ, data, _ := conn.ReadMessage()
conn.WriteMessage(typ, data)
typ, data, _ = conn.ReadMessage()
conn.WriteMessage(typ, data)
typ, data, _ = conn.ReadMessage()
conn.WriteMessage(typ, data)
conn.Close()
}, nil, nil, nil, "")
as = s.AsyncStart()
gojs.ExportForDev()
}
func TestHttp(t *testing.T) {
vm := gojs.New()
vm.RunCode("import http from 'apigo.cc/gojs/http'")
testIsOk(t, vm, `http.get('http://127.0.0.1:18001/echo?name=Tom').string()`, "Tom")
testIsOk(t, vm, `http.post('http://127.0.0.1:18001/echo',{name:'Tom'}).string()`, "Tom")
vm.RunCode("let h2 = http.newH2C()")
testIsOk(t, vm, `h2.get('http://127.0.0.1:18002/echo?name=Tom').string()`, "Tom")
testIsOk(t, vm, `h2.post('http://127.0.0.1:18002/echo',{name:'Tom'}).string()`, "Tom")
}
func TestWS(t *testing.T) {
vm := gojs.New()
var err error
var r any
_, err = vm.RunFile("ws_test.js")
if err != nil {
t.Fatal("ws error", err)
}
r, err = vm.RunCode("testSync()")
if err != nil {
t.Fatal("ws error", err)
}
if r != true {
t.Fatal("ws check failed", r)
}
// 异步测试
_, err = vm.RunCode("testAsync()")
if err != nil {
t.Fatal("ws error", err)
}
time.Sleep(time.Millisecond * 100)
// 检查结果
r, err = vm.RunCode("asyncResult")
if err != nil {
t.Fatal("ws error", err)
}
testHas(t, u.String(r), "Tom1", "Tom2", "Tom3")
// 重连后再次测试
r, err = vm.RunCode("testAsync2()")
if err != nil {
t.Fatal("ws error", err)
}
time.Sleep(time.Millisecond * 100)
r, err = vm.RunCode("asyncResult")
if err != nil {
t.Fatal("ws error", err)
}
testHas(t, u.String(r), "Tom1", "Tom2", "Tom3", "Tom4", "Tom5", "Tom6")
// 主动关闭连接
_, err = vm.RunCode("closeAsync()")
if err != nil {
t.Fatal("ws error", err)
}
}
func TestStop(t *testing.T) {
as.Stop()
}
func testHas(t *testing.T, r string, checks ...string) {
for _, check := range checks {
if !strings.Contains(r, check) {
t.Fatal("not exists", r, check)
}
}
}
func testIsOk(t *testing.T, vm *gojs.Runtime, code string, check string) {
r, err := vm.RunCode(code)
if err != nil {
t.Fatal(code, err)
} else if r != check {
t.Fatal(code, r, check)
}
}