diff --git a/tests_with_gitaly/comparison.py b/tests_with_gitaly/comparison.py index bd9e9d777e70fc6442ab07b717848d2f17f0ef26_dGVzdHNfd2l0aF9naXRhbHkvY29tcGFyaXNvbi5weQ==..42fb2ee5dc24abad47bf9a89ac767b5a41273c15_dGVzdHNfd2l0aF9naXRhbHkvY29tcGFyaXNvbi5weQ== 100644 --- a/tests_with_gitaly/comparison.py +++ b/tests_with_gitaly/comparison.py @@ -97,7 +97,57 @@ ) -class RpcHelper: +class BaseRpcHelper: + """Common helper for all comparisons. + + Will handle comparison between Gitaly and (HGitaly or HGitaly) as well + as comparison beween HGitaly and RHGitaly, or whatever comes next. + """ + + def __init__(self, comparison, stub_cls, method_name, request_cls, + repository_arg=True, + request_defaults=None, + feature_flags=(), + streaming=False): + self.comparison = comparison + self.stub_cls = stub_cls + self.method_name = method_name + self.request_cls = request_cls + self.streaming = streaming + self.repository_arg = repository_arg + + self.request_defaults = request_defaults + self.streaming = streaming + self.feature_flags = list(feature_flags) + + self.init_stubs() + + def init_stubs(self): + """To be provided by subclasses.""" + raise NotImplementedError # pragma no cover + + def grpc_metadata(self): + return feature.as_grpc_metadata(self.feature_flags) + + def rpc(self, backend, **kwargs): + if self.repository_arg: + kwargs.setdefault('repository', self.comparison.gitaly_repo) + request = self.request_cls(**kwargs) + meth = getattr(self.stubs[backend], self.method_name) + metadata = self.grpc_metadata() + if self.streaming: + return [resp for resp in meth(request, metadata=metadata)] + + return meth(request, metadata=metadata) + + def apply_request_defaults(self, kwargs): + defaults = self.request_defaults + if defaults is not None: + for k, v in defaults.items(): + kwargs.setdefault(k, v) + + +class RpcHelper(BaseRpcHelper): """Encapsulates a comparison fixture with call and compare helpers. As Mercurial and Git responses are expected to differ (commit hashes and @@ -113,7 +163,5 @@ def __init__(self, comparison, stub_cls, method_name, request_cls, hg_server='hgitaly', - repository_arg=True, - request_defaults=None, request_sha_attrs=(), response_sha_attrs=(), @@ -118,7 +166,6 @@ request_sha_attrs=(), response_sha_attrs=(), - feature_flags=(), normalizer=None, error_details_normalizer=None, chunked_fields_remover=None, chunks_concatenator=None, @@ -121,13 +168,28 @@ normalizer=None, error_details_normalizer=None, chunked_fields_remover=None, chunks_concatenator=None, - streaming=False): - self.comparison = comparison - if hg_server == 'rhgitaly': + **kwargs, + ): + self.hg_server = hg_server + super(RpcHelper, self).__init__( + comparison, stub_cls, method_name, request_cls, + **kwargs + ) + self.request_sha_attrs = request_sha_attrs + self.response_sha_attrs = response_sha_attrs + self.normalizer = normalizer + self.error_details_normalizer = error_details_normalizer + self.chunked_fields_remover = chunked_fields_remover + self.chunks_concatenator = chunks_concatenator + + def init_stubs(self): + comparison, stub_cls = self.comparison, self.stub_cls + + if self.hg_server == 'rhgitaly': hg_channel = comparison.rhgitaly_channel else: hg_channel = comparison.hgitaly_channel self.stubs = dict(git=stub_cls(comparison.gitaly_channel), hg=stub_cls(hg_channel)) @@ -128,39 +190,9 @@ hg_channel = comparison.rhgitaly_channel else: hg_channel = comparison.hgitaly_channel self.stubs = dict(git=stub_cls(comparison.gitaly_channel), hg=stub_cls(hg_channel)) - self.stub_cls = stub_cls - self.method_name = method_name - self.request_cls = request_cls - self.streaming = streaming - self.repository_arg = repository_arg - - self.request_defaults = request_defaults - self.request_sha_attrs = request_sha_attrs - self.response_sha_attrs = response_sha_attrs - self.streaming = streaming - self.feature_flags = list(feature_flags) - self.normalizer = normalizer - self.error_details_normalizer = error_details_normalizer - self.chunked_fields_remover = chunked_fields_remover - self.chunks_concatenator = chunks_concatenator - - def grpc_metadata(self): - return feature.as_grpc_metadata(self.feature_flags) - - def rpc(self, vcs, **kwargs): - if self.repository_arg: - kwargs.setdefault('repository', self.comparison.gitaly_repo) - request = self.request_cls(**kwargs) - meth = getattr(self.stubs[vcs], self.method_name) - metadata = self.grpc_metadata() - if self.streaming: - return [resp for resp in meth(request, metadata=metadata)] - - return meth(request, metadata=metadata) - def hg2git(self, hg_sha): """Convert a Mercurial hex SHA to its counterpart SHA in Git repo. @@ -240,12 +272,6 @@ else: setattr(obj, obj_attr, self.hg2git(value)) - def apply_request_defaults(self, kwargs): - defaults = self.request_defaults - if defaults is not None: - for k, v in defaults.items(): - kwargs.setdefault(k, v) - def call_backends(self, **hg_kwargs): """Call Gitaly and HGitaly with uniform request kwargs.