diff --git a/bazel/envoy_mobile_dependencies.bzl b/bazel/envoy_mobile_dependencies.bzl index cc850eca68..c80e2fa599 100644 --- a/bazel/envoy_mobile_dependencies.bzl +++ b/bazel/envoy_mobile_dependencies.bzl @@ -61,6 +61,7 @@ def kotlin_dependencies(): maven_install( artifacts = [ "com.google.code.findbugs:jsr305:3.0.2", + "com.google.flatbuffers:flatbuffers-java:2.0.3", # Kotlin "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.11", "androidx.recyclerview:recyclerview:1.1.0", diff --git a/bazel/envoy_mobile_repositories.bzl b/bazel/envoy_mobile_repositories.bzl index 0fda43c24d..179dc670d1 100644 --- a/bazel/envoy_mobile_repositories.bzl +++ b/bazel/envoy_mobile_repositories.bzl @@ -10,6 +10,14 @@ def envoy_mobile_repositories(): urls = ["https://github.com/google/bazel-common/archive/413b433b91f26dbe39cdbc20f742ad6555dd1e27.zip"], ) + http_archive( + name = "swift_flatbuffers", + sha256 = "ffd68aebdfb300c9e82582ea38bf4aa9ce65c77344c94d5047f3be754cc756ea", + build_file = "@envoy_mobile//bazel:flatbuffers.BUILD", + strip_prefix = "flatbuffers-2.0.0", + urls = ["https://github.com/google/flatbuffers/archive/refs/tags/v2.0.0.zip"], + ) + upstream_envoy_overrides() swift_repos() kotlin_repos() diff --git a/bazel/flatbuffers.BUILD b/bazel/flatbuffers.BUILD new file mode 100644 index 0000000000..baf4dbe92c --- /dev/null +++ b/bazel/flatbuffers.BUILD @@ -0,0 +1,13 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +licenses(["notice"]) # Apache 2 + +package( + default_visibility = ["//visibility:public"], +) + +swift_library( + name = "FlatBuffers", + srcs = glob(["swift/Sources/FlatBuffers/*.swift"]), + module_name = "FlatBuffers", +) diff --git a/bazel/flatbuffers.bzl b/bazel/flatbuffers.bzl new file mode 100644 index 0000000000..5af1c20622 --- /dev/null +++ b/bazel/flatbuffers.bzl @@ -0,0 +1,32 @@ +load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library", "flatbuffer_library_public") +load("@envoy_mobile//bazel:kotlin_lib.bzl", "envoy_mobile_kt_library") + +def envoy_mobile_flatbuffers_library(name, srcs, namespace, types): + flatbuffer_cc_library( + name = "{}_fb_cc_lib".format(name), + srcs = srcs, + ) + + directory_path = namespace.replace(".", "/") + kotlin_files = [directory_path + "/" + t + ".kt" for t in types] + flatbuffer_library_public( + name = "{}_fb_kt_srcs".format(name), + srcs = srcs, + # TODO(snowp): For some reason I can't get this to work with just one output file for java. For now we can avoid dealing with this since basically all use cases of this would result in multiple files for Java. + outs = kotlin_files, + language_flag = "--kotlin", + ) + + envoy_mobile_kt_library( + name = "{}_fb_kt_lib".format(name), + srcs = [":{}_fb_kt_srcs".format(name)], + deps = ["@maven//:com_google_flatbuffers_flatbuffers_java"], + ) + + swift_outputs = ["{}_generated.swift".format(f.replace(".fbs", "")) for f in srcs] + flatbuffer_library_public( + name = "{}_fb_swift_srcs".format(name), + srcs = srcs, + outs = swift_outputs, + language_flag = "--swift", + ) diff --git a/library/swift/BUILD b/library/swift/BUILD index 35e91c0a80..f4cc2cfa45 100644 --- a/library/swift/BUILD +++ b/library/swift/BUILD @@ -49,6 +49,7 @@ swift_library( module_name = "Envoy", private_deps = [ "//library/objective-c:envoy_engine_objc_lib", + "@swift_flatbuffers//:FlatBuffers", "@envoy_mobile_extra_swift_sources//:extra_private_dep", ], visibility = ["//visibility:public"], diff --git a/test/fbs/BUILD b/test/fbs/BUILD new file mode 100644 index 0000000000..c3048ea724 --- /dev/null +++ b/test/fbs/BUILD @@ -0,0 +1,16 @@ +load("@envoy//bazel:envoy_build_system.bzl", "envoy_package") +load("//bazel:flatbuffers.bzl", "envoy_mobile_flatbuffers_library") + +licenses(["notice"]) # Apache 2 + +envoy_package() + +envoy_mobile_flatbuffers_library( + name = "test", + srcs = ["test.fbs"], + namespace = "Test.Nested", + types = [ + "SomeType", + "SomeOtherType", + ], +) diff --git a/test/fbs/test.fbs b/test/fbs/test.fbs new file mode 100644 index 0000000000..f1de5813c0 --- /dev/null +++ b/test/fbs/test.fbs @@ -0,0 +1,10 @@ +namespace Test.Nested; + +table SomeType { +} + +table SomeOtherType { + +} + +root_type SomeType; diff --git a/test/kotlin/io/envoyproxy/envoymobile/BUILD b/test/kotlin/io/envoyproxy/envoymobile/BUILD index c6d034925e..7140a39e9b 100644 --- a/test/kotlin/io/envoyproxy/envoymobile/BUILD +++ b/test/kotlin/io/envoyproxy/envoymobile/BUILD @@ -16,6 +16,16 @@ envoy_mobile_kt_test( ], ) +envoy_mobile_kt_test( + name = "flatbuffers_test", + srcs = [ + "FlatBuffersTest.kt", + ], + deps = [ + "//test/fbs:test_fb_kt_lib", + ], +) + envoy_mobile_kt_test( name = "grpc_request_headers_builder_test", srcs = [ diff --git a/test/kotlin/io/envoyproxy/envoymobile/FlatBuffersTest.kt b/test/kotlin/io/envoyproxy/envoymobile/FlatBuffersTest.kt new file mode 100644 index 0000000000..65d8e674ac --- /dev/null +++ b/test/kotlin/io/envoyproxy/envoymobile/FlatBuffersTest.kt @@ -0,0 +1,16 @@ +package io.envoyproxy.envoymobile + +import Test.Nested.SomeType +import com.google.flatbuffers.FlatBufferBuilder +import org.junit.Test + +class FlatBuffersTest { + + @Test + fun `flatbuffers construction`() { + // This test doesn't really test any functionality, just demonstrates that we are able to utilize flatbuffers pending + // real usage within the code base. + val s = SomeType() + val f = FlatBufferBuilder() + } +} diff --git a/test/swift/integration/BUILD b/test/swift/integration/BUILD index 3294c1c0ef..d8ca9cf690 100644 --- a/test/swift/integration/BUILD +++ b/test/swift/integration/BUILD @@ -40,6 +40,18 @@ envoy_mobile_swift_test( ], ) +envoy_mobile_swift_test( + name = "flatbuffer_test", + srcs = [ + "FlatBufferTest.swift", + ] + [ + "//test/fbs:test_fb_swift_srcs", + ], + deps = [ + "@swift_flatbuffers//:FlatBuffers", + ], +) + envoy_cc_library( name = "test_extensions_cc", srcs = [ diff --git a/test/swift/integration/FlatBufferTest.swift b/test/swift/integration/FlatBufferTest.swift new file mode 100644 index 0000000000..f7b697d87e --- /dev/null +++ b/test/swift/integration/FlatBufferTest.swift @@ -0,0 +1,12 @@ +import Envoy +import FlatBuffers +import XCTest + +final class FlatBufferTest: XCTestCase { + func testCreateFlatBuffer() { + // This test simply verifies that we can import both the generated types as + // well as upstream FlatBuffers. + _ = Test_Nested_SomeTypeT() + _ = FlatBufferBuilder() + } +}