1+ import json
12import os
3+ import shutil
4+ import tarfile
5+ import urllib .request
6+ from pathlib import Path
27
38import nox
49
@@ -23,6 +28,12 @@ def python_client(session, driver_version):
2328
2429
2530JDBC_DRIVER = ["0.4.0" , "main" ]
31+ GO_DRIVER_PINNED = ["v0.9.1" ]
32+ GO_DRIVER = ["main" , "latest" , * GO_DRIVER_PINNED ]
33+ GO_CLIENT_CACHE_DIR = Path (__file__ ).resolve ().parent / "cache"
34+ GO_CLIENT_ARCHIVE_ROOT = "https://github.com/databendlabs/databend-go/archive/refs"
35+ GO_CLIENT_LATEST_RELEASE_URL = "https://github.com/databendlabs/databend-go/releases/latest"
36+ GO_CLIENT_SKIP_UP = "DATABEND_GO_SKIP_UP"
2637
2738
2839@nox .session
@@ -58,20 +69,102 @@ def run_jdbc_test(session, driver_version, main_version):
5869 )
5970
6071
72+ def resolve_go_source_ref (source_ref ):
73+ if source_ref != "latest" :
74+ return source_ref
75+
76+ request = urllib .request .Request (
77+ GO_CLIENT_LATEST_RELEASE_URL ,
78+ headers = {"User-Agent" : "databend-nox-go-client" },
79+ )
80+ with urllib .request .urlopen (request ) as response :
81+ latest_url = response .geturl ().rstrip ("/" )
82+
83+ latest_tag = latest_url .rsplit ("/" , 1 )[- 1 ]
84+ if not latest_tag .startswith ("v" ):
85+ raise RuntimeError (
86+ f"unexpected databend-go latest release redirect: { latest_url } "
87+ )
88+
89+ return latest_tag
90+
91+
92+ def get_go_archive_url (resolved_ref ):
93+ archive_type = "tags" if resolved_ref .startswith ("v" ) else "heads"
94+ return f"{ GO_CLIENT_ARCHIVE_ROOT } /{ archive_type } /{ resolved_ref } .tar.gz"
95+
96+
97+ def get_go_driver_env (resolved_ref ):
98+ env = {}
99+ if resolved_ref != "main" :
100+ env ["DATABEND_GO_VERSION" ] = resolved_ref
101+
102+ if os .environ .get (GO_CLIENT_SKIP_UP ):
103+ env [GO_CLIENT_SKIP_UP ] = os .environ [GO_CLIENT_SKIP_UP ]
104+
105+ return env
106+
107+
108+ def prepare_go_client_source (source_ref ):
109+ resolved_ref = resolve_go_source_ref (source_ref )
110+ cache_key = source_ref .replace ("/" , "-" )
111+ source_dir = GO_CLIENT_CACHE_DIR / f"databend-go-{ cache_key } "
112+ marker_path = source_dir / ".databend-ref.json"
113+ makefile_path = source_dir / "tests" / "Makefile"
114+
115+ if source_ref != "main" and marker_path .exists () and makefile_path .exists ():
116+ marker = json .loads (marker_path .read_text ())
117+ if marker .get ("resolved_ref" ) == resolved_ref :
118+ return source_dir , resolved_ref
119+
120+ shutil .rmtree (source_dir , ignore_errors = True )
121+ source_dir .mkdir (parents = True , exist_ok = True )
122+
123+ request = urllib .request .Request (
124+ get_go_archive_url (resolved_ref ),
125+ headers = {"User-Agent" : "databend-nox-go-client" },
126+ )
127+ with urllib .request .urlopen (request ) as response :
128+ with tarfile .open (fileobj = response , mode = "r|gz" ) as archive :
129+ archive .extractall (source_dir )
130+
131+ extracted_dirs = [path for path in source_dir .iterdir () if path .is_dir ()]
132+ if len (extracted_dirs ) != 1 :
133+ raise RuntimeError (
134+ f"expected one extracted databend-go root for { resolved_ref } , got { len (extracted_dirs )} "
135+ )
136+
137+ extracted_root = extracted_dirs [0 ]
138+ for child in extracted_root .iterdir ():
139+ shutil .move (str (child ), source_dir / child .name )
140+ extracted_root .rmdir ()
141+
142+ if not makefile_path .exists ():
143+ raise RuntimeError (
144+ f"missing databend-go tests/Makefile after extracting { resolved_ref } "
145+ )
146+
147+ marker_path .write_text (json .dumps ({"resolved_ref" : resolved_ref }) + "\n " )
148+ return source_dir , resolved_ref
149+
150+
61151
62152
63153@nox .session
64- @nox .parametrize ("driver_version" , ["v100.0.0" ])
65- def go_client (session , driver_version ):
66- env = {"DATABEND_GO_VERSION" : driver_version }
67- test_dir = f"cache/databend-go/tests"
68- with session .cd (test_dir ):
69- if os .path .exists ("go.mod" ):
70- os .remove ("go.mod" )
71- if driver_version == "v100.0.0" :
72- session .run ("make" , "-o" , "up" , "integration" , external = True , env = env )
73- else :
74- session .run ("make" , "-o" , "up" , "compat" , external = True , env = env )
154+ @nox .parametrize ("source_ref" , GO_DRIVER )
155+ def go_client (session , source_ref ):
156+ source_dir , resolved_ref = prepare_go_client_source (source_ref )
157+ env = get_go_driver_env (resolved_ref )
158+ test_dir = source_dir / "tests"
159+ skip_up = os .environ .get (GO_CLIENT_SKIP_UP )
160+ make_args = ["make" ]
161+ if skip_up :
162+ make_args .extend (["-o" , "up" ])
163+ make_args .append ("integration" )
164+
165+ session .log (f"running databend-go integration tests from { resolved_ref } " )
166+ with session .chdir (str (test_dir )):
167+ session .run (* make_args , external = True , env = env )
75168
76169# test API with requests directly.
77170# some of the tests will fail with cluster behind nginx.
0 commit comments