Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: correctly recognize oneofs and include them in the testing #469

Merged
merged 2 commits into from
Jun 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,25 @@ task :bin do
end
end

namespace :bin do
task :garbage do
Dir.chdir "shared" do
Bundler.with_unbundled_env do
puts "Running binary input file generation for garbage"
sh "bundle exec rake gen:garbage"
end
end
end
task :showcase do
Dir.chdir "shared" do
Bundler.with_unbundled_env do
puts "Running binary input file generation for showcase"
sh "bundle exec rake gen:showcase"
end
end
end
end

desc "Runs file generation for all gems using the binary input files."
task :gen do
gem_dirs.each do |gem|
Expand All @@ -79,6 +98,25 @@ task :gen do
end
end

namespace :gen do
task :garbage do
Dir.chdir "gapic-generator" do
Bundler.with_unbundled_env do
puts "Running file generation for garbage"
sh "bundle exec rake gen:garbage"
end
end
end
task :showcase do
Dir.chdir "gapic-generator" do
Bundler.with_unbundled_env do
puts "Running file generation for showcase"
sh "bundle exec rake gen:showcase"
end
end
end
end

desc "Runs rubocop for all gems."
task :rubocop do
gem_dirs.each do |gem|
Expand Down
4 changes: 4 additions & 0 deletions gapic-generator/lib/gapic/presenters/field_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ def map?
@field.map?
end

def oneof?
@field.oneof?
end

protected

def field_doc_types field, output
Expand Down
5 changes: 5 additions & 0 deletions gapic-generator/lib/gapic/presenters/method_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ def fields_with_first_oneof
have_oneof = []

@method.input.fields.each do |field|
unless field.oneof?
selected_fields << field
next
end

idx = field.oneof_index
selected_fields << field unless have_oneof.include? idx
have_oneof << idx
Expand Down
9 changes: 9 additions & 0 deletions gapic-generator/lib/gapic/schema/wrappers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,15 @@ def optional?
field_behavior.include? Google::Api::FieldBehavior::OPTIONAL
end

# Denotes a field as a part of oneof.
# oneof_index is an int field so it'll be 0 by default for every field
# and an index in the message's oneof table for the oneof fields
# but since the indexes in the message's oneof table start with 0 as well
# we need this to determine whether the field is a part of the oneof
def oneof?
@descriptor.field? :oneof_index
end

# Denotes a field as required. This indicates that the field **must** be
# provided as part of the request, and failure to do so will cause an
# error (usually `INVALID_ARGUMENT`).
Expand Down
2 changes: 1 addition & 1 deletion gapic-generator/test/gapic/annotations/enum_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_enum
message = garbage.messages.find { |s| s.name == "TypicalGarbage" }
refute_nil message

assert_equal 14, message.fields.count
assert_equal 21, message.fields.count

assert_equal "enum", message.fields[12].name
assert_equal Google::Protobuf::FieldDescriptorProto::Type::TYPE_ENUM, message.fields[12].type
Expand Down
2 changes: 1 addition & 1 deletion gapic-generator/test/gapic/annotations/field_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_garbage_TypicalGarbage
message = garbage.messages.find { |s| s.name == "TypicalGarbage" }
refute_nil message

assert_equal 14, message.fields.count
assert_equal 21, message.fields.count

assert_equal "name", message.fields[0].name
refute_nil message.fields[0].options
Expand Down
32 changes: 32 additions & 0 deletions gapic-generator/test/gapic/presenters/field_presenter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def test_typical_garbage_name_field
assert_equal "\"hello world\"", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
refute fp.oneof?
end

def test_typical_garbage_int_fields
Expand All @@ -44,6 +45,7 @@ def test_typical_garbage_int_fields
assert_equal "42", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
refute fp.oneof?
end
end

Expand All @@ -57,6 +59,7 @@ def test_typical_garbage_bool_field
assert_equal "true", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
refute fp.oneof?
end

def test_typical_garbage_numeric_fields
Expand All @@ -70,6 +73,7 @@ def test_typical_garbage_numeric_fields
assert_equal "3.5", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
refute fp.oneof?
end
end

Expand All @@ -83,6 +87,7 @@ def test_typical_garbage_bytes_field
assert_equal "\"hello world\"", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
refute fp.oneof?
end

def test_typical_garbage_msg_field
Expand All @@ -95,6 +100,7 @@ def test_typical_garbage_msg_field
assert_equal "{}", fp.default_value
assert_equal ".endless.trash.forever.GarbageMap", fp.type_name
assert_equal "::So::Much::Trash::GarbageMap", fp.type_name_full
refute fp.oneof?
end

def test_typical_garbage_enum_field
Expand All @@ -107,5 +113,31 @@ def test_typical_garbage_enum_field
assert_equal ":DEFAULT_GARBAGE", fp.default_value
assert_equal ".endless.trash.forever.GarbageEnum", fp.type_name
assert_equal "::So::Much::Trash::GarbageEnum", fp.type_name_full
refute fp.oneof?
end

def test_typical_garbage_oneof_singular_field
fp = typical_garbage "oneof_singular_str"
assert_equal "oneof_singular_str", fp.name
assert_equal "@!attribute [rw] oneof_singular_str", fp.doc_attribute_type
assert_equal "::String", fp.output_doc_types
assert_equal fp.doc_description, "This is a one-field oneof's string field.\n"
assert_equal "\"hello world\"", fp.default_value
assert_equal "", fp.type_name
assert_nil fp.type_name_full
assert fp.oneof?
end

