1#!/usr/bin/env python2.7 2# Copyright 2017 gRPC authors. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16# Defines languages, runtimes and releases for backward compatibility testing 17 18from collections import OrderedDict 19 20 21def get_github_repo(lang): 22 return { 23 'dart': 'https://github.com/grpc/grpc-dart.git', 24 'go': 'https://github.com/grpc/grpc-go.git', 25 'java': 'https://github.com/grpc/grpc-java.git', 26 'node': 'https://github.com/grpc/grpc-node.git', 27 # all other languages use the grpc.git repo. 28 }.get(lang, 'https://github.com/grpc/grpc.git') 29 30 31def get_release_tags(lang): 32 """Returns list of known releases for given language.""" 33 return list(LANG_RELEASE_MATRIX[lang].keys()) 34 35 36def get_runtimes_for_lang_release(lang, release): 37 """Get list of valid runtimes for given release of lang.""" 38 runtimes = list(LANG_RUNTIME_MATRIX[lang]) 39 release_info = LANG_RELEASE_MATRIX[lang].get(release) 40 if release_info and release_info.runtimes: 41 runtimes = list(release_info.runtimes) 42 return runtimes 43 44 45def should_build_docker_interop_image_from_release_tag(lang): 46 # All dockerfile definitions live in grpc/grpc repository. 47 # For language that have a separate repo, we need to use 48 # dockerfile definitions from head of grpc/grpc. 49 if lang in ['go', 'java', 'node']: 50 return False 51 return True 52 53 54# Dictionary of default runtimes per language 55LANG_RUNTIME_MATRIX = { 56 'cxx': ['cxx'], # This is actually debian8. 57 'go': ['go1.8', 'go1.11', 'go1.16'], 58 'java': ['java'], 59 'python': ['python', 'pythonasyncio'], 60 'node': ['node'], 61 'ruby': ['ruby'], 62 'php': ['php7'], 63 'csharp': ['csharp', 'csharpcoreclr'], 64} 65 66 67class ReleaseInfo: 68 """Info about a single release of a language""" 69 70 def __init__(self, patch=[], runtimes=[], testcases_file=None): 71 self.patch = patch 72 self.runtimes = runtimes 73 self.testcases_file = testcases_file 74 75 76# Dictionary of known releases for given language. 77LANG_RELEASE_MATRIX = { 78 'cxx': 79 OrderedDict([ 80 ('v1.0.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 81 ('v1.1.4', ReleaseInfo(testcases_file='cxx__v1.0.1')), 82 ('v1.2.5', ReleaseInfo(testcases_file='cxx__v1.0.1')), 83 ('v1.3.9', ReleaseInfo(testcases_file='cxx__v1.0.1')), 84 ('v1.4.2', ReleaseInfo(testcases_file='cxx__v1.0.1')), 85 ('v1.6.6', ReleaseInfo(testcases_file='cxx__v1.0.1')), 86 ('v1.7.2', ReleaseInfo(testcases_file='cxx__v1.0.1')), 87 ('v1.8.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 88 ('v1.9.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 89 ('v1.10.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 90 ('v1.11.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 91 ('v1.12.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 92 ('v1.13.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 93 ('v1.14.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 94 ('v1.15.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 95 ('v1.16.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 96 ('v1.17.1', ReleaseInfo(testcases_file='cxx__v1.0.1')), 97 ('v1.18.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 98 ('v1.19.0', ReleaseInfo(testcases_file='cxx__v1.0.1')), 99 ('v1.20.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 100 ('v1.21.4', ReleaseInfo(testcases_file='cxx__v1.31.1')), 101 ('v1.22.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 102 ('v1.22.1', ReleaseInfo(testcases_file='cxx__v1.31.1')), 103 ('v1.23.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 104 ('v1.24.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 105 ('v1.25.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 106 ('v1.26.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 107 ('v1.27.3', ReleaseInfo(testcases_file='cxx__v1.31.1')), 108 ('v1.30.0', ReleaseInfo(testcases_file='cxx__v1.31.1')), 109 ('v1.31.1', ReleaseInfo(testcases_file='cxx__v1.31.1')), 110 ('v1.32.0', ReleaseInfo()), 111 ('v1.33.2', ReleaseInfo()), 112 ('v1.34.0', ReleaseInfo()), 113 ('v1.35.0', ReleaseInfo()), 114 ('v1.36.3', ReleaseInfo()), 115 ('v1.37.0', ReleaseInfo()), 116 ]), 117 'go': 118 OrderedDict([ 119 ('v1.0.5', 120 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 121 ('v1.2.1', 122 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 123 ('v1.3.0', 124 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 125 ('v1.4.2', 126 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 127 ('v1.5.2', 128 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 129 ('v1.6.0', 130 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 131 ('v1.7.4', 132 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 133 ('v1.8.2', 134 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 135 ('v1.9.2', 136 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 137 ('v1.10.1', 138 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 139 ('v1.11.3', 140 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 141 ('v1.12.2', 142 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 143 ('v1.13.0', 144 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 145 ('v1.14.0', 146 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 147 ('v1.15.0', 148 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 149 ('v1.16.0', 150 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')), 151 ('v1.17.0', 152 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')), 153 ('v1.18.0', 154 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')), 155 ('v1.19.0', 156 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')), 157 ('v1.20.0', 158 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 159 ('v1.21.3', 160 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 161 ('v1.22.3', 162 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 163 ('v1.23.1', 164 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 165 ('v1.24.0', 166 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 167 ('v1.25.0', 168 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 169 ('v1.26.0', 170 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 171 ('v1.27.1', 172 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 173 ('v1.28.0', 174 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 175 ('v1.29.0', 176 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 177 ('v1.30.0', 178 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 179 ('v1.31.1', 180 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 181 ('v1.32.0', 182 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 183 ('v1.33.1', 184 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')), 185 ('v1.34.0', ReleaseInfo(runtimes=['go1.11'])), 186 ('v1.35.0', ReleaseInfo(runtimes=['go1.11'])), 187 ('v1.36.0', ReleaseInfo(runtimes=['go1.11'])), 188 ('v1.37.0', ReleaseInfo(runtimes=['go1.11'])), 189 # NOTE: starting from release v1.38.0, use runtimes=['go1.16'] 190 ]), 191 'java': 192 OrderedDict([ 193 ('v1.0.3', 194 ReleaseInfo(runtimes=['java_oracle8'], 195 testcases_file='java__v1.0.3')), 196 ('v1.1.2', 197 ReleaseInfo(runtimes=['java_oracle8'], 198 testcases_file='java__v1.0.3')), 199 ('v1.2.0', 200 ReleaseInfo(runtimes=['java_oracle8'], 201 testcases_file='java__v1.0.3')), 202 ('v1.3.1', 203 ReleaseInfo(runtimes=['java_oracle8'], 204 testcases_file='java__v1.0.3')), 205 ('v1.4.0', 206 ReleaseInfo(runtimes=['java_oracle8'], 207 testcases_file='java__v1.0.3')), 208 ('v1.5.0', 209 ReleaseInfo(runtimes=['java_oracle8'], 210 testcases_file='java__v1.0.3')), 211 ('v1.6.1', 212 ReleaseInfo(runtimes=['java_oracle8'], 213 testcases_file='java__v1.0.3')), 214 ('v1.7.1', ReleaseInfo(testcases_file='java__v1.0.3')), 215 ('v1.8.0', 216 ReleaseInfo(runtimes=['java_oracle8'], 217 testcases_file='java__v1.0.3')), 218 ('v1.9.1', 219 ReleaseInfo(runtimes=['java_oracle8'], 220 testcases_file='java__v1.0.3')), 221 ('v1.10.1', 222 ReleaseInfo(runtimes=['java_oracle8'], 223 testcases_file='java__v1.0.3')), 224 ('v1.11.0', 225 ReleaseInfo(runtimes=['java_oracle8'], 226 testcases_file='java__v1.0.3')), 227 ('v1.12.1', ReleaseInfo(testcases_file='java__v1.0.3')), 228 ('v1.13.2', ReleaseInfo(testcases_file='java__v1.0.3')), 229 ('v1.14.0', 230 ReleaseInfo(runtimes=['java_oracle8'], 231 testcases_file='java__v1.0.3')), 232 ('v1.15.1', ReleaseInfo(testcases_file='java__v1.0.3')), 233 ('v1.16.1', 234 ReleaseInfo(runtimes=['java_oracle8'], 235 testcases_file='java__v1.0.3')), 236 ('v1.17.2', ReleaseInfo(testcases_file='java__v1.0.3')), 237 ('v1.18.0', 238 ReleaseInfo(runtimes=['java_oracle8'], 239 testcases_file='java__v1.0.3')), 240 ('v1.19.0', 241 ReleaseInfo(runtimes=['java_oracle8'], 242 testcases_file='java__v1.0.3')), 243 ('v1.20.0', ReleaseInfo(runtimes=['java_oracle8'])), 244 ('v1.21.1', ReleaseInfo()), 245 ('v1.22.2', ReleaseInfo()), 246 ('v1.23.0', ReleaseInfo()), 247 ('v1.24.0', ReleaseInfo()), 248 ('v1.25.0', ReleaseInfo()), 249 ('v1.26.1', ReleaseInfo()), 250 ('v1.27.2', ReleaseInfo()), 251 ('v1.28.1', ReleaseInfo()), 252 ('v1.29.0', ReleaseInfo()), 253 ('v1.30.2', ReleaseInfo()), 254 ('v1.31.2', ReleaseInfo()), 255 ('v1.32.3', ReleaseInfo()), 256 ('v1.33.1', ReleaseInfo()), 257 ('v1.34.1', ReleaseInfo()), 258 ('v1.35.1', ReleaseInfo()), 259 ('v1.36.1', ReleaseInfo()), 260 ('v1.37.0', ReleaseInfo()), 261 ]), 262 'python': 263 OrderedDict([ 264 ('v1.0.x', 265 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 266 ('v1.1.4', 267 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 268 ('v1.2.5', 269 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 270 ('v1.3.9', 271 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 272 ('v1.4.2', 273 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 274 ('v1.6.6', 275 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 276 ('v1.7.2', 277 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 278 ('v1.8.1', 279 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 280 ('v1.9.1', 281 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 282 ('v1.10.1', 283 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')), 284 ('v1.11.1', 285 ReleaseInfo(runtimes=['python'], 286 testcases_file='python__v1.11.1')), 287 ('v1.12.0', 288 ReleaseInfo(runtimes=['python'], 289 testcases_file='python__v1.11.1')), 290 ('v1.13.0', 291 ReleaseInfo(runtimes=['python'], 292 testcases_file='python__v1.11.1')), 293 ('v1.14.1', 294 ReleaseInfo(runtimes=['python'], 295 testcases_file='python__v1.11.1')), 296 ('v1.15.0', 297 ReleaseInfo(runtimes=['python'], 298 testcases_file='python__v1.11.1')), 299 ('v1.16.0', 300 ReleaseInfo(runtimes=['python'], 301 testcases_file='python__v1.11.1')), 302 ('v1.17.1', 303 ReleaseInfo(runtimes=['python'], 304 testcases_file='python__v1.11.1')), 305 ('v1.18.0', ReleaseInfo(runtimes=['python'])), 306 ('v1.19.0', ReleaseInfo(runtimes=['python'])), 307 ('v1.20.0', ReleaseInfo(runtimes=['python'])), 308 ('v1.21.4', ReleaseInfo(runtimes=['python'])), 309 ('v1.22.0', ReleaseInfo(runtimes=['python'])), 310 ('v1.22.1', ReleaseInfo(runtimes=['python'])), 311 ('v1.23.0', ReleaseInfo(runtimes=['python'])), 312 ('v1.24.0', ReleaseInfo(runtimes=['python'])), 313 ('v1.25.0', ReleaseInfo(runtimes=['python'])), 314 ('v1.26.0', ReleaseInfo(runtimes=['python'])), 315 ('v1.27.3', ReleaseInfo(runtimes=['python'])), 316 ('v1.30.0', ReleaseInfo(runtimes=['python'])), 317 ('v1.31.1', ReleaseInfo(runtimes=['python'])), 318 ('v1.32.0', ReleaseInfo(runtimes=['python'])), 319 ('v1.33.2', ReleaseInfo(runtimes=['python'])), 320 ('v1.34.0', ReleaseInfo(runtimes=['python'])), 321 ('v1.35.0', ReleaseInfo(runtimes=['python'])), 322 ('v1.36.3', ReleaseInfo(runtimes=['python'])), 323 ('v1.37.0', ReleaseInfo(runtimes=['python'])), 324 ]), 325 'node': 326 OrderedDict([ 327 ('v1.0.1', ReleaseInfo(testcases_file='node__v1.0.1')), 328 ('v1.1.4', ReleaseInfo(testcases_file='node__v1.1.4')), 329 ('v1.2.5', ReleaseInfo(testcases_file='node__v1.1.4')), 330 ('v1.3.9', ReleaseInfo(testcases_file='node__v1.1.4')), 331 ('v1.4.2', ReleaseInfo(testcases_file='node__v1.1.4')), 332 ('v1.6.6', ReleaseInfo(testcases_file='node__v1.1.4')), 333 # TODO: https://github.com/grpc/grpc-node/issues/235. 334 # ('v1.7.2', ReleaseInfo()), 335 ('v1.8.4', ReleaseInfo()), 336 ('v1.9.1', ReleaseInfo()), 337 ('v1.10.0', ReleaseInfo()), 338 ('v1.11.3', ReleaseInfo()), 339 ('v1.12.4', ReleaseInfo()), 340 ]), 341 'ruby': 342 OrderedDict([ 343 ('v1.0.1', 344 ReleaseInfo(patch=[ 345 'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile', 346 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh', 347 ], 348 testcases_file='ruby__v1.0.1')), 349 ('v1.1.4', ReleaseInfo(testcases_file='ruby__v1.1.4')), 350 ('v1.2.5', ReleaseInfo(testcases_file='ruby__v1.1.4')), 351 ('v1.3.9', ReleaseInfo(testcases_file='ruby__v1.1.4')), 352 ('v1.4.2', ReleaseInfo(testcases_file='ruby__v1.1.4')), 353 ('v1.6.6', ReleaseInfo(testcases_file='ruby__v1.1.4')), 354 ('v1.7.2', ReleaseInfo(testcases_file='ruby__v1.1.4')), 355 ('v1.8.0', ReleaseInfo(testcases_file='ruby__v1.1.4')), 356 ('v1.9.1', ReleaseInfo(testcases_file='ruby__v1.1.4')), 357 ('v1.10.1', ReleaseInfo(testcases_file='ruby__v1.1.4')), 358 ('v1.11.1', ReleaseInfo(testcases_file='ruby__v1.1.4')), 359 ('v1.12.0', ReleaseInfo(testcases_file='ruby__v1.1.4')), 360 ('v1.13.0', ReleaseInfo(testcases_file='ruby__v1.1.4')), 361 ('v1.14.1', ReleaseInfo(testcases_file='ruby__v1.1.4')), 362 ('v1.15.0', ReleaseInfo(testcases_file='ruby__v1.1.4')), 363 ('v1.16.0', ReleaseInfo(testcases_file='ruby__v1.1.4')), 364 ('v1.17.1', ReleaseInfo(testcases_file='ruby__v1.1.4')), 365 ('v1.18.0', 366 ReleaseInfo(patch=[ 367 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh', 368 ])), 369 ('v1.19.0', ReleaseInfo()), 370 ('v1.20.0', ReleaseInfo()), 371 ('v1.21.4', ReleaseInfo()), 372 ('v1.22.0', ReleaseInfo()), 373 ('v1.22.1', ReleaseInfo()), 374 ('v1.23.0', ReleaseInfo()), 375 ('v1.24.0', ReleaseInfo()), 376 ('v1.25.0', ReleaseInfo()), 377 # TODO: https://github.com/grpc/grpc/issues/18262. 378 # If you are not encountering the error in above issue 379 # go ahead and upload the docker image for new releases. 380 ('v1.26.0', ReleaseInfo()), 381 ('v1.27.3', ReleaseInfo()), 382 ('v1.30.0', ReleaseInfo()), 383 ('v1.31.1', ReleaseInfo()), 384 ('v1.32.0', ReleaseInfo()), 385 ('v1.33.2', ReleaseInfo()), 386 ('v1.34.0', ReleaseInfo()), 387 ('v1.35.0', ReleaseInfo()), 388 ('v1.36.3', ReleaseInfo()), 389 ('v1.37.0', ReleaseInfo()), 390 ]), 391 'php': 392 OrderedDict([ 393 ('v1.0.1', ReleaseInfo(testcases_file='php__v1.0.1')), 394 ('v1.1.4', ReleaseInfo(testcases_file='php__v1.0.1')), 395 ('v1.2.5', ReleaseInfo(testcases_file='php__v1.0.1')), 396 ('v1.3.9', ReleaseInfo(testcases_file='php__v1.0.1')), 397 ('v1.4.2', ReleaseInfo(testcases_file='php__v1.0.1')), 398 ('v1.6.6', ReleaseInfo(testcases_file='php__v1.0.1')), 399 ('v1.7.2', ReleaseInfo(testcases_file='php__v1.0.1')), 400 ('v1.8.0', ReleaseInfo(testcases_file='php__v1.0.1')), 401 ('v1.9.1', ReleaseInfo(testcases_file='php__v1.0.1')), 402 ('v1.10.1', ReleaseInfo(testcases_file='php__v1.0.1')), 403 ('v1.11.1', ReleaseInfo(testcases_file='php__v1.0.1')), 404 ('v1.12.0', ReleaseInfo(testcases_file='php__v1.0.1')), 405 ('v1.13.0', ReleaseInfo(testcases_file='php__v1.0.1')), 406 ('v1.14.1', ReleaseInfo(testcases_file='php__v1.0.1')), 407 ('v1.15.0', ReleaseInfo(testcases_file='php__v1.0.1')), 408 ('v1.16.0', ReleaseInfo(testcases_file='php__v1.0.1')), 409 ('v1.17.1', ReleaseInfo(testcases_file='php__v1.0.1')), 410 ('v1.18.0', ReleaseInfo()), 411 # v1.19 and v1.20 were deliberately omitted here because of an issue. 412 # See https://github.com/grpc/grpc/issues/18264 413 ('v1.21.4', ReleaseInfo()), 414 ('v1.22.0', ReleaseInfo()), 415 ('v1.22.1', ReleaseInfo()), 416 ('v1.23.0', ReleaseInfo()), 417 ('v1.24.0', ReleaseInfo()), 418 ('v1.25.0', ReleaseInfo()), 419 ('v1.26.0', ReleaseInfo()), 420 ('v1.27.3', ReleaseInfo()), 421 ('v1.30.0', ReleaseInfo()), 422 ('v1.31.1', ReleaseInfo()), 423 ('v1.32.0', ReleaseInfo()), 424 ('v1.33.2', ReleaseInfo()), 425 ('v1.34.0', ReleaseInfo()), 426 ('v1.35.0', ReleaseInfo()), 427 ('v1.36.3', ReleaseInfo()), 428 ('v1.37.0', ReleaseInfo()), 429 ]), 430 'csharp': 431 OrderedDict([ 432 ('v1.0.1', 433 ReleaseInfo(patch=[ 434 'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile', 435 'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile', 436 ], 437 testcases_file='csharp__v1.1.4')), 438 ('v1.1.4', ReleaseInfo(testcases_file='csharp__v1.1.4')), 439 ('v1.2.5', ReleaseInfo(testcases_file='csharp__v1.1.4')), 440 ('v1.3.9', ReleaseInfo(testcases_file='csharp__v1.3.9')), 441 ('v1.4.2', ReleaseInfo(testcases_file='csharp__v1.3.9')), 442 ('v1.6.6', ReleaseInfo(testcases_file='csharp__v1.3.9')), 443 ('v1.7.2', ReleaseInfo(testcases_file='csharp__v1.3.9')), 444 ('v1.8.0', ReleaseInfo(testcases_file='csharp__v1.3.9')), 445 ('v1.9.1', ReleaseInfo(testcases_file='csharp__v1.3.9')), 446 ('v1.10.1', ReleaseInfo(testcases_file='csharp__v1.3.9')), 447 ('v1.11.1', ReleaseInfo(testcases_file='csharp__v1.3.9')), 448 ('v1.12.0', ReleaseInfo(testcases_file='csharp__v1.3.9')), 449 ('v1.13.0', ReleaseInfo(testcases_file='csharp__v1.3.9')), 450 ('v1.14.1', ReleaseInfo(testcases_file='csharp__v1.3.9')), 451 ('v1.15.0', ReleaseInfo(testcases_file='csharp__v1.3.9')), 452 ('v1.16.0', ReleaseInfo(testcases_file='csharp__v1.3.9')), 453 ('v1.17.1', ReleaseInfo(testcases_file='csharp__v1.3.9')), 454 ('v1.18.0', ReleaseInfo(testcases_file='csharp__v1.18.0')), 455 ('v1.19.0', ReleaseInfo(testcases_file='csharp__v1.18.0')), 456 ('v1.20.0', ReleaseInfo()), 457 ('v1.21.4', ReleaseInfo()), 458 ('v1.22.0', ReleaseInfo()), 459 ('v1.22.1', ReleaseInfo()), 460 ('v1.23.0', ReleaseInfo()), 461 ('v1.24.0', ReleaseInfo()), 462 ('v1.25.0', ReleaseInfo()), 463 ('v1.26.0', ReleaseInfo()), 464 ('v1.27.3', ReleaseInfo()), 465 ('v1.30.0', ReleaseInfo()), 466 ('v1.31.1', ReleaseInfo()), 467 ('v1.32.0', ReleaseInfo()), 468 ('v1.33.2', ReleaseInfo()), 469 ('v1.34.0', ReleaseInfo()), 470 ('v1.35.0', ReleaseInfo()), 471 ('v1.36.3', ReleaseInfo()), 472 ('v1.37.0', ReleaseInfo()), 473 ]), 474} 475