lxzan / gws

simple, fast, reliable websocket server & client, supports running over tcp/kcp/unix domain socket. keywords: ws, proxy, chat, go, golang...
https://pkg.go.dev/github.com/lxzan/gws
Apache License 2.0
1.36k stars 87 forks source link

add autobahn and golangci-lint github action #16

Closed lesismal closed 1 year ago

lesismal commented 1 year ago

autobahn这个action是可以了: https://github.com/lxzan/gws/actions/runs/4900030304/jobs/8750397895

刚好弄gws这个也发现nbio那个也是没有输出报告,但是因为没有error所以action里的执行状态竟然是成功的。。。 刚好整理了这一波回头我把nbio的autobahn也更新下

lint那个告警比较多,太琐碎了,我就不去挨个改了,等你有空了看看要不要改,多数是返回值没有校验的问题,比如 WriteAsync(...),_ = WriteAsync(...) 这种忽略返回值应该就可以了,但是这不严谨,本来就是应该校验的,昨天我没细看test失败原因,现在想起来、可能就是因为昨天我修复这些lint时加了不少这种返回值err判断、不为nil时就Fatal/panic了所以test没有通过。 你早点研究下看看哪个goland插件好用,我用vscode这种代码规范直接就有提示的,比如这种可以把 _ 省掉: image

lxzan commented 1 year ago

dev分支我已经格式化好import并提交了. golint还是算了吧, 检查得太细容易误报, 虽然for里面可以省略一个参数但是我习惯加个下划线, 省略的话我会疑惑args是key还是value.

lesismal commented 1 year ago

golint还是算了吧, 检查得太细容易误报

但这样你可能会错过真正的报错。误报肯定是因为我们自己写的测试用例有问题,比如某个模拟测试就是应该返回err,那就应该判断err不为nil或者必须为指定的err才算成功

而且不只是test文件,确实还有一些其他的可以更规范的,这种对实际运行都没什么影响,但如果能更简洁点更好,比如: image image

虽然for里面可以省略一个参数但是我习惯加个下划线, 省略的话我会疑惑args是key还是value

顺序是先key后value,如果只写一个那肯定是第一个参数key

lesismal commented 1 year ago

搞lint确实很烦,但至少nbio里确实给我提示了很多次真正的问题。虽然烦,但其实主要是搞这一轮,一轮搞定,以后就不怎么需要再改,每次提交自动跑就省心了

lxzan commented 1 year ago

OK, 晚点我去合并

lxzan commented 1 year ago

golangci-lint 一大堆误报 😂

image
lesismal commented 1 year ago

你用的什么版本golangci-lint,我这没这种undefined的误报。

couldn't import unicode/utf8 这种 import 我好像只在有种情况下遇到过类似的:在go mod的对应的带版本号的源码目录里,比如 gopath/pkg/mod/github.com/lesismal/nbio@v1.3.12 我直接在这里面修改代码,因为mod已经自己管理了版本对应的文件依赖相关信息,这时候如果import新的就会报这种错,其他时候还没遇到过import标准库都有问题的

会不会是你用的版本问题

lxzan commented 1 year ago

golangci-lint has version 1.52.2 built with go1.20.2 from da04413 on 2023-03-23T16:18:48Z

brew 装的

lesismal commented 1 year ago

奇怪了,我的也是这个版本,但是你是mac我是linux

golangci-lint has version 1.52.2 built with go1.20.2 from da04413a on 2023-03-25T18:11:28Z

我这里就没你那些奇怪的误报:

client_test.go:14:11: Error return value is not checked (errcheck)
    NewClient(new(BuiltinEventHandler), nil)
             ^
client_test.go:20:12: Error return value is not checked (errcheck)
        NewClient(new(BuiltinEventHandler), option)
                 ^
client_test.go:28:12: Error return value is not checked (errcheck)
        NewClient(new(BuiltinEventHandler), option)
                 ^
client_test.go:69:12: Error return value of `srv.Read` is not checked (errcheck)
            srv.Read(buf)
                    ^
client_test.go:70:13: Error return value of `srv.Write` is not checked (errcheck)
            srv.Write([]byte(text))
                     ^
client_test.go:103:13: Error return value of `srv.Read` is not checked (errcheck)
                srv.Read(buf)
                        ^
client_test.go:104:14: Error return value of `srv.Write` is not checked (errcheck)
                srv.Write([]byte(text))
                         ^
client_test.go:131:13: Error return value of `srv.Read` is not checked (errcheck)
                srv.Read(buf)
                        ^
client_test.go:132:14: Error return value of `srv.Write` is not checked (errcheck)
                srv.Write([]byte(text))
                         ^
reader_test.go:44:20: Error return value of `client.WriteAsync` is not checked (errcheck)
        client.WriteAsync(OpcodeText, message)
                         ^
reader_test.go:150:21: Error return value of `server.WriteAsync` is not checked (errcheck)
            server.WriteAsync(Opcode(item.Opcode), testCloneBytes(payload))
                             ^
task_test.go:65:21: Error return value of `server.WriteAsync` is not checked (errcheck)
            server.WriteAsync(OpcodeText, message)
                             ^
task_test.go:97:22: Error return value of `server.WriteAsync` is not checked (errcheck)
                server.WriteAsync(OpcodeText, message)
                                 ^
task_test.go:136:20: Error return value of `socket.WritePong` is not checked (errcheck)
            socket.WritePong(nil)
                            ^
task_test.go:152:19: Error return value of `client.WritePing` is not checked (errcheck)
        client.WritePing(nil)
                        ^
task_test.go:153:21: Error return value of `client.WriteString` is not checked (errcheck)
        client.WriteString("hello")
                          ^
task_test.go:158:33: Error return value of `client.conn.Write` is not checked (errcheck)
            go func() { client.conn.Write(fh[:n]) }()
                                         ^
task_test.go:193:22: Error return value of `server.WriteMessage` is not checked (errcheck)
        server.WriteMessage(OpcodeText, message)
                           ^
task_test.go:214:9: Error return value of `q.Push` is not checked (errcheck)
        q.Push(func() {
              ^
task_test.go:255:21: Error return value of `wsConn.WriteAsync` is not checked (errcheck)
            wsConn.WriteAsync(OpcodeBinary, []byte{0})
                             ^
upgrader_test.go:225:16: Error return value of `server.Run` is not checked (errcheck)
        go server.Run(addr)
                     ^
upgrader_test.go:235:19: Error return value of `server.RunTLS` is not checked (errcheck)
        go server.RunTLS(addr, "", "")
                        ^
upgrader_test.go:246:16: Error return value of `server.Run` is not checked (errcheck)
        go server.Run(addr)
                     ^
upgrader_test.go:250:15: Error return value of `client.Write` is not checked (errcheck)
        client.Write([]byte(payload))
                    ^
upgrader_test.go:262:16: Error return value of `server.Run` is not checked (errcheck)
        go server.Run(addr)
                     ^
upgrader_test.go:266:15: Error return value of `client.Write` is not checked (errcheck)
        client.Write([]byte(payload))
                    ^
websocket_test.go:74:11: Error return value of `fw.Write` is not checked (errcheck)
        fw.Write(s)
                ^
websocket_test.go:84:10: Error return value of `fw.Write` is not checked (errcheck)
    fw.Write(s)
            ^
websocket_test.go:93:28: Error return value of `(compress/flate.Resetter).Reset` is not checked (errcheck)
        fr.(flate.Resetter).Reset(r, nil)
                                 ^
websocket_test.go:95:10: Error return value of `io.Copy` is not checked (errcheck)
        io.Copy(result, fr)
               ^
websocket_test.go:138:20: Error return value of `socket.SetDeadline` is not checked (errcheck)
    socket.SetDeadline(time.Time{})
                      ^
websocket_test.go:139:24: Error return value of `socket.SetReadDeadline` is not checked (errcheck)
    socket.SetReadDeadline(time.Time{})
                          ^
websocket_test.go:140:25: Error return value of `socket.SetWriteDeadline` is not checked (errcheck)
    socket.SetWriteDeadline(time.Time{})
                           ^
writer_test.go:138:21: Error return value of `server.WriteMessage` is not checked (errcheck)
    server.WriteMessage(OpcodeText, nil)
                       ^
writer_test.go:139:21: Error return value of `server.WriteMessage` is not checked (errcheck)
    server.WriteMessage(OpcodeText, []byte("hello"))
                       ^
writer_test.go:163:18: Error return value of `json.Unmarshal` is not checked (errcheck)
            json.Unmarshal(message.Bytes(), m)
                          ^
writer_test.go:180:19: Error return value of `client.WriteAny` is not checked (errcheck)
            client.WriteAny(JsonCodec, OpcodeText, m)
                           ^
writer_test.go:200:18: Error return value of `json.Unmarshal` is not checked (errcheck)
            json.Unmarshal(message.Bytes(), m)
                          ^
writer_test.go:217:19: Error return value of `client.WriteAny` is not checked (errcheck)
            client.WriteAny(JsonCodec, OpcodeText, m)
                           ^
websocket_test.go:27:27: func `(*webSocketMocker).reset` is unused (unused)
func (c *webSocketMocker) reset(socket *Conn, reader *bytes.Buffer, writer *bytes.Buffer) {
                          ^
reader.go:59:13: S1028: should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...)) (gosimple)
        var err = errors.New(fmt.Sprintf("unexpected opcode: %d", opcode))
                  ^
compress.go:97:9: S1005: unnecessary assignment to the blank identifier (gosimple)
    for i, _ := range c.decompressors {
           ^
session_storage.go:125:9: S1005: unnecessary assignment to the blank identifier (gosimple)
    for i, _ := range cm.buckets {
           ^
updrader.go:52:9: S1005: unnecessary assignment to the blank identifier (gosimple)
    for k, _ := range responseHeader {
           ^
session_storage.go:124:83: S1019: should use make([]*bucket[K, V], segments) instead (gosimple)
    var cm = &ConcurrentMap[K, V]{segments: segments, buckets: make([]*bucket[K, V], segments, segments)}
                                                                                     ^
internal/random.go:31:23: S1019: should use make([]byte, n) instead (gosimple)
    var b = make([]byte, n, n)
                         ^
internal/utils_test.go:149:26: S1019: should use make([]byte, 4) instead (gosimple)
        var key = make([]byte, 4, 4)
                               ^
websocket_test.go:153:2: S1023: redundant `return` statement (gosimple)
    return
    ^
internal/utils.go:68:35: unsafeptr: possible misuse of reflect.SliceHeader (govet)
    return *(*[]byte)(unsafe.Pointer(&bh))
                                     ^
client.go:49:6: ineffectual assignment to host (ineffassign)
    var host = ""
        ^
conn.go:133:6: ineffectual assignment to realCode (ineffassign)
    var realCode = internal.CloseNormalClosure.Uint16()
        ^
protocol.go:151:6: ineffectual assignment to payloadLength (ineffassign)
    var payloadLength = 0
        ^
internal/utils.go:187:9: SA6005: should use strings.EqualFold instead (staticcheck)
    return strings.ToLower(a) == strings.ToLower(b)