def test_typical_garbage_enum_field
fp = typical_garbage "oneof_multiple_enum"

assert_equal "oneof_multiple_enum", fp.name
assert_equal "@!attribute [rw] oneof_multiple_enum", fp.doc_attribute_type
assert_equal "::So::Much::Trash::GarbageEnum", fp.output_doc_types
assert_equal fp.doc_description, "This is a multiple-field oneof's enum field.\n"
assert_equal ":DEFAULT_GARBAGE", fp.default_value
assert_equal ".endless.trash.forever.GarbageEnum", fp.type_name
assert_equal "::So::Much::Trash::GarbageEnum", fp.type_name_full
assert fp.oneof?
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ def test_garbage_GetSpecificGarbage
assert_equal presenter.doc_description, "Retrieves a SpecificGarbage resource.\n"
end

def test_garbage_GetTypical
presenter = method_presenter :garbage, "GarbageService", "GetTypicalGarbage"

assert_equal "get_typical_garbage", presenter.name
assert_equal 21, presenter.fields.length
assert_equal 17, presenter.fields_with_first_oneof.length
end

def test_garbage_GetNestedGarbage
presenter = method_presenter :garbage, "GarbageService", "GetNestedGarbage"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def test_name
def test_methods
refute_empty presenter.methods
presenter.methods.each { |ref| assert_kind_of Gapic::Presenters::MethodPresenter, ref }
exp_method_names = ["get_empty_garbage", "get_simple_garbage", "get_specific_garbage", "get_nested_garbage", "get_repeated_garbage", "get_typical_garbage", "get_complex_garbage", "get_garbage_node", "get_paged_garbage", "long_running_garbage", "client_garbage", "server_garbage", "bidi_garbage", "call_send"]
exp_method_names = ["get_empty_garbage", "get_simple_garbage", "get_specific_garbage", "get_nested_garbage", "get_repeated_garbage", "get_typical_garbage", "get_typical_garbage_by_request", "get_complex_garbage", "get_garbage_node", "get_paged_garbage", "long_running_garbage", "client_garbage", "server_garbage", "bidi_garbage", "call_send"]
assert_equal exp_method_names, presenter.methods.map(&:name)
end

Expand Down
Binary file modified shared/input/garbage_desc.bin
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -1163,11 +1163,15 @@ def test_purge_products

# Create request parameters for a unary method.
product_set_purge_config = {}
parent = "hello world"
force = true

purge_products_client_stub = ClientStub.new grpc_response, grpc_operation do |name, request, options:|
assert_equal :purge_products, name
assert_kind_of ::Google::Cloud::Vision::V1::PurgeProductsRequest, request
assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Cloud::Vision::V1::ProductSetPurgeConfig), request.product_set_purge_config
assert_equal "hello world", request.parent
assert_equal true, request.force
refute_nil options
end

Expand All @@ -1178,35 +1182,35 @@ def test_purge_products
end

# Use hash object
client.purge_products({ product_set_purge_config: product_set_purge_config }) do |response, operation|
client.purge_products({ product_set_purge_config: product_set_purge_config, parent: parent, force: force }) do |response, operation|
assert_kind_of Gapic::Operation, response
assert_equal grpc_response, response.grpc_op
assert_equal grpc_operation, operation
end

# Use named arguments
client.purge_products product_set_purge_config: product_set_purge_config do |response, operation|
client.purge_products product_set_purge_config: product_set_purge_config, parent: parent, force: force do |response, operation|
assert_kind_of Gapic::Operation, response
assert_equal grpc_response, response.grpc_op
assert_equal grpc_operation, operation
end

# Use protobuf object
client.purge_products ::Google::Cloud::Vision::V1::PurgeProductsRequest.new(product_set_purge_config: product_set_purge_config) do |response, operation|
client.purge_products ::Google::Cloud::Vision::V1::PurgeProductsRequest.new(product_set_purge_config: product_set_purge_config, parent: parent, force: force) do |response, operation|
assert_kind_of Gapic::Operation, response
assert_equal grpc_response, response.grpc_op
assert_equal grpc_operation, operation
end

# Use hash object with options
client.purge_products({ product_set_purge_config: product_set_purge_config }, grpc_options) do |response, operation|
client.purge_products({ product_set_purge_config: product_set_purge_config, parent: parent, force: force }, grpc_options) do |response, operation|
assert_kind_of Gapic::Operation, response
assert_equal grpc_response, response.grpc_op
assert_equal grpc_operation, operation
end

# Use protobuf object with options
client.purge_products ::Google::Cloud::Vision::V1::PurgeProductsRequest.new(product_set_purge_config: product_set_purge_config), grpc_options do |response, operation|
client.purge_products ::Google::Cloud::Vision::V1::PurgeProductsRequest.new(product_set_purge_config: product_set_purge_config, parent: parent, force: force), grpc_options do |response, operation|
assert_kind_of Gapic::Operation, response
assert_equal grpc_response, response.grpc_op
assert_equal grpc_operation, operation
Expand Down
13 changes: 13 additions & 0 deletions shared/output/gapic/templates/garbage/lib/garbage/garbage_pb.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading