grpc 0.13.0 → 0.13.1.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/Makefile +1114 -937
- data/include/grpc/census.h +71 -89
- data/include/grpc/compression.h +7 -7
- data/include/grpc/grpc.h +65 -68
- data/include/grpc/grpc_security.h +38 -38
- data/include/grpc/impl/codegen/alloc.h +7 -7
- data/include/grpc/impl/codegen/byte_buffer.h +13 -13
- data/include/grpc/impl/codegen/grpc_types.h +7 -2
- data/include/grpc/impl/codegen/log.h +5 -5
- data/include/grpc/impl/codegen/port_platform.h +14 -6
- data/include/grpc/impl/codegen/slice.h +15 -15
- data/include/grpc/impl/codegen/slice_buffer.h +17 -17
- data/include/grpc/impl/codegen/sync.h +26 -22
- data/include/grpc/impl/codegen/time.h +22 -24
- data/include/grpc/support/avl.h +9 -8
- data/include/grpc/support/cmdline.h +12 -12
- data/include/grpc/support/cpu.h +2 -2
- data/include/grpc/support/histogram.h +22 -22
- data/include/grpc/support/host_port.h +2 -2
- data/include/grpc/support/log_win32.h +1 -1
- data/include/grpc/support/string_util.h +2 -2
- data/include/grpc/support/subprocess.h +5 -5
- data/include/grpc/support/thd.h +9 -9
- data/include/grpc/support/useful.h +3 -1
- data/src/core/census/context.c +64 -85
- data/src/core/census/grpc_filter.c +2 -2
- data/src/core/census/mlog.c +600 -0
- data/src/core/census/mlog.h +95 -0
- data/src/core/channel/channel_args.c +67 -6
- data/src/core/channel/channel_args.h +7 -1
- data/src/core/channel/client_channel.c +26 -36
- data/src/core/channel/client_uchannel.c +1 -1
- data/src/core/channel/http_client_filter.c +2 -2
- data/src/core/channel/http_server_filter.c +2 -2
- data/src/core/channel/subchannel_call_holder.c +5 -7
- data/src/core/client_config/connector.c +3 -2
- data/src/core/client_config/connector.h +2 -2
- data/src/core/client_config/lb_policies/load_balancer_api.c +163 -0
- data/src/core/client_config/lb_policies/load_balancer_api.h +85 -0
- data/src/core/client_config/lb_policies/pick_first.c +10 -11
- data/src/core/client_config/lb_policies/round_robin.c +7 -8
- data/src/core/client_config/lb_policy.c +3 -3
- data/src/core/client_config/lb_policy.h +3 -2
- data/src/core/client_config/subchannel.c +51 -21
- data/src/core/client_config/subchannel.h +15 -6
- data/src/core/client_config/subchannel_index.c +261 -0
- data/src/core/client_config/subchannel_index.h +77 -0
- data/src/core/compression/{algorithm.c → compression_algorithm.c} +0 -0
- data/src/core/httpcli/httpcli.c +13 -11
- data/src/core/httpcli/httpcli.h +3 -2
- data/src/core/httpcli/httpcli_security_connector.c +7 -7
- data/src/core/iomgr/fd_posix.c +4 -2
- data/src/core/iomgr/iocp_windows.c +10 -6
- data/src/core/iomgr/iocp_windows.h +9 -2
- data/src/core/iomgr/iomgr.c +18 -2
- data/src/core/iomgr/iomgr_internal.h +5 -1
- data/src/core/iomgr/pollset.h +9 -10
- data/src/core/iomgr/pollset_multipoller_with_epoll.c +1 -0
- data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +10 -5
- data/src/core/iomgr/pollset_posix.c +30 -35
- data/src/core/iomgr/pollset_posix.h +10 -6
- data/src/core/iomgr/pollset_set.h +3 -9
- data/src/core/iomgr/pollset_set_posix.c +23 -3
- data/src/core/iomgr/pollset_set_posix.h +2 -18
- data/src/core/iomgr/pollset_set_windows.c +3 -3
- data/src/core/iomgr/pollset_set_windows.h +2 -2
- data/src/core/iomgr/pollset_windows.c +24 -21
- data/src/core/iomgr/pollset_windows.h +1 -5
- data/src/core/iomgr/tcp_client_posix.c +7 -5
- data/src/core/iomgr/tcp_posix.c +4 -2
- data/src/core/iomgr/tcp_server_windows.c +1 -2
- data/src/core/iomgr/timer.c +2 -3
- data/src/core/iomgr/timer.h +21 -1
- data/src/core/iomgr/timer_heap.c +10 -12
- data/src/core/iomgr/udp_server.c +5 -4
- data/src/core/iomgr/udp_server.h +1 -0
- data/src/core/iomgr/workqueue_posix.c +1 -0
- data/src/core/iomgr/workqueue_posix.h +3 -1
- data/src/core/proto/grpc/lb/v0/load_balancer.pb.c +119 -0
- data/src/core/proto/grpc/lb/v0/load_balancer.pb.h +182 -0
- data/src/core/security/{base64.c → b64.c} +1 -1
- data/src/core/security/{base64.h → b64.h} +1 -1
- data/src/core/security/client_auth_filter.c +0 -1
- data/src/core/security/credentials.c +12 -5
- data/src/core/security/credentials.h +3 -3
- data/src/core/security/google_default_credentials.c +24 -19
- data/src/core/security/handshake.c +15 -7
- data/src/core/security/handshake.h +2 -1
- data/src/core/security/json_token.c +1 -1
- data/src/core/security/jwt_verifier.c +1 -1
- data/src/core/security/security_connector.c +84 -64
- data/src/core/security/security_connector.h +42 -22
- data/src/core/security/security_context.c +8 -3
- data/src/core/security/server_auth_filter.c +2 -2
- data/src/core/security/server_secure_chttp2.c +7 -7
- data/src/core/support/avl.c +2 -2
- data/src/core/support/env_linux.c +17 -0
- data/src/core/support/{file.c → load_file.c} +2 -2
- data/src/core/support/{file.h → load_file.h} +4 -12
- data/src/core/support/sync.c +6 -1
- data/src/core/support/time_posix.c +1 -1
- data/src/core/{iomgr/timer_internal.h → support/tmpfile.h} +17 -23
- data/src/core/support/{file_posix.c → tmpfile_posix.c} +2 -2
- data/src/core/support/{file_win32.c → tmpfile_win32.c} +2 -2
- data/src/core/surface/alarm.c +3 -2
- data/src/core/surface/call.c +102 -52
- data/src/core/surface/channel_create.c +1 -1
- data/src/core/surface/completion_queue.c +73 -41
- data/src/core/surface/init.c +4 -0
- data/src/core/surface/lame_client.c +1 -2
- data/src/core/surface/secure_channel_create.c +6 -7
- data/src/core/surface/server.c +13 -5
- data/src/core/surface/validate_metadata.c +1 -1
- data/src/core/surface/version.c +1 -1
- data/src/core/transport/chttp2/internal.h +22 -10
- data/src/core/transport/chttp2/parsing.c +3 -3
- data/src/core/transport/chttp2/stream_lists.c +39 -21
- data/src/core/transport/chttp2/writing.c +19 -28
- data/src/core/transport/chttp2_transport.c +80 -37
- data/src/core/transport/metadata.c +8 -0
- data/src/core/transport/static_metadata.c +17 -17
- data/src/core/transport/static_metadata.h +3 -3
- data/src/core/transport/transport.c +2 -1
- data/src/core/transport/transport.h +12 -5
- data/src/ruby/ext/grpc/extconf.rb +1 -0
- data/src/ruby/ext/grpc/rb_call.c +6 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +12 -14
- data/src/ruby/ext/grpc/rb_channel.c +8 -14
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -12
- data/src/ruby/ext/grpc/rb_grpc.c +19 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +8 -2
- data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
- data/src/ruby/lib/grpc/errors.rb +2 -2
- data/src/ruby/lib/grpc/generic/rpc_server.rb +58 -39
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +2 -2
- data/src/ruby/pb/generate_proto_ruby.sh +2 -2
- data/src/ruby/pb/grpc/health/checker.rb +11 -11
- data/src/ruby/pb/grpc/health/v1/health.rb +28 -0
- data/src/ruby/pb/grpc/health/{v1alpha → v1}/health_services.rb +4 -4
- data/src/ruby/spec/client_server_spec.rb +2 -1
- data/src/ruby/spec/generic/rpc_server_spec.rb +3 -22
- data/src/ruby/spec/pb/health/checker_spec.rb +22 -36
- data/third_party/nanopb/pb.h +547 -0
- data/third_party/nanopb/pb_common.c +97 -0
- data/third_party/nanopb/pb_common.h +42 -0
- data/third_party/nanopb/pb_decode.c +1319 -0
- data/third_party/nanopb/pb_decode.h +149 -0
- data/third_party/nanopb/pb_encode.c +690 -0
- data/third_party/nanopb/pb_encode.h +154 -0
- metadata +32 -16
- data/src/ruby/pb/grpc/health/v1alpha/health.rb +0 -29
data/src/ruby/pb/README.md
CHANGED
@@ -11,7 +11,7 @@ The code is is generated using the protoc (> 3.0.0.alpha.1) and the
|
|
11
11
|
grpc_ruby_plugin. These must be installed to regenerate the IDL defined
|
12
12
|
classes, but that's not necessary just to use them.
|
13
13
|
|
14
|
-
health_check/
|
14
|
+
health_check/v1
|
15
15
|
--------------------
|
16
16
|
|
17
17
|
This package defines the surface of a simple health check service that gRPC
|
@@ -20,7 +20,7 @@ re-generate the surface.
|
|
20
20
|
|
21
21
|
```bash
|
22
22
|
$ # (from this directory)
|
23
|
-
$ protoc -I ../../proto ../../proto/grpc/health/
|
23
|
+
$ protoc -I ../../proto ../../proto/grpc/health/v1/health.proto \
|
24
24
|
--grpc_out=. \
|
25
25
|
--ruby_out=. \
|
26
26
|
--plugin=protoc-gen-grpc=`which grpc_ruby_plugin`
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/bin/sh
|
2
|
-
# Copyright 2015, Google Inc.
|
2
|
+
# Copyright 2015-2016, Google Inc.
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
@@ -35,7 +35,7 @@ cd $(dirname $0)/../../..
|
|
35
35
|
PROTOC=bins/opt/protobuf/protoc
|
36
36
|
PLUGIN=protoc-gen-grpc=bins/opt/grpc_ruby_plugin
|
37
37
|
|
38
|
-
$PROTOC -I src/proto src/proto/grpc/health/
|
38
|
+
$PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
|
39
39
|
--grpc_out=src/ruby/pb \
|
40
40
|
--ruby_out=src/ruby/pb \
|
41
41
|
--plugin=$PLUGIN
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -28,7 +28,7 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'grpc'
|
31
|
-
require 'grpc/health/
|
31
|
+
require 'grpc/health/v1/health_services'
|
32
32
|
require 'thread'
|
33
33
|
|
34
34
|
module Grpc
|
@@ -36,9 +36,9 @@ module Grpc
|
|
36
36
|
# service.
|
37
37
|
module Health
|
38
38
|
# Checker is implementation of the schema-specified health checking service.
|
39
|
-
class Checker <
|
39
|
+
class Checker < V1::Health::Service
|
40
40
|
StatusCodes = GRPC::Core::StatusCodes
|
41
|
-
HealthCheckResponse =
|
41
|
+
HealthCheckResponse = V1::HealthCheckResponse
|
42
42
|
|
43
43
|
# Initializes the statuses of participating services
|
44
44
|
def initialize
|
@@ -50,20 +50,20 @@ module Grpc
|
|
50
50
|
def check(req, _call)
|
51
51
|
status = nil
|
52
52
|
@status_mutex.synchronize do
|
53
|
-
status = @statuses["#{req.
|
53
|
+
status = @statuses["#{req.service}"]
|
54
54
|
end
|
55
55
|
fail GRPC::BadStatus, StatusCodes::NOT_FOUND if status.nil?
|
56
56
|
HealthCheckResponse.new(status: status)
|
57
57
|
end
|
58
58
|
|
59
|
-
# Adds the health status for a given
|
60
|
-
def add_status(
|
61
|
-
@status_mutex.synchronize { @statuses["#{
|
59
|
+
# Adds the health status for a given service.
|
60
|
+
def add_status(service, status)
|
61
|
+
@status_mutex.synchronize { @statuses["#{service}"] = status }
|
62
62
|
end
|
63
63
|
|
64
|
-
# Clears the status for the given
|
65
|
-
def clear_status(
|
66
|
-
@status_mutex.synchronize { @statuses.delete("#{
|
64
|
+
# Clears the status for the given service.
|
65
|
+
def clear_status(service)
|
66
|
+
@status_mutex.synchronize { @statuses.delete("#{service}") }
|
67
67
|
end
|
68
68
|
|
69
69
|
# Clears alls the statuses.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: grpc/health/v1/health.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_message "grpc.health.v1.HealthCheckRequest" do
|
8
|
+
optional :service, :string, 1
|
9
|
+
end
|
10
|
+
add_message "grpc.health.v1.HealthCheckResponse" do
|
11
|
+
optional :status, :enum, 1, "grpc.health.v1.HealthCheckResponse.ServingStatus"
|
12
|
+
end
|
13
|
+
add_enum "grpc.health.v1.HealthCheckResponse.ServingStatus" do
|
14
|
+
value :UNKNOWN, 0
|
15
|
+
value :SERVING, 1
|
16
|
+
value :NOT_SERVING, 2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Grpc
|
21
|
+
module Health
|
22
|
+
module V1
|
23
|
+
HealthCheckRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckRequest").msgclass
|
24
|
+
HealthCheckResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse").msgclass
|
25
|
+
HealthCheckResponse::ServingStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse.ServingStatus").enummodule
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# Source: grpc/health/
|
2
|
+
# Source: grpc/health/v1/health.proto for package 'grpc.health.v1'
|
3
3
|
|
4
4
|
require 'grpc'
|
5
|
-
require 'grpc/health/
|
5
|
+
require 'grpc/health/v1/health'
|
6
6
|
|
7
7
|
module Grpc
|
8
8
|
module Health
|
9
|
-
module
|
9
|
+
module V1
|
10
10
|
module Health
|
11
11
|
|
12
12
|
# TODO: add proto service documentation here
|
@@ -16,7 +16,7 @@ module Grpc
|
|
16
16
|
|
17
17
|
self.marshal_class_method = :encode
|
18
18
|
self.unmarshal_class_method = :decode
|
19
|
-
self.service_name = 'grpc.health.
|
19
|
+
self.service_name = 'grpc.health.v1.Health'
|
20
20
|
|
21
21
|
rpc :Check, HealthCheckRequest, HealthCheckResponse
|
22
22
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -198,6 +198,7 @@ shared_examples 'basic GRPC message delivery is OK' do
|
|
198
198
|
# confirm the client can receive the server response and status.
|
199
199
|
client_ops = {
|
200
200
|
CallOps::SEND_CLOSE_FROM_CLIENT => nil,
|
201
|
+
CallOps::RECV_INITIAL_METADATA => nil,
|
201
202
|
CallOps::RECV_MESSAGE => nil,
|
202
203
|
CallOps::RECV_STATUS_ON_CLIENT => nil
|
203
204
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015, Google Inc.
|
1
|
+
# Copyright 2015-2016, Google Inc.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -220,19 +220,10 @@ describe GRPC::RpcServer do
|
|
220
220
|
@srv = RpcServer.new(**opts)
|
221
221
|
end
|
222
222
|
|
223
|
-
after(:each) do
|
224
|
-
@srv.stop
|
225
|
-
end
|
226
|
-
|
227
223
|
it 'starts out false' do
|
228
224
|
expect(@srv.stopped?).to be(false)
|
229
225
|
end
|
230
226
|
|
231
|
-
it 'stays false after a #stop is called before #run' do
|
232
|
-
@srv.stop
|
233
|
-
expect(@srv.stopped?).to be(false)
|
234
|
-
end
|
235
|
-
|
236
227
|
it 'stays false after the server starts running', server: true do
|
237
228
|
@srv.handle(EchoService)
|
238
229
|
t = Thread.new { @srv.run }
|
@@ -247,8 +238,8 @@ describe GRPC::RpcServer do
|
|
247
238
|
t = Thread.new { @srv.run }
|
248
239
|
@srv.wait_till_running
|
249
240
|
@srv.stop
|
250
|
-
expect(@srv.stopped?).to be(true)
|
251
241
|
t.join
|
242
|
+
expect(@srv.stopped?).to be(true)
|
252
243
|
end
|
253
244
|
end
|
254
245
|
|
@@ -266,9 +257,7 @@ describe GRPC::RpcServer do
|
|
266
257
|
server_override: @server
|
267
258
|
}
|
268
259
|
r = RpcServer.new(**opts)
|
269
|
-
r.run
|
270
|
-
expect(r.running?).to be(false)
|
271
|
-
r.stop
|
260
|
+
expect { r.run }.to raise_error(RuntimeError)
|
272
261
|
end
|
273
262
|
|
274
263
|
it 'is true after run is called with a registered service' do
|
@@ -293,10 +282,6 @@ describe GRPC::RpcServer do
|
|
293
282
|
@srv = RpcServer.new(**@opts)
|
294
283
|
end
|
295
284
|
|
296
|
-
after(:each) do
|
297
|
-
@srv.stop
|
298
|
-
end
|
299
|
-
|
300
285
|
it 'raises if #run has already been called' do
|
301
286
|
@srv.handle(EchoService)
|
302
287
|
t = Thread.new { @srv.run }
|
@@ -528,10 +513,6 @@ describe GRPC::RpcServer do
|
|
528
513
|
@srv = RpcServer.new(**server_opts)
|
529
514
|
end
|
530
515
|
|
531
|
-
after(:each) do
|
532
|
-
@srv.stop
|
533
|
-
end
|
534
|
-
|
535
516
|
it 'should be added to BadStatus when requests fail', server: true do
|
536
517
|
service = FailingService.new
|
537
518
|
@srv.handle(service)
|
@@ -28,7 +28,7 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'grpc'
|
31
|
-
require 'grpc/health/
|
31
|
+
require 'grpc/health/v1/health'
|
32
32
|
require 'grpc/health/checker'
|
33
33
|
require 'open3'
|
34
34
|
require 'tmpdir'
|
@@ -43,7 +43,7 @@ describe 'Health protobuf code generation' do
|
|
43
43
|
skip 'protoc || grpc_ruby_plugin missing, cannot verify health code-gen'
|
44
44
|
else
|
45
45
|
it 'should already be loaded indirectly i.e, used by the other specs' do
|
46
|
-
expect(require('grpc/health/
|
46
|
+
expect(require('grpc/health/v1/health_services')).to be(false)
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should have the same content as created by code generation' do
|
@@ -52,7 +52,7 @@ describe 'Health protobuf code generation' do
|
|
52
52
|
|
53
53
|
# Get the current content
|
54
54
|
service_path = File.join(root_dir, 'ruby', 'pb', 'grpc',
|
55
|
-
'health', '
|
55
|
+
'health', 'v1', 'health_services.rb')
|
56
56
|
want = nil
|
57
57
|
File.open(service_path) { |f| want = f.read }
|
58
58
|
|
@@ -61,12 +61,12 @@ describe 'Health protobuf code generation' do
|
|
61
61
|
plugin = plugin.strip
|
62
62
|
got = nil
|
63
63
|
Dir.mktmpdir do |tmp_dir|
|
64
|
-
gen_out = File.join(tmp_dir, 'grpc', 'health', '
|
64
|
+
gen_out = File.join(tmp_dir, 'grpc', 'health', 'v1',
|
65
65
|
'health_services.rb')
|
66
66
|
pid = spawn(
|
67
67
|
'protoc',
|
68
68
|
'-I.',
|
69
|
-
'grpc/health/
|
69
|
+
'grpc/health/v1/health.proto',
|
70
70
|
"--grpc_out=#{tmp_dir}",
|
71
71
|
"--plugin=protoc-gen-grpc=#{plugin}",
|
72
72
|
chdir: pb_dir)
|
@@ -81,27 +81,17 @@ end
|
|
81
81
|
|
82
82
|
describe Grpc::Health::Checker do
|
83
83
|
StatusCodes = GRPC::Core::StatusCodes
|
84
|
-
ServingStatus = Grpc::Health::
|
85
|
-
HCResp = Grpc::Health::
|
86
|
-
HCReq = Grpc::Health::
|
84
|
+
ServingStatus = Grpc::Health::V1::HealthCheckResponse::ServingStatus
|
85
|
+
HCResp = Grpc::Health::V1::HealthCheckResponse
|
86
|
+
HCReq = Grpc::Health::V1::HealthCheckRequest
|
87
87
|
success_tests =
|
88
88
|
[
|
89
89
|
{
|
90
|
-
desc: '
|
91
|
-
host: '',
|
90
|
+
desc: 'the service is not specified',
|
92
91
|
service: ''
|
93
92
|
}, {
|
94
|
-
desc: '
|
95
|
-
host: 'test-fake-host',
|
96
|
-
service: ''
|
97
|
-
}, {
|
98
|
-
desc: 'the host and service are specified',
|
99
|
-
host: 'test-fake-host',
|
93
|
+
desc: 'the service is specified',
|
100
94
|
service: 'fake-service-1'
|
101
|
-
}, {
|
102
|
-
desc: 'only the service is specified',
|
103
|
-
host: '',
|
104
|
-
service: 'fake-service-2'
|
105
95
|
}
|
106
96
|
]
|
107
97
|
|
@@ -114,9 +104,8 @@ describe Grpc::Health::Checker do
|
|
114
104
|
context 'method `add_status` and `check`' do
|
115
105
|
success_tests.each do |t|
|
116
106
|
it "should succeed when #{t[:desc]}" do
|
117
|
-
subject.add_status(t[:
|
118
|
-
got = subject.check(HCReq.new(
|
119
|
-
nil)
|
107
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
108
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
120
109
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
121
110
|
expect(got).to eq(want)
|
122
111
|
end
|
@@ -127,7 +116,7 @@ describe Grpc::Health::Checker do
|
|
127
116
|
success_tests.each do |t|
|
128
117
|
it "should fail with NOT_FOUND when #{t[:desc]}" do
|
129
118
|
blk = proc do
|
130
|
-
subject.check(HCReq.new(
|
119
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
131
120
|
end
|
132
121
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
133
122
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -138,16 +127,14 @@ describe Grpc::Health::Checker do
|
|
138
127
|
context 'method `clear_status`' do
|
139
128
|
success_tests.each do |t|
|
140
129
|
it "should fail after clearing status when #{t[:desc]}" do
|
141
|
-
subject.add_status(t[:
|
142
|
-
got = subject.check(HCReq.new(
|
143
|
-
nil)
|
130
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
131
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
144
132
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
145
133
|
expect(got).to eq(want)
|
146
134
|
|
147
|
-
subject.clear_status(t[:
|
135
|
+
subject.clear_status(t[:service])
|
148
136
|
blk = proc do
|
149
|
-
subject.check(HCReq.new(
|
150
|
-
nil)
|
137
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
151
138
|
end
|
152
139
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
153
140
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -158,9 +145,8 @@ describe Grpc::Health::Checker do
|
|
158
145
|
context 'method `clear_all`' do
|
159
146
|
it 'should return NOT_FOUND after being invoked' do
|
160
147
|
success_tests.each do |t|
|
161
|
-
subject.add_status(t[:
|
162
|
-
got = subject.check(HCReq.new(
|
163
|
-
nil)
|
148
|
+
subject.add_status(t[:service], ServingStatus::NOT_SERVING)
|
149
|
+
got = subject.check(HCReq.new(service: t[:service]), nil)
|
164
150
|
want = HCResp.new(status: ServingStatus::NOT_SERVING)
|
165
151
|
expect(got).to eq(want)
|
166
152
|
end
|
@@ -169,7 +155,7 @@ describe Grpc::Health::Checker do
|
|
169
155
|
|
170
156
|
success_tests.each do |t|
|
171
157
|
blk = proc do
|
172
|
-
subject.check(HCReq.new(
|
158
|
+
subject.check(HCReq.new(service: t[:service]), nil)
|
173
159
|
end
|
174
160
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
175
161
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -203,7 +189,7 @@ describe Grpc::Health::Checker do
|
|
203
189
|
|
204
190
|
it 'should receive the correct status', server: true do
|
205
191
|
@srv.handle(subject)
|
206
|
-
subject.add_status('',
|
192
|
+
subject.add_status('', ServingStatus::NOT_SERVING)
|
207
193
|
t = Thread.new { @srv.run }
|
208
194
|
@srv.wait_till_running
|
209
195
|
|
@@ -221,7 +207,7 @@ describe Grpc::Health::Checker do
|
|
221
207
|
@srv.wait_till_running
|
222
208
|
blk = proc do
|
223
209
|
stub = CheckerStub.new(@host, :this_channel_is_insecure, **@client_opts)
|
224
|
-
stub.check(HCReq.new(
|
210
|
+
stub.check(HCReq.new(service: 'unknown'))
|
225
211
|
end
|
226
212
|
expected_msg = /#{StatusCodes::NOT_FOUND}/
|
227
213
|
expect(&blk).to raise_error GRPC::BadStatus, expected_msg
|
@@ -0,0 +1,547 @@
|
|
1
|
+
/* Common parts of the nanopb library. Most of these are quite low-level
|
2
|
+
* stuff. For the high-level interface, see pb_encode.h and pb_decode.h.
|
3
|
+
*/
|
4
|
+
|
5
|
+
#ifndef PB_H_INCLUDED
|
6
|
+
#define PB_H_INCLUDED
|
7
|
+
|
8
|
+
/*****************************************************************
|
9
|
+
* Nanopb compilation time options. You can change these here by *
|
10
|
+
* uncommenting the lines, or on the compiler command line. *
|
11
|
+
*****************************************************************/
|
12
|
+
|
13
|
+
/* Enable support for dynamically allocated fields */
|
14
|
+
/* #define PB_ENABLE_MALLOC 1 */
|
15
|
+
|
16
|
+
/* Define this if your CPU architecture is big endian, i.e. it
|
17
|
+
* stores the most-significant byte first. */
|
18
|
+
/* #define __BIG_ENDIAN__ 1 */
|
19
|
+
|
20
|
+
/* Define this if your CPU / compiler combination does not support
|
21
|
+
* unaligned memory access to packed structures. */
|
22
|
+
/* #define PB_NO_PACKED_STRUCTS 1 */
|
23
|
+
|
24
|
+
/* Increase the number of required fields that are tracked.
|
25
|
+
* A compiler warning will tell if you need this. */
|
26
|
+
/* #define PB_MAX_REQUIRED_FIELDS 256 */
|
27
|
+
|
28
|
+
/* Add support for tag numbers > 255 and fields larger than 255 bytes. */
|
29
|
+
/* #define PB_FIELD_16BIT 1 */
|
30
|
+
|
31
|
+
/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */
|
32
|
+
/* #define PB_FIELD_32BIT 1 */
|
33
|
+
|
34
|
+
/* Disable support for error messages in order to save some code space. */
|
35
|
+
/* #define PB_NO_ERRMSG 1 */
|
36
|
+
|
37
|
+
/* Disable support for custom streams (support only memory buffers). */
|
38
|
+
/* #define PB_BUFFER_ONLY 1 */
|
39
|
+
|
40
|
+
/* Switch back to the old-style callback function signature.
|
41
|
+
* This was the default until nanopb-0.2.1. */
|
42
|
+
/* #define PB_OLD_CALLBACK_STYLE */
|
43
|
+
|
44
|
+
|
45
|
+
/******************************************************************
|
46
|
+
* You usually don't need to change anything below this line. *
|
47
|
+
* Feel free to look around and use the defined macros, though. *
|
48
|
+
******************************************************************/
|
49
|
+
|
50
|
+
|
51
|
+
/* Version of the nanopb library. Just in case you want to check it in
|
52
|
+
* your own program. */
|
53
|
+
#define NANOPB_VERSION nanopb-0.3.5-dev
|
54
|
+
|
55
|
+
/* Include all the system headers needed by nanopb. You will need the
|
56
|
+
* definitions of the following:
|
57
|
+
* - strlen, memcpy, memset functions
|
58
|
+
* - [u]int8_t, [u]int16_t, [u]int32_t, [u]int64_t
|
59
|
+
* - size_t
|
60
|
+
* - bool
|
61
|
+
*
|
62
|
+
* If you don't have the standard header files, you can instead provide
|
63
|
+
* a custom header that defines or includes all this. In that case,
|
64
|
+
* define PB_SYSTEM_HEADER to the path of this file.
|
65
|
+
*/
|
66
|
+
#ifdef PB_SYSTEM_HEADER
|
67
|
+
#include PB_SYSTEM_HEADER
|
68
|
+
#else
|
69
|
+
#include <stdint.h>
|
70
|
+
#include <stddef.h>
|
71
|
+
#include <stdbool.h>
|
72
|
+
#include <string.h>
|
73
|
+
|
74
|
+
#ifdef PB_ENABLE_MALLOC
|
75
|
+
#include <stdlib.h>
|
76
|
+
#endif
|
77
|
+
#endif
|
78
|
+
|
79
|
+
/* Macro for defining packed structures (compiler dependent).
|
80
|
+
* This just reduces memory requirements, but is not required.
|
81
|
+
*/
|
82
|
+
#if defined(PB_NO_PACKED_STRUCTS)
|
83
|
+
/* Disable struct packing */
|
84
|
+
# define PB_PACKED_STRUCT_START
|
85
|
+
# define PB_PACKED_STRUCT_END
|
86
|
+
# define pb_packed
|
87
|
+
#elif defined(__GNUC__) || defined(__clang__)
|
88
|
+
/* For GCC and clang */
|
89
|
+
# define PB_PACKED_STRUCT_START
|
90
|
+
# define PB_PACKED_STRUCT_END
|
91
|
+
# define pb_packed __attribute__((packed))
|
92
|
+
#elif defined(__ICCARM__) || defined(__CC_ARM)
|
93
|
+
/* For IAR ARM and Keil MDK-ARM compilers */
|
94
|
+
# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)")
|
95
|
+
# define PB_PACKED_STRUCT_END _Pragma("pack(pop)")
|
96
|
+
# define pb_packed
|
97
|
+
#elif defined(_MSC_VER) && (_MSC_VER >= 1500)
|
98
|
+
/* For Microsoft Visual C++ */
|
99
|
+
# define PB_PACKED_STRUCT_START __pragma(pack(push, 1))
|
100
|
+
# define PB_PACKED_STRUCT_END __pragma(pack(pop))
|
101
|
+
# define pb_packed
|
102
|
+
#else
|
103
|
+
/* Unknown compiler */
|
104
|
+
# define PB_PACKED_STRUCT_START
|
105
|
+
# define PB_PACKED_STRUCT_END
|
106
|
+
# define pb_packed
|
107
|
+
#endif
|
108
|
+
|
109
|
+
/* Handly macro for suppressing unreferenced-parameter compiler warnings. */
|
110
|
+
#ifndef PB_UNUSED
|
111
|
+
#define PB_UNUSED(x) (void)(x)
|
112
|
+
#endif
|
113
|
+
|
114
|
+
/* Compile-time assertion, used for checking compatible compilation options.
|
115
|
+
* If this does not work properly on your compiler, use
|
116
|
+
* #define PB_NO_STATIC_ASSERT to disable it.
|
117
|
+
*
|
118
|
+
* But before doing that, check carefully the error message / place where it
|
119
|
+
* comes from to see if the error has a real cause. Unfortunately the error
|
120
|
+
* message is not always very clear to read, but you can see the reason better
|
121
|
+
* in the place where the PB_STATIC_ASSERT macro was called.
|
122
|
+
*/
|
123
|
+
#ifndef PB_NO_STATIC_ASSERT
|
124
|
+
#ifndef PB_STATIC_ASSERT
|
125
|
+
#define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1];
|
126
|
+
#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER)
|
127
|
+
#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER
|
128
|
+
#endif
|
129
|
+
#else
|
130
|
+
#define PB_STATIC_ASSERT(COND,MSG)
|
131
|
+
#endif
|
132
|
+
|
133
|
+
/* Number of required fields to keep track of. */
|
134
|
+
#ifndef PB_MAX_REQUIRED_FIELDS
|
135
|
+
#define PB_MAX_REQUIRED_FIELDS 64
|
136
|
+
#endif
|
137
|
+
|
138
|
+
#if PB_MAX_REQUIRED_FIELDS < 64
|
139
|
+
#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64).
|
140
|
+
#endif
|
141
|
+
|
142
|
+
/* List of possible field types. These are used in the autogenerated code.
|
143
|
+
* Least-significant 4 bits tell the scalar type
|
144
|
+
* Most-significant 4 bits specify repeated/required/packed etc.
|
145
|
+
*/
|
146
|
+
|
147
|
+
typedef uint8_t pb_type_t;
|
148
|
+
|
149
|
+
/**** Field data types ****/
|
150
|
+
|
151
|
+
/* Numeric types */
|
152
|
+
#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */
|
153
|
+
#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */
|
154
|
+
#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */
|
155
|
+
#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */
|
156
|
+
#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */
|
157
|
+
|
158
|
+
/* Marker for last packable field type. */
|
159
|
+
#define PB_LTYPE_LAST_PACKABLE 0x04
|
160
|
+
|
161
|
+
/* Byte array with pre-allocated buffer.
|
162
|
+
* data_size is the length of the allocated PB_BYTES_ARRAY structure. */
|
163
|
+
#define PB_LTYPE_BYTES 0x05
|
164
|
+
|
165
|
+
/* String with pre-allocated buffer.
|
166
|
+
* data_size is the maximum length. */
|
167
|
+
#define PB_LTYPE_STRING 0x06
|
168
|
+
|
169
|
+
/* Submessage
|
170
|
+
* submsg_fields is pointer to field descriptions */
|
171
|
+
#define PB_LTYPE_SUBMESSAGE 0x07
|
172
|
+
|
173
|
+
/* Extension pseudo-field
|
174
|
+
* The field contains a pointer to pb_extension_t */
|
175
|
+
#define PB_LTYPE_EXTENSION 0x08
|
176
|
+
|
177
|
+
/* Number of declared LTYPES */
|
178
|
+
#define PB_LTYPES_COUNT 9
|
179
|
+
#define PB_LTYPE_MASK 0x0F
|
180
|
+
|
181
|
+
/**** Field repetition rules ****/
|
182
|
+
|
183
|
+
#define PB_HTYPE_REQUIRED 0x00
|
184
|
+
#define PB_HTYPE_OPTIONAL 0x10
|
185
|
+
#define PB_HTYPE_REPEATED 0x20
|
186
|
+
#define PB_HTYPE_ONEOF 0x30
|
187
|
+
#define PB_HTYPE_MASK 0x30
|
188
|
+
|
189
|
+
/**** Field allocation types ****/
|
190
|
+
|
191
|
+
#define PB_ATYPE_STATIC 0x00
|
192
|
+
#define PB_ATYPE_POINTER 0x80
|
193
|
+
#define PB_ATYPE_CALLBACK 0x40
|
194
|
+
#define PB_ATYPE_MASK 0xC0
|
195
|
+
|
196
|
+
#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK)
|
197
|
+
#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK)
|
198
|
+
#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK)
|
199
|
+
|
200
|
+
/* Data type used for storing sizes of struct fields
|
201
|
+
* and array counts.
|
202
|
+
*/
|
203
|
+
#if defined(PB_FIELD_32BIT)
|
204
|
+
#define PB_SIZE_MAX ((uint32_t)-1)
|
205
|
+
typedef uint32_t pb_size_t;
|
206
|
+
typedef int32_t pb_ssize_t;
|
207
|
+
#elif defined(PB_FIELD_16BIT)
|
208
|
+
#define PB_SIZE_MAX ((uint16_t)-1)
|
209
|
+
typedef uint16_t pb_size_t;
|
210
|
+
typedef int16_t pb_ssize_t;
|
211
|
+
#else
|
212
|
+
#define PB_SIZE_MAX ((uint8_t)-1)
|
213
|
+
typedef uint8_t pb_size_t;
|
214
|
+
typedef int8_t pb_ssize_t;
|
215
|
+
#endif
|
216
|
+
|
217
|
+
/* This structure is used in auto-generated constants
|
218
|
+
* to specify struct fields.
|
219
|
+
* You can change field sizes if you need structures
|
220
|
+
* larger than 256 bytes or field tags larger than 256.
|
221
|
+
* The compiler should complain if your .proto has such
|
222
|
+
* structures. Fix that by defining PB_FIELD_16BIT or
|
223
|
+
* PB_FIELD_32BIT.
|
224
|
+
*/
|
225
|
+
PB_PACKED_STRUCT_START
|
226
|
+
typedef struct pb_field_s pb_field_t;
|
227
|
+
struct pb_field_s {
|
228
|
+
pb_size_t tag;
|
229
|
+
pb_type_t type;
|
230
|
+
pb_size_t data_offset; /* Offset of field data, relative to previous field. */
|
231
|
+
pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */
|
232
|
+
pb_size_t data_size; /* Data size in bytes for a single item */
|
233
|
+
pb_size_t array_size; /* Maximum number of entries in array */
|
234
|
+
|
235
|
+
/* Field definitions for submessage
|
236
|
+
* OR default value for all other non-array, non-callback types
|
237
|
+
* If null, then field will zeroed. */
|
238
|
+
const void *ptr;
|
239
|
+
} pb_packed;
|
240
|
+
PB_PACKED_STRUCT_END
|
241
|
+
|
242
|
+
/* Make sure that the standard integer types are of the expected sizes.
|
243
|
+
* All kinds of things may break otherwise.. atleast all fixed* types.
|
244
|
+
*
|
245
|
+
* If you get errors here, it probably means that your stdint.h is not
|
246
|
+
* correct for your platform.
|
247
|
+
*/
|
248
|
+
PB_STATIC_ASSERT(sizeof(int8_t) == 1, INT8_T_WRONG_SIZE)
|
249
|
+
PB_STATIC_ASSERT(sizeof(uint8_t) == 1, UINT8_T_WRONG_SIZE)
|
250
|
+
PB_STATIC_ASSERT(sizeof(int16_t) == 2, INT16_T_WRONG_SIZE)
|
251
|
+
PB_STATIC_ASSERT(sizeof(uint16_t) == 2, UINT16_T_WRONG_SIZE)
|
252
|
+
PB_STATIC_ASSERT(sizeof(int32_t) == 4, INT32_T_WRONG_SIZE)
|
253
|
+
PB_STATIC_ASSERT(sizeof(uint32_t) == 4, UINT32_T_WRONG_SIZE)
|
254
|
+
PB_STATIC_ASSERT(sizeof(int64_t) == 8, INT64_T_WRONG_SIZE)
|
255
|
+
PB_STATIC_ASSERT(sizeof(uint64_t) == 8, UINT64_T_WRONG_SIZE)
|
256
|
+
|
257
|
+
/* This structure is used for 'bytes' arrays.
|
258
|
+
* It has the number of bytes in the beginning, and after that an array.
|
259
|
+
* Note that actual structs used will have a different length of bytes array.
|
260
|
+
*/
|
261
|
+
#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; uint8_t bytes[n]; }
|
262
|
+
#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes))
|
263
|
+
|
264
|
+
struct pb_bytes_array_s {
|
265
|
+
pb_size_t size;
|
266
|
+
uint8_t bytes[1];
|
267
|
+
};
|
268
|
+
typedef struct pb_bytes_array_s pb_bytes_array_t;
|
269
|
+
|
270
|
+
/* This structure is used for giving the callback function.
|
271
|
+
* It is stored in the message structure and filled in by the method that
|
272
|
+
* calls pb_decode.
|
273
|
+
*
|
274
|
+
* The decoding callback will be given a limited-length stream
|
275
|
+
* If the wire type was string, the length is the length of the string.
|
276
|
+
* If the wire type was a varint/fixed32/fixed64, the length is the length
|
277
|
+
* of the actual value.
|
278
|
+
* The function may be called multiple times (especially for repeated types,
|
279
|
+
* but also otherwise if the message happens to contain the field multiple
|
280
|
+
* times.)
|
281
|
+
*
|
282
|
+
* The encoding callback will receive the actual output stream.
|
283
|
+
* It should write all the data in one call, including the field tag and
|
284
|
+
* wire type. It can write multiple fields.
|
285
|
+
*
|
286
|
+
* The callback can be null if you want to skip a field.
|
287
|
+
*/
|
288
|
+
typedef struct pb_istream_s pb_istream_t;
|
289
|
+
typedef struct pb_ostream_s pb_ostream_t;
|
290
|
+
typedef struct pb_callback_s pb_callback_t;
|
291
|
+
struct pb_callback_s {
|
292
|
+
#ifdef PB_OLD_CALLBACK_STYLE
|
293
|
+
/* Deprecated since nanopb-0.2.1 */
|
294
|
+
union {
|
295
|
+
bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg);
|
296
|
+
bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg);
|
297
|
+
} funcs;
|
298
|
+
#else
|
299
|
+
/* New function signature, which allows modifying arg contents in callback. */
|
300
|
+
union {
|
301
|
+
bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg);
|
302
|
+
bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
|
303
|
+
} funcs;
|
304
|
+
#endif
|
305
|
+
|
306
|
+
/* Free arg for use by callback */
|
307
|
+
void *arg;
|
308
|
+
};
|
309
|
+
|
310
|
+
/* Wire types. Library user needs these only in encoder callbacks. */
|
311
|
+
typedef enum {
|
312
|
+
PB_WT_VARINT = 0,
|
313
|
+
PB_WT_64BIT = 1,
|
314
|
+
PB_WT_STRING = 2,
|
315
|
+
PB_WT_32BIT = 5
|
316
|
+
} pb_wire_type_t;
|
317
|
+
|
318
|
+
/* Structure for defining the handling of unknown/extension fields.
|
319
|
+
* Usually the pb_extension_type_t structure is automatically generated,
|
320
|
+
* while the pb_extension_t structure is created by the user. However,
|
321
|
+
* if you want to catch all unknown fields, you can also create a custom
|
322
|
+
* pb_extension_type_t with your own callback.
|
323
|
+
*/
|
324
|
+
typedef struct pb_extension_type_s pb_extension_type_t;
|
325
|
+
typedef struct pb_extension_s pb_extension_t;
|
326
|
+
struct pb_extension_type_s {
|
327
|
+
/* Called for each unknown field in the message.
|
328
|
+
* If you handle the field, read off all of its data and return true.
|
329
|
+
* If you do not handle the field, do not read anything and return true.
|
330
|
+
* If you run into an error, return false.
|
331
|
+
* Set to NULL for default handler.
|
332
|
+
*/
|
333
|
+
bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
|
334
|
+
uint32_t tag, pb_wire_type_t wire_type);
|
335
|
+
|
336
|
+
/* Called once after all regular fields have been encoded.
|
337
|
+
* If you have something to write, do so and return true.
|
338
|
+
* If you do not have anything to write, just return true.
|
339
|
+
* If you run into an error, return false.
|
340
|
+
* Set to NULL for default handler.
|
341
|
+
*/
|
342
|
+
bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
|
343
|
+
|
344
|
+
/* Free field for use by the callback. */
|
345
|
+
const void *arg;
|
346
|
+
};
|
347
|
+
|
348
|
+
struct pb_extension_s {
|
349
|
+
/* Type describing the extension field. Usually you'll initialize
|
350
|
+
* this to a pointer to the automatically generated structure. */
|
351
|
+
const pb_extension_type_t *type;
|
352
|
+
|
353
|
+
/* Destination for the decoded data. This must match the datatype
|
354
|
+
* of the extension field. */
|
355
|
+
void *dest;
|
356
|
+
|
357
|
+
/* Pointer to the next extension handler, or NULL.
|
358
|
+
* If this extension does not match a field, the next handler is
|
359
|
+
* automatically called. */
|
360
|
+
pb_extension_t *next;
|
361
|
+
|
362
|
+
/* The decoder sets this to true if the extension was found.
|
363
|
+
* Ignored for encoding. */
|
364
|
+
bool found;
|
365
|
+
};
|
366
|
+
|
367
|
+
/* Memory allocation functions to use. You can define pb_realloc and
|
368
|
+
* pb_free to custom functions if you want. */
|
369
|
+
#ifdef PB_ENABLE_MALLOC
|
370
|
+
# ifndef pb_realloc
|
371
|
+
# define pb_realloc(ptr, size) realloc(ptr, size)
|
372
|
+
# endif
|
373
|
+
# ifndef pb_free
|
374
|
+
# define pb_free(ptr) free(ptr)
|
375
|
+
# endif
|
376
|
+
#endif
|
377
|
+
|
378
|
+
/* This is used to inform about need to regenerate .pb.h/.pb.c files. */
|
379
|
+
#define PB_PROTO_HEADER_VERSION 30
|
380
|
+
|
381
|
+
/* These macros are used to declare pb_field_t's in the constant array. */
|
382
|
+
/* Size of a structure member, in bytes. */
|
383
|
+
#define pb_membersize(st, m) (sizeof ((st*)0)->m)
|
384
|
+
/* Number of entries in an array. */
|
385
|
+
#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0]))
|
386
|
+
/* Delta from start of one member to the start of another member. */
|
387
|
+
#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2))
|
388
|
+
/* Marks the end of the field list */
|
389
|
+
#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0}
|
390
|
+
|
391
|
+
/* Macros for filling in the data_offset field */
|
392
|
+
/* data_offset for first field in a message */
|
393
|
+
#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1))
|
394
|
+
/* data_offset for subsequent fields */
|
395
|
+
#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2))
|
396
|
+
/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */
|
397
|
+
#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \
|
398
|
+
? PB_DATAOFFSET_FIRST(st, m1, m2) \
|
399
|
+
: PB_DATAOFFSET_OTHER(st, m1, m2))
|
400
|
+
|
401
|
+
/* Required fields are the simplest. They just have delta (padding) from
|
402
|
+
* previous field end, and the size of the field. Pointer is used for
|
403
|
+
* submessages and default values.
|
404
|
+
*/
|
405
|
+
#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \
|
406
|
+
{tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \
|
407
|
+
fd, 0, pb_membersize(st, m), 0, ptr}
|
408
|
+
|
409
|
+
/* Optional fields add the delta to the has_ variable. */
|
410
|
+
#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \
|
411
|
+
{tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
|
412
|
+
fd, \
|
413
|
+
pb_delta(st, has_ ## m, m), \
|
414
|
+
pb_membersize(st, m), 0, ptr}
|
415
|
+
|
416
|
+
/* Repeated fields have a _count field and also the maximum number of entries. */
|
417
|
+
#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \
|
418
|
+
{tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \
|
419
|
+
fd, \
|
420
|
+
pb_delta(st, m ## _count, m), \
|
421
|
+
pb_membersize(st, m[0]), \
|
422
|
+
pb_arraysize(st, m), ptr}
|
423
|
+
|
424
|
+
/* Allocated fields carry the size of the actual data, not the pointer */
|
425
|
+
#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \
|
426
|
+
{tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \
|
427
|
+
fd, 0, pb_membersize(st, m[0]), 0, ptr}
|
428
|
+
|
429
|
+
/* Optional fields don't need a has_ variable, as information would be redundant */
|
430
|
+
#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \
|
431
|
+
{tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \
|
432
|
+
fd, 0, pb_membersize(st, m[0]), 0, ptr}
|
433
|
+
|
434
|
+
/* Repeated fields have a _count field and a pointer to array of pointers */
|
435
|
+
#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \
|
436
|
+
{tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \
|
437
|
+
fd, pb_delta(st, m ## _count, m), \
|
438
|
+
pb_membersize(st, m[0]), 0, ptr}
|
439
|
+
|
440
|
+
/* Callbacks are much like required fields except with special datatype. */
|
441
|
+
#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \
|
442
|
+
{tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \
|
443
|
+
fd, 0, pb_membersize(st, m), 0, ptr}
|
444
|
+
|
445
|
+
#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \
|
446
|
+
{tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \
|
447
|
+
fd, 0, pb_membersize(st, m), 0, ptr}
|
448
|
+
|
449
|
+
#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \
|
450
|
+
{tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \
|
451
|
+
fd, 0, pb_membersize(st, m), 0, ptr}
|
452
|
+
|
453
|
+
/* Optional extensions don't have the has_ field, as that would be redundant. */
|
454
|
+
#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \
|
455
|
+
{tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
|
456
|
+
0, \
|
457
|
+
0, \
|
458
|
+
pb_membersize(st, m), 0, ptr}
|
459
|
+
|
460
|
+
#define PB_OPTEXT_POINTER(tag, st, m, fd, ltype, ptr) \
|
461
|
+
PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr)
|
462
|
+
|
463
|
+
#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \
|
464
|
+
PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr)
|
465
|
+
|
466
|
+
/* The mapping from protobuf types to LTYPEs is done using these macros. */
|
467
|
+
#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT
|
468
|
+
#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES
|
469
|
+
#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64
|
470
|
+
#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT
|
471
|
+
#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT
|
472
|
+
#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32
|
473
|
+
#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64
|
474
|
+
#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32
|
475
|
+
#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT
|
476
|
+
#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT
|
477
|
+
#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE
|
478
|
+
#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32
|
479
|
+
#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64
|
480
|
+
#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT
|
481
|
+
#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT
|
482
|
+
#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING
|
483
|
+
#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT
|
484
|
+
#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT
|
485
|
+
#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION
|
486
|
+
|
487
|
+
/* This is the actual macro used in field descriptions.
|
488
|
+
* It takes these arguments:
|
489
|
+
* - Field tag number
|
490
|
+
* - Field type: BOOL, BYTES, DOUBLE, ENUM, UENUM, FIXED32, FIXED64,
|
491
|
+
* FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64
|
492
|
+
* SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION
|
493
|
+
* - Field rules: REQUIRED, OPTIONAL or REPEATED
|
494
|
+
* - Allocation: STATIC or CALLBACK
|
495
|
+
* - Placement: FIRST or OTHER, depending on if this is the first field in structure.
|
496
|
+
* - Message name
|
497
|
+
* - Field name
|
498
|
+
* - Previous field name (or field name again for first field)
|
499
|
+
* - Pointer to default value or submsg fields.
|
500
|
+
*/
|
501
|
+
|
502
|
+
#define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
|
503
|
+
PB_ ## rules ## _ ## allocation(tag, message, field, \
|
504
|
+
PB_DATAOFFSET_ ## placement(message, field, prevfield), \
|
505
|
+
PB_LTYPE_MAP_ ## type, ptr)
|
506
|
+
|
507
|
+
/* Field description for oneof fields. This requires taking into account the
|
508
|
+
* union name also, that's why a separate set of macros is needed.
|
509
|
+
*/
|
510
|
+
#define PB_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \
|
511
|
+
{tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \
|
512
|
+
fd, pb_delta(st, which_ ## u, u.m), \
|
513
|
+
pb_membersize(st, u.m), 0, ptr}
|
514
|
+
|
515
|
+
#define PB_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \
|
516
|
+
{tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \
|
517
|
+
fd, pb_delta(st, which_ ## u, u.m), \
|
518
|
+
pb_membersize(st, u.m[0]), 0, ptr}
|
519
|
+
|
520
|
+
#define PB_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
|
521
|
+
PB_ ## rules ## _ ## allocation(union_name, tag, message, field, \
|
522
|
+
PB_DATAOFFSET_ ## placement(message, union_name.field, prevfield), \
|
523
|
+
PB_LTYPE_MAP_ ## type, ptr)
|
524
|
+
|
525
|
+
/* These macros are used for giving out error messages.
|
526
|
+
* They are mostly a debugging aid; the main error information
|
527
|
+
* is the true/false return value from functions.
|
528
|
+
* Some code space can be saved by disabling the error
|
529
|
+
* messages if not used.
|
530
|
+
*
|
531
|
+
* PB_SET_ERROR() sets the error message if none has been set yet.
|
532
|
+
* msg must be a constant string literal.
|
533
|
+
* PB_GET_ERROR() always returns a pointer to a string.
|
534
|
+
* PB_RETURN_ERROR() sets the error and returns false from current
|
535
|
+
* function.
|
536
|
+
*/
|
537
|
+
#ifdef PB_NO_ERRMSG
|
538
|
+
#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream)
|
539
|
+
#define PB_GET_ERROR(stream) "(errmsg disabled)"
|
540
|
+
#else
|
541
|
+
#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg))
|
542
|
+
#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)")
|
543
|
+
#endif
|
544
|
+
|
545
|
+
#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false
|
546
|
+
|
547
|
+
#endif
|