You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kvrocks.apache.org by ti...@apache.org on 2022/09/07 14:07:40 UTC
[incubator-kvrocks] branch unstable updated: ci: add golangci_lint (#834)
This is an automated email from the ASF dual-hosted git repository.
tison pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/incubator-kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new 5bcbc74 ci: add golangci_lint (#834)
5bcbc74 is described below
commit 5bcbc7445f5523cd434814f37948519eaf1e901e
Author: tison <wa...@gmail.com>
AuthorDate: Wed Sep 7 22:07:34 2022 +0800
ci: add golangci_lint (#834)
Signed-off-by: tison <wa...@gmail.com>
---
.github/workflows/kvrocks.yaml | 5 ++++
tests/gocase/.golangci.yml | 42 +++++++++++++++++++++++++++
tests/gocase/unit/protocol/protocol_test.go | 22 +++++++-------
tests/gocase/unit/protocol/regression_test.go | 2 +-
tests/gocase/util/server.go | 4 +--
tests/gocase/util/tcp_client.go | 2 +-
x.py | 38 ++++++++++++++++++------
7 files changed, 91 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/kvrocks.yaml b/.github/workflows/kvrocks.yaml
index c18619f..d29667c 100644
--- a/.github/workflows/kvrocks.yaml
+++ b/.github/workflows/kvrocks.yaml
@@ -50,12 +50,17 @@ jobs:
uses: actions/setup-python@v2
with:
python-version: 3.x
+ - name: Setup Go
+ uses: actions/setup-go@v3
+ with:
+ go-version: 1.19.x
- name: Setup dependencies
run: pip install cpplint==1.5.0
- name: Lint and check code
run: |
./x.py check cpplint
./x.py check cppcheck
+ ./x.py check golangci-lint
build-and-test:
name: Build and test
diff --git a/tests/gocase/.golangci.yml b/tests/gocase/.golangci.yml
new file mode 100644
index 0000000..23fc6e6
--- /dev/null
+++ b/tests/gocase/.golangci.yml
@@ -0,0 +1,42 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+run:
+ timeout: 10m
+linters:
+ disable-all: true
+ enable:
+ - asciicheck
+ - bodyclose
+ - deadcode
+ - durationcheck
+ - errcheck
+ - exportloopref
+ - gofmt
+ - goimports
+ - gosimple
+ - ineffassign
+ - makezero
+ - prealloc
+ - predeclared
+ - rowserrcheck
+ - staticcheck
+ - structcheck
+ - stylecheck
+ - typecheck
+ - unused
+ - varcheck
diff --git a/tests/gocase/unit/protocol/protocol_test.go b/tests/gocase/unit/protocol/protocol_test.go
index 85a320d..ddc0fdb 100644
--- a/tests/gocase/unit/protocol/protocol_test.go
+++ b/tests/gocase/unit/protocol/protocol_test.go
@@ -32,7 +32,7 @@ func TestProtocolNetwork(t *testing.T) {
defer srv.Close()
t.Run("handle an empty array", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("\r\n"))
require.NoError(t, c.Write("*1\r\n$4\r\nPING\r\n"))
@@ -42,7 +42,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("out of range multibulk length", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*20000000\r\n"))
r, err := c.ReadLine()
@@ -51,7 +51,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("wrong multibulk payload header", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*3\r\n$3\r\nSET\r\n$1\r\nx\r\nfoo\r\n"))
r, err := c.ReadLine()
@@ -60,7 +60,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("negative multibulk payload length", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*3\r\n$3\r\nSET\r\n$1\r\nx\r\n$-10\r\n"))
r, err := c.ReadLine()
@@ -69,7 +69,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("out of range multibulk payload length", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*3\r\n$3\r\nSET\r\n$1\r\nx\r\n$2000000000\r\n"))
r, err := c.ReadLine()
@@ -78,7 +78,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("non-number multibulk payload length", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*3\r\n$3\r\nSET\r\n$1\r\nx\r\n$foo\r\n"))
r, err := c.ReadLine()
@@ -87,7 +87,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("multibulk request not followed by bulk arguments", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*1\r\nfoo\r\n"))
r, err := c.ReadLine()
@@ -103,7 +103,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("empty array parsed", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*-1\r\n*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$3\r\nval\r\n"))
r, err := c.ReadLine()
@@ -112,7 +112,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("allow only LF protocol separator", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("set foo 123\n"))
r, err := c.ReadLine()
@@ -121,7 +121,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("mix LF/CRLF protocol separator", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*-1\r\nset foo 123\nget foo\r\n*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$3\r\nval\r\n"))
for _, res := range []string{"+OK", "$3", "123", "+OK"} {
@@ -132,7 +132,7 @@ func TestProtocolNetwork(t *testing.T) {
})
t.Run("invalid LF in multi bulk protocol", func(t *testing.T) {
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
require.NoError(t, c.Write("*3\n$3\r\nset\r\n$3\r\nkey\r\n$3\r\nval\r\n"))
r, err := c.ReadLine()
diff --git a/tests/gocase/unit/protocol/regression_test.go b/tests/gocase/unit/protocol/regression_test.go
index 3d17e51..e5bb779 100644
--- a/tests/gocase/unit/protocol/regression_test.go
+++ b/tests/gocase/unit/protocol/regression_test.go
@@ -36,7 +36,7 @@ func TestRegression(t *testing.T) {
rdb := srv.NewClient()
defer func() { require.NoError(t, rdb.Close()) }()
- c := srv.NewTcpClient()
+ c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
proto := "*3\r\n$5\r\nBLPOP\r\n$6\r\nhandle\r\n$1\r\n0\r\n"
diff --git a/tests/gocase/util/server.go b/tests/gocase/util/server.go
index af131eb..ebe41cf 100644
--- a/tests/gocase/util/server.go
+++ b/tests/gocase/util/server.go
@@ -45,10 +45,10 @@ func (s *KvrocksServer) NewClient() *redis.Client {
return redis.NewClient(&redis.Options{Addr: s.addr.String()})
}
-func (s *KvrocksServer) NewTcpClient() *tcpClient {
+func (s *KvrocksServer) NewTCPClient() *tcpClient {
c, err := net.Dial(s.addr.Network(), s.addr.String())
require.NoError(s.t, err)
- return newTcpClient(c)
+ return newTCPClient(c)
}
func (s *KvrocksServer) Close() {
diff --git a/tests/gocase/util/tcp_client.go b/tests/gocase/util/tcp_client.go
index 0226dc7..c166f3d 100644
--- a/tests/gocase/util/tcp_client.go
+++ b/tests/gocase/util/tcp_client.go
@@ -31,7 +31,7 @@ type tcpClient struct {
w *bufio.Writer
}
-func newTcpClient(c net.Conn) *tcpClient {
+func newTCPClient(c net.Conn) *tcpClient {
return &tcpClient{
c: c,
r: bufio.NewReader(c),
diff --git a/x.py b/x.py
index d272818..d4e620d 100755
--- a/x.py
+++ b/x.py
@@ -56,7 +56,7 @@ def run(*args: str, msg: Optional[str]=None, verbose: bool=False, **kwargs: Any)
sys.stdout.flush()
if verbose:
print(f"$ {' '.join(args)}")
-
+
p = Popen(args, **kwargs)
code = p.wait()
if code != 0:
@@ -64,7 +64,7 @@ def run(*args: str, msg: Optional[str]=None, verbose: bool=False, **kwargs: Any)
if msg:
err += f"error message: {msg}\n"
raise RuntimeError(err)
-
+
return p
def run_pipe(*args: str, msg: Optional[str]=None, verbose: bool=False, **kwargs: Any) -> TextIO:
@@ -138,14 +138,25 @@ def cppcheck() -> None:
run(command, *options, *sources, verbose=True)
+def golangci_lint() -> None:
+ go = find_command('go', msg='go is required for testing')
+ gopath = run_pipe(go, 'env', 'GOPATH').read().strip()
+ bindir = Path(gopath).absolute() / 'bin'
+ binpath = bindir / 'golangci-lint'
+ if not binpath.exists():
+ output = run_pipe('curl', '-sfL', 'https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh', verbose=True)
+ run('sh', '-s', '--', '-b', str(bindir), 'v1.49.0', verbose=True, stdin=output)
+ basedir = Path(__file__).parent.absolute() / 'tests' / 'gocase'
+ run(str(binpath), 'run', '-v', './...', cwd=str(basedir), verbose=True)
+
def write_version(release_version: str) -> str:
version = release_version.strip()
if SEMVER_REGEX.match(version) is None:
raise RuntimeError(f"Kvrocks version should follow semver spec, got: {version}")
-
+
with open('VERSION', 'w+') as f:
f.write(version)
-
+
return version
def package_source(release_version: str) -> None:
@@ -219,21 +230,23 @@ def test_tcl(dir: str, rest: List[str]) -> None:
check_version(tcl_version, TCL_REQUIRE_VERSION, "tclsh")
tcldir = Path(__file__).parent.absolute() / 'tests' / 'tcl'
- run(tclsh, 'tests/test_helper.tcl', '--server-path', str(Path(dir).absolute() / 'kvrocks'), *rest,
+ run(tclsh, 'tests/test_helper.tcl', '--server-path', str(Path(dir).absolute() / 'kvrocks'), *rest,
cwd=str(tcldir), verbose=True
)
def test_go(dir: str, rest: List[str]) -> None:
go = find_command('go', msg='go is required for testing')
- godir = Path(__file__).parent.absolute() / 'tests' / 'gocase'
+ binpath = Path(dir).absolute() / 'kvrocks'
+ basedir = Path(__file__).parent.absolute() / 'tests' / 'gocase'
+ worksapce = basedir / 'workspace'
goenv = {
- 'KVROCKS_BIN_PATH': str(Path(dir).absolute() / 'kvrocks'),
- 'GO_CASE_WORKSPACE': str(godir / 'workspace'),
+ 'KVROCKS_BIN_PATH': str(binpath),
+ 'GO_CASE_WORKSPACE': str(worksapce),
}
goenv = {**os.environ, **goenv}
run(go, 'test', '-v', '-bench=.', './...', *rest,
- env=goenv, cwd=str(godir), verbose=True
+ env=goenv, cwd=str(basedir), verbose=True
)
if __name__ == '__main__':
@@ -260,6 +273,13 @@ if __name__ == '__main__':
formatter_class=ArgumentDefaultsHelpFormatter,
)
parser_check_cppcheck.set_defaults(func=cppcheck)
+ parser_check_golangci_lint = parser_check_subparsers.add_parser(
+ 'golangci-lint',
+ description="Check code with golangci-lint (https://golangci-lint.run/)",
+ help="Check code with golangci-lint (https://golangci-lint.run/)",
+ formatter_class=ArgumentDefaultsHelpFormatter,
+ )
+ parser_check_golangci_lint.set_defaults(func=golangci_lint)
parser_build = subparsers.add_parser(
'build',