google-gax 0.8.4 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/google/gax.rb +1 -0
- data/lib/google/gax/credentials.rb +150 -0
- data/lib/google/gax/grpc.rb +28 -10
- data/lib/google/gax/util.rb +7 -0
- data/lib/google/gax/version.rb +1 -1
- data/spec/google/gax/credentials_spec.rb +108 -0
- data/spec/google/gax/grpc_spec.rb +117 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 798b058e269c1439eae63e4902b7558b5be005c0
|
4
|
+
data.tar.gz: 3ee51d01d9addb3d2edb034efb196478fcf0c4ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84f4d99c7830db006033237c1f92f3de3b7d8dc4a43e4357b182f0cfabc52df76e6c7d3f0863ce6b89307221c31c3a50cf39573d116e8b4e78d28e42e4a11fb3
|
7
|
+
data.tar.gz: 95ab0e0670ba6eeb51cc6a2a98ba93f4beda3246be5ac43a9e6b3b344aedb9a369d6d01ccb32710f56ac34797a1f22d2d7ecb28f9beb221753f2af8d636c3835
|
data/lib/google/gax.rb
CHANGED
@@ -0,0 +1,150 @@
|
|
1
|
+
# Copyright 2017, Google Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are
|
6
|
+
# met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright
|
9
|
+
# notice, this list of conditions and the following disclaimer.
|
10
|
+
# * Redistributions in binary form must reproduce the above
|
11
|
+
# copyright notice, this list of conditions and the following disclaimer
|
12
|
+
# in the documentation and/or other materials provided with the
|
13
|
+
# distribution.
|
14
|
+
# * Neither the name of Google Inc. nor the names of its
|
15
|
+
# contributors may be used to endorse or promote products derived from
|
16
|
+
# this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
require 'forwardable'
|
31
|
+
require 'googleauth'
|
32
|
+
require 'json'
|
33
|
+
require 'signet/oauth_2/client'
|
34
|
+
|
35
|
+
module Google
|
36
|
+
module Gax
|
37
|
+
# @private
|
38
|
+
# Represents the OAuth 2.0 signing logic.
|
39
|
+
# This class is intended to be inherited by API-specific classes
|
40
|
+
# which overrides the SCOPE constant.
|
41
|
+
class Credentials
|
42
|
+
TOKEN_CREDENTIAL_URI = 'https://accounts.google.com/o/oauth2/token'.freeze
|
43
|
+
AUDIENCE = 'https://accounts.google.com/o/oauth2/token'.freeze
|
44
|
+
SCOPE = [].freeze
|
45
|
+
PATH_ENV_VARS = [].freeze
|
46
|
+
JSON_ENV_VARS = [].freeze
|
47
|
+
DEFAULT_PATHS = [].freeze
|
48
|
+
|
49
|
+
attr_accessor :client
|
50
|
+
|
51
|
+
##
|
52
|
+
# Delegate client methods to the client object.
|
53
|
+
extend Forwardable
|
54
|
+
def_delegators :@client,
|
55
|
+
:token_credential_uri, :audience,
|
56
|
+
:scope, :issuer, :signing_key, :updater_proc
|
57
|
+
|
58
|
+
def initialize(keyfile, scope: nil)
|
59
|
+
verify_keyfile_provided! keyfile
|
60
|
+
if keyfile.is_a? Signet::OAuth2::Client
|
61
|
+
@client = keyfile
|
62
|
+
elsif keyfile.is_a? Hash
|
63
|
+
hash = stringify_hash_keys keyfile
|
64
|
+
hash['scope'] ||= scope
|
65
|
+
@client = init_client hash
|
66
|
+
else
|
67
|
+
verify_keyfile_exists! keyfile
|
68
|
+
json = JSON.parse ::File.read(keyfile)
|
69
|
+
json['scope'] ||= scope
|
70
|
+
@client = init_client json
|
71
|
+
end
|
72
|
+
@client.fetch_access_token!
|
73
|
+
end
|
74
|
+
|
75
|
+
##
|
76
|
+
# Returns the default credentials.
|
77
|
+
#
|
78
|
+
def self.default(scope: nil)
|
79
|
+
env = ->(v) { ENV[v] }
|
80
|
+
json = lambda do |v|
|
81
|
+
unless ENV[v].nil?
|
82
|
+
begin
|
83
|
+
JSON.parse ENV[v]
|
84
|
+
rescue
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
path = ->(p) { ::File.file? p }
|
90
|
+
|
91
|
+
# First try to find keyfile file from environment variables.
|
92
|
+
self::PATH_ENV_VARS.map(&env).compact.select(&path)
|
93
|
+
.each do |file|
|
94
|
+
return new file, scope: scope
|
95
|
+
end
|
96
|
+
# Second try to find keyfile json from environment variables.
|
97
|
+
self::JSON_ENV_VARS.map(&json).compact.each do |hash|
|
98
|
+
return new hash, scope: scope
|
99
|
+
end
|
100
|
+
# Third try to find keyfile file from known file paths.
|
101
|
+
self::DEFAULT_PATHS.select(&path).each do |file|
|
102
|
+
return new file, scope: scope
|
103
|
+
end
|
104
|
+
# Finally get instantiated client from Google::Auth.
|
105
|
+
scope ||= self::SCOPE
|
106
|
+
client = Google::Auth.get_application_default scope
|
107
|
+
new client
|
108
|
+
end
|
109
|
+
|
110
|
+
protected
|
111
|
+
|
112
|
+
# Verify that the keyfile argument is provided.
|
113
|
+
def verify_keyfile_provided!(keyfile)
|
114
|
+
return unless keyfile.nil?
|
115
|
+
raise 'The keyfile passed to Google::Gax::Credentials.new was nil.'
|
116
|
+
end
|
117
|
+
|
118
|
+
# Verify that the keyfile argument is a file.
|
119
|
+
def verify_keyfile_exists!(keyfile)
|
120
|
+
exists = ::File.file? keyfile
|
121
|
+
raise "The keyfile '#{keyfile}' is not a valid file." unless exists
|
122
|
+
end
|
123
|
+
|
124
|
+
# Initializes the Signet client.
|
125
|
+
def init_client(keyfile)
|
126
|
+
client_opts = client_options keyfile
|
127
|
+
Signet::OAuth2::Client.new client_opts
|
128
|
+
end
|
129
|
+
|
130
|
+
# returns a new Hash with string keys instead of symbol keys.
|
131
|
+
def stringify_hash_keys(hash)
|
132
|
+
Hash[hash.map { |k, v| [k.to_s, v] }]
|
133
|
+
end
|
134
|
+
|
135
|
+
def client_options(options)
|
136
|
+
# Keyfile options have higher priority over constructor defaults
|
137
|
+
options['token_credential_uri'] ||= self.class::TOKEN_CREDENTIAL_URI
|
138
|
+
options['audience'] ||= self.class::AUDIENCE
|
139
|
+
options['scope'] ||= self.class::SCOPE
|
140
|
+
|
141
|
+
# client options for initializing signet client
|
142
|
+
{ token_credential_uri: options['token_credential_uri'],
|
143
|
+
audience: options['audience'],
|
144
|
+
scope: Array(options['scope']),
|
145
|
+
issuer: options['client_email'],
|
146
|
+
signing_key: OpenSSL::PKey::RSA.new(options['private_key']) }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/lib/google/gax/grpc.rb
CHANGED
@@ -29,6 +29,7 @@
|
|
29
29
|
|
30
30
|
require 'grpc'
|
31
31
|
require 'googleauth'
|
32
|
+
require 'google/gax/errors'
|
32
33
|
|
33
34
|
module Google
|
34
35
|
module Gax
|
@@ -50,14 +51,14 @@ module Google
|
|
50
51
|
#
|
51
52
|
# @param port [Fixnum] The port on which to connect to the remote host.
|
52
53
|
#
|
53
|
-
# @param chan_creds [Grpc::Core::ChannelCredentials]
|
54
|
-
# A ChannelCredentials object for use with an SSL-enabled Channel.
|
55
|
-
# If nil, credentials are pulled from a default location.
|
56
|
-
#
|
57
54
|
# @param channel [Object]
|
58
55
|
# A Channel object through which to make calls. If nil, a secure
|
59
56
|
# channel is constructed.
|
60
57
|
#
|
58
|
+
# @param chan_creds [Grpc::Core::ChannelCredentials]
|
59
|
+
# A ChannelCredentials object for use with an SSL-enabled Channel.
|
60
|
+
# If nil, credentials are pulled from a default location.
|
61
|
+
#
|
61
62
|
# @param updater_proc [Proc]
|
62
63
|
# A function that transforms the metadata for requests, e.g., to give
|
63
64
|
# OAuth credentials.
|
@@ -66,32 +67,49 @@ module Google
|
|
66
67
|
# The OAuth scopes for this service. This parameter is ignored if
|
67
68
|
# a custom metadata_transformer is supplied.
|
68
69
|
#
|
70
|
+
# @raise [ArgumentError] if a combination channel, chan_creds, and
|
71
|
+
# updater_proc are passed.
|
72
|
+
#
|
69
73
|
# @yield [address, creds]
|
70
74
|
# the generated gRPC method to create a stub.
|
71
75
|
#
|
72
76
|
# @return A gRPC client stub.
|
73
77
|
def create_stub(service_path,
|
74
78
|
port,
|
75
|
-
chan_creds: nil,
|
76
79
|
channel: nil,
|
80
|
+
chan_creds: nil,
|
77
81
|
updater_proc: nil,
|
78
82
|
scopes: nil)
|
83
|
+
verify_params(channel, chan_creds, updater_proc)
|
79
84
|
address = "#{service_path}:#{port}"
|
80
|
-
if channel
|
81
|
-
|
85
|
+
if channel
|
86
|
+
yield(address, nil, channel_override: channel)
|
87
|
+
elsif chan_creds
|
88
|
+
yield(address, chan_creds)
|
89
|
+
else
|
82
90
|
if updater_proc.nil?
|
83
91
|
auth_creds = Google::Auth.get_application_default(scopes)
|
84
92
|
updater_proc = auth_creds.updater_proc
|
85
93
|
end
|
86
94
|
call_creds = GRPC::Core::CallCredentials.new(updater_proc)
|
87
|
-
chan_creds =
|
95
|
+
chan_creds = GRPC::Core::ChannelCredentials.new.compose(call_creds)
|
88
96
|
yield(address, chan_creds)
|
89
|
-
else
|
90
|
-
yield(address, nil, channel_override: channel)
|
91
97
|
end
|
92
98
|
end
|
93
99
|
|
94
100
|
module_function :create_stub
|
101
|
+
|
102
|
+
def self.verify_params(channel, chan_creds, updater_proc)
|
103
|
+
if (channel && chan_creds) ||
|
104
|
+
(channel && updater_proc) ||
|
105
|
+
(chan_creds && updater_proc)
|
106
|
+
raise ArgumentError, 'Only one of channel, chan_creds, and ' \
|
107
|
+
'updater_proc should be passed into ' \
|
108
|
+
'Google::Gax::Grpc#create_stub.'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
private_class_method :verify_params
|
95
113
|
end
|
96
114
|
end
|
97
115
|
end
|
data/lib/google/gax/util.rb
CHANGED
@@ -30,6 +30,13 @@
|
|
30
30
|
module Google
|
31
31
|
# Gax defines Google API extensions
|
32
32
|
module Gax
|
33
|
+
# Regex used by gapic to find version files and directories.
|
34
|
+
VERSION_MATCHER = /
|
35
|
+
([vV]\d+) # Major version eg: v1
|
36
|
+
([pP]\d+)? # Point release eg: p2
|
37
|
+
(([aA]lpha|[bB]eta)\d*)? # Release level eg: alpha3
|
38
|
+
/x
|
39
|
+
|
33
40
|
# Creates an instance of a protobuf message from a hash that may include
|
34
41
|
# nested hashes. `google/protobuf` allows for the instantiation of protobuf
|
35
42
|
# messages using hashes but does not allow for nested hashes to instantiate
|
data/lib/google/gax/version.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright 2017, Google Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are
|
6
|
+
# met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright
|
9
|
+
# notice, this list of conditions and the following disclaimer.
|
10
|
+
# * Redistributions in binary form must reproduce the above
|
11
|
+
# copyright notice, this list of conditions and the following disclaimer
|
12
|
+
# in the documentation and/or other materials provided with the
|
13
|
+
# distribution.
|
14
|
+
# * Neither the name of Google Inc. nor the names of its
|
15
|
+
# contributors may be used to endorse or promote products derived from
|
16
|
+
# this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
require 'google/gax/credentials'
|
31
|
+
|
32
|
+
# This test is testing the private class Google::Gax::Credentials. We want to
|
33
|
+
# make sure that the passed in scope propogates to the Signet object. This means
|
34
|
+
# testing the private API, which is generally frowned on.
|
35
|
+
describe Google::Gax::Credentials, :private do
|
36
|
+
let(:default_keyfile_hash) do
|
37
|
+
{
|
38
|
+
'private_key_id' => 'testabc1234567890xyz',
|
39
|
+
'private_key' => "-----BEGIN RSA PRIVATE KEY-----\nMIIBOwIBAAJBAOyi0Hy1l4Ym2m2o71Q0TF4O9E81isZEsX0bb+Bqz1SXEaSxLiXM\nUZE8wu0eEXivXuZg6QVCW/5l+f2+9UPrdNUCAwEAAQJAJkqubA/Chj3RSL92guy3\nktzeodarLyw8gF8pOmpuRGSiEo/OLTeRUMKKD1/kX4f9sxf3qDhB4e7dulXR1co/\nIQIhAPx8kMW4XTTL6lJYd2K5GrH8uBMp8qL5ya3/XHrBgw3dAiEA7+3Iw3ULTn2I\n1J34WlJ2D5fbzMzB4FAHUNEV7Ys3f1kCIQDtUahCMChrl7+H5t9QS+xrn77lRGhs\nB50pjvy95WXpgQIhAI2joW6JzTfz8fAapb+kiJ/h9Vcs1ZN3iyoRlNFb61JZAiA8\nNy5NyNrMVwtB/lfJf1dAK/p/Bwd8LZLtgM6PapRfgw==\n-----END RSA PRIVATE KEY-----\n",
|
40
|
+
'client_email' => 'credz-testabc1234567890xyz@developer.gserviceaccount.com',
|
41
|
+
'client_id' => 'credz-testabc1234567890xyz.apps.googleusercontent.com',
|
42
|
+
'type' => 'service_account'
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'uses a default scope' do
|
47
|
+
mocked_signet = double('Signet::OAuth2::Client')
|
48
|
+
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
49
|
+
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
50
|
+
expect(options[:token_credential_uri]).to eq('https://accounts.google.com/o/oauth2/token')
|
51
|
+
expect(options[:audience]).to eq('https://accounts.google.com/o/oauth2/token')
|
52
|
+
expect(options[:scope]).to eq([])
|
53
|
+
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
54
|
+
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
55
|
+
|
56
|
+
mocked_signet
|
57
|
+
end
|
58
|
+
|
59
|
+
Google::Gax::Credentials.new default_keyfile_hash
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'uses a custom scope' do
|
63
|
+
mocked_signet = double('Signet::OAuth2::Client')
|
64
|
+
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
65
|
+
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
66
|
+
expect(options[:token_credential_uri]).to eq('https://accounts.google.com/o/oauth2/token')
|
67
|
+
expect(options[:audience]).to eq('https://accounts.google.com/o/oauth2/token')
|
68
|
+
expect(options[:scope]).to eq(['http://example.com/scope'])
|
69
|
+
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
70
|
+
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
71
|
+
|
72
|
+
mocked_signet
|
73
|
+
end
|
74
|
+
|
75
|
+
Google::Gax::Credentials.new default_keyfile_hash, scope: 'http://example.com/scope'
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'can be subclassed to pass in other env paths' do
|
79
|
+
TEST_PATH_ENV_VAR = 'TEST_PATH'.freeze
|
80
|
+
TEST_PATH_ENV_VAL = '/unknown/path/to/file.txt'.freeze
|
81
|
+
TEST_JSON_ENV_VAR = 'TEST_JSON_VARS'.freeze
|
82
|
+
|
83
|
+
ENV[TEST_PATH_ENV_VAR] = TEST_PATH_ENV_VAL
|
84
|
+
ENV[TEST_JSON_ENV_VAR] = JSON.generate(default_keyfile_hash)
|
85
|
+
|
86
|
+
class TestCredentials < Google::Gax::Credentials
|
87
|
+
SCOPE = 'http://example.com/scope'.freeze
|
88
|
+
PATH_ENV_VARS = [TEST_PATH_ENV_VAR].freeze
|
89
|
+
JSON_ENV_VARS = [TEST_JSON_ENV_VAR].freeze
|
90
|
+
end
|
91
|
+
|
92
|
+
allow(::File).to receive(:file?).with(TEST_PATH_ENV_VAL) { false }
|
93
|
+
|
94
|
+
mocked_signet = double('Signet::OAuth2::Client')
|
95
|
+
allow(mocked_signet).to receive(:fetch_access_token!).and_return(true)
|
96
|
+
allow(Signet::OAuth2::Client).to receive(:new) do |options|
|
97
|
+
expect(options[:token_credential_uri]).to eq('https://accounts.google.com/o/oauth2/token')
|
98
|
+
expect(options[:audience]).to eq('https://accounts.google.com/o/oauth2/token')
|
99
|
+
expect(options[:scope]).to eq(['http://example.com/scope'])
|
100
|
+
expect(options[:issuer]).to eq(default_keyfile_hash['client_email'])
|
101
|
+
expect(options[:signing_key]).to be_a_kind_of(OpenSSL::PKey::RSA)
|
102
|
+
|
103
|
+
mocked_signet
|
104
|
+
end
|
105
|
+
|
106
|
+
TestCredentials.default
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Copyright 2017, Google Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are
|
6
|
+
# met:
|
7
|
+
#
|
8
|
+
# * Redistributions of source code must retain the above copyright
|
9
|
+
# notice, this list of conditions and the following disclaimer.
|
10
|
+
# * Redistributions in binary form must reproduce the above
|
11
|
+
# copyright notice, this list of conditions and the following disclaimer
|
12
|
+
# in the documentation and/or other materials provided with the
|
13
|
+
# distribution.
|
14
|
+
# * Neither the name of Google Inc. nor the names of its
|
15
|
+
# contributors may be used to endorse or promote products derived from
|
16
|
+
# this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
|
30
|
+
require 'google/gax/grpc'
|
31
|
+
|
32
|
+
describe Google::Gax::Grpc do
|
33
|
+
describe '#create_stub' do
|
34
|
+
it 'yields constructed channel credentials' do
|
35
|
+
mock = instance_double(GRPC::Core::ChannelCredentials)
|
36
|
+
composed_mock = instance_double(GRPC::Core::ChannelCredentials)
|
37
|
+
default_creds = instance_double(Google::Auth::ServiceAccountCredentials)
|
38
|
+
updater_proc = proc {}
|
39
|
+
|
40
|
+
allow(Google::Auth)
|
41
|
+
.to receive(:get_application_default).and_return(default_creds)
|
42
|
+
allow(default_creds).to receive(:updater_proc).and_return(updater_proc)
|
43
|
+
allow(mock).to receive(:compose).and_return(composed_mock)
|
44
|
+
allow(GRPC::Core::ChannelCredentials).to receive(:new).and_return(mock)
|
45
|
+
|
46
|
+
expect do |blk|
|
47
|
+
Google::Gax::Grpc.create_stub('service', 'port', &blk)
|
48
|
+
end.to yield_with_args('service:port', composed_mock)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'yields given channel' do
|
52
|
+
mock = instance_double(GRPC::Core::Channel)
|
53
|
+
expect do |blk|
|
54
|
+
Google::Gax::Grpc.create_stub('service', 'port', channel: mock, &blk)
|
55
|
+
end.to yield_with_args('service:port', nil, channel_override: mock)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'yields given channel credentials' do
|
59
|
+
mock = instance_double(GRPC::Core::ChannelCredentials)
|
60
|
+
expect do |blk|
|
61
|
+
Google::Gax::Grpc.create_stub('service', 'port', chan_creds: mock, &blk)
|
62
|
+
end.to yield_with_args('service:port', mock)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'yields channel credentials composed of the given updater_proc' do
|
66
|
+
chan_creds = instance_double(GRPC::Core::ChannelCredentials)
|
67
|
+
composed_chan_creds = instance_double(GRPC::Core::ChannelCredentials)
|
68
|
+
call_creds = instance_double(GRPC::Core::CallCredentials)
|
69
|
+
updater_proc = proc {}
|
70
|
+
|
71
|
+
allow(GRPC::Core::CallCredentials)
|
72
|
+
.to receive(:new).with(updater_proc).and_return(call_creds)
|
73
|
+
allow(GRPC::Core::ChannelCredentials)
|
74
|
+
.to receive(:new).and_return(chan_creds)
|
75
|
+
allow(chan_creds)
|
76
|
+
.to receive(:compose).with(call_creds).and_return(composed_chan_creds)
|
77
|
+
expect do |blk|
|
78
|
+
Google::Gax::Grpc.create_stub(
|
79
|
+
'service', 'port', updater_proc: updater_proc, &blk
|
80
|
+
)
|
81
|
+
end.to yield_with_args('service:port', composed_chan_creds)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'raise an argument error if multiple creds are passed in' do
|
85
|
+
channel = instance_double(GRPC::Core::Channel)
|
86
|
+
chan_creds = instance_double(GRPC::Core::ChannelCredentials)
|
87
|
+
updater_proc = instance_double(Proc)
|
88
|
+
|
89
|
+
expect do |blk|
|
90
|
+
Google::Gax::Grpc.create_stub(
|
91
|
+
'service', 'port', channel: channel, chan_creds: chan_creds, &blk
|
92
|
+
)
|
93
|
+
end.to raise_error(ArgumentError)
|
94
|
+
|
95
|
+
expect do |blk|
|
96
|
+
Google::Gax::Grpc.create_stub(
|
97
|
+
'service', 'port', channel: channel,
|
98
|
+
updater_proc: updater_proc, &blk
|
99
|
+
)
|
100
|
+
end.to raise_error(ArgumentError)
|
101
|
+
|
102
|
+
expect do |blk|
|
103
|
+
Google::Gax::Grpc.create_stub(
|
104
|
+
'service', 'port', chan_creds: chan_creds,
|
105
|
+
updater_proc: updater_proc, &blk
|
106
|
+
)
|
107
|
+
end.to raise_error(ArgumentError)
|
108
|
+
|
109
|
+
expect do |blk|
|
110
|
+
Google::Gax::Grpc.create_stub(
|
111
|
+
'service', 'port', channel: channel, chan_creds: chan_creds,
|
112
|
+
updater_proc: updater_proc, &blk
|
113
|
+
)
|
114
|
+
end.to raise_error(ArgumentError)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-gax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Google API Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: googleauth
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- lib/google/gax/api_callable.rb
|
163
163
|
- lib/google/gax/bundling.rb
|
164
164
|
- lib/google/gax/constants.rb
|
165
|
+
- lib/google/gax/credentials.rb
|
165
166
|
- lib/google/gax/errors.rb
|
166
167
|
- lib/google/gax/grpc.rb
|
167
168
|
- lib/google/gax/operation.rb
|
@@ -175,6 +176,8 @@ files:
|
|
175
176
|
- spec/fixtures/fixture_pb.rb
|
176
177
|
- spec/google/gax/api_callable_spec.rb
|
177
178
|
- spec/google/gax/bundling_spec.rb
|
179
|
+
- spec/google/gax/credentials_spec.rb
|
180
|
+
- spec/google/gax/grpc_spec.rb
|
178
181
|
- spec/google/gax/operation_spec.rb
|
179
182
|
- spec/google/gax/path_template_spec.rb
|
180
183
|
- spec/google/gax/settings_spec.rb
|