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',