diff --git a/test/extensions/filters/network/thrift_proxy/BUILD b/test/extensions/filters/network/thrift_proxy/BUILD index 0d842f34a5aca..24eb2f1937035 100644 --- a/test/extensions/filters/network/thrift_proxy/BUILD +++ b/test/extensions/filters/network/thrift_proxy/BUILD @@ -333,7 +333,6 @@ envoy_extension_cc_test( "//test/extensions/filters/network/thrift_proxy/driver:generate_fixture", ], extension_name = "envoy.filters.network.thrift_proxy", - tags = ["fails_on_windows"], deps = [ ":integration_lib", ":utility_lib", @@ -350,7 +349,6 @@ envoy_extension_cc_test( "//test/extensions/filters/network/thrift_proxy/driver:generate_fixture", ], extension_name = "envoy.filters.network.thrift_proxy", - tags = ["fails_on_windows"], deps = [ ":integration_lib", ":utility_lib", diff --git a/test/extensions/filters/network/thrift_proxy/driver/BUILD b/test/extensions/filters/network/thrift_proxy/driver/BUILD index 4e5d0f47d1d4e..e27580ed82cd7 100644 --- a/test/extensions/filters/network/thrift_proxy/driver/BUILD +++ b/test/extensions/filters/network/thrift_proxy/driver/BUILD @@ -1,5 +1,6 @@ load("@rules_python//python:defs.bzl", "py_binary") load("//bazel:envoy_build_system.bzl", "envoy_package") +load("@thrift_pip3//:requirements.bzl", "requirement") licenses(["notice"]) # Apache 2 @@ -23,6 +24,7 @@ py_binary( "//test/extensions/filters/network/thrift_proxy/driver/finagle:finagle_lib", "//test/extensions/filters/network/thrift_proxy/driver/generated/example:example_lib", "@com_github_twitter_common_rpc//:twitter_common_rpc", + requirement("six"), ], ) @@ -35,5 +37,6 @@ py_binary( "//test/extensions/filters/network/thrift_proxy/driver/finagle:finagle_lib", "//test/extensions/filters/network/thrift_proxy/driver/generated/example:example_lib", "@com_github_twitter_common_rpc//:twitter_common_rpc", + requirement("six"), ], ) diff --git a/test/extensions/filters/network/thrift_proxy/driver/client.py b/test/extensions/filters/network/thrift_proxy/driver/client.py index f323cd7f3a49c..544e5acff16a3 100755 --- a/test/extensions/filters/network/thrift_proxy/driver/client.py +++ b/test/extensions/filters/network/thrift_proxy/driver/client.py @@ -14,6 +14,11 @@ from fbthrift import THeaderTransport from twitter.common.rpc.finagle.protocol import TFinagleProtocol +# On Windows we run this test on Python3 +if sys.version_info[0] != 2: + sys.stdin.reconfigure(encoding='utf-8') + sys.stdout.reconfigure(encoding='utf-8') + class TRecordingTransport(TTransport.TTransportBase): diff --git a/test/extensions/filters/network/thrift_proxy/driver/generate_fixture.sh b/test/extensions/filters/network/thrift_proxy/driver/generate_fixture.sh index a4c58cb798d84..6304d28c83141 100755 --- a/test/extensions/filters/network/thrift_proxy/driver/generate_fixture.sh +++ b/test/extensions/filters/network/thrift_proxy/driver/generate_fixture.sh @@ -7,20 +7,11 @@ set -e function usage() { - echo "Usage: $0 -s [multiplex-service] -H [headers] method [param...]" + echo "Usage: $0 -s [multiplex-service] -H [headers] -T [TempPath] method [param...]" echo "where mode is success, exception, or idl-exception" exit 1 } -FIXTURE_DIR="${TEST_TMPDIR}" -mkdir -p "${FIXTURE_DIR}" - -DRIVER_DIR="${TEST_SRCDIR}/envoy/test/extensions/filters/network/thrift_proxy/driver" - -if [[ -z "${TEST_UDSDIR}" ]]; then - TEST_UDSDIR=$(mktemp -d /tmp/envoy_test_thrift.XXXXXX) -fi - MODE="$1" TRANSPORT="$2" PROTOCOL="$3" @@ -35,7 +26,8 @@ fi MULTIPLEX= HEADERS= -while getopts ":s:H:" opt; do +TEST_TMPDIR= +while getopts ":s:H:T:" opt; do case ${opt} in s) MULTIPLEX=$OPTARG @@ -43,7 +35,9 @@ while getopts ":s:H:" opt; do H) HEADERS=$OPTARG ;; - + T) + TEST_TMPDIR=$OPTARG + ;; \?) echo "Invalid Option: -$OPTARG" >&2 exit 1 @@ -62,11 +56,33 @@ if [[ "${METHOD}" == "" ]]; then fi shift -SOCKET="${TEST_UDSDIR}/fixture.sock" -rm -f "${SOCKET}" +FIXTURE_DIR="${TEST_TMPDIR}" +mkdir -p "${FIXTURE_DIR}" + +DRIVER_DIR="${TEST_SRCDIR}/envoy/test/extensions/filters/network/thrift_proxy/driver" + +# On UNIX python supports AF_UNIX socket which are more reliable and efficient for communication +# between the client and the server, so we use it. On Windows, we find a random unused port +# on and let the communication happen via TCP. +SOCKET="" +if [[ "$OSTYPE" == "msys" ]]; then + while + port=$(shuf -n 1 -i 49152-65535) + netstat -atn | grep -q "$port" >> /dev/null + do + continue + done + SOCKET="127.0.0.1:${port}" +else + if [[ -z "${TEST_UDSDIR}" ]]; then + TEST_UDSDIR=$(mktemp -d /tmp/envoy_test_thrift.XXXXXX) + fi + SOCKET="${TEST_UDSDIR}/fixture.sock" + rm -f "${SOCKET}" +fi +echo "Using address ${SOCKET}" SERVICE_FLAGS=("--addr" "${SOCKET}" - "--unix" "--response" "${MODE}" "--transport" "${TRANSPORT}" "--protocol" "${PROTOCOL}") @@ -83,26 +99,41 @@ else fi # start server -"${DRIVER_DIR}/server" "${SERVICE_FLAGS[@]}" & -SERVER_PID="$!" +if [[ "$OSTYPE" == "msys" ]]; then + echo "${SERVICE_FLAGS[@]}" + "${DRIVER_DIR}/server.exe" "${SERVICE_FLAGS[@]}" & + SERVER_PID="$!" +else + SERVICE_FLAGS+=("--unix") + "${DRIVER_DIR}/server" "${SERVICE_FLAGS[@]}" & + SERVER_PID="$!" + while [[ ! -a "${SOCKET}" ]]; do + sleep 0.1 + + if ! kill -0 "${SERVER_PID}"; then + echo "server failed to start" + exit 1 + fi + done +fi trap 'kill ${SERVER_PID}' EXIT; -while [[ ! -a "${SOCKET}" ]]; do - sleep 0.1 - - if ! kill -0 "${SERVER_PID}"; then - echo "server failed to start" - exit 1 - fi -done +CLIENT_COMMAND="" +if [[ "$OSTYPE" == "msys" ]]; then + CLIENT_COMMAND="${DRIVER_DIR}/client.exe" +else + CLIENT_COMMAND="${DRIVER_DIR}/client" +fi if [[ -n "$HEADERS" ]]; then SERVICE_FLAGS+=("--headers") SERVICE_FLAGS+=("$HEADERS") fi -"${DRIVER_DIR}/client" "${SERVICE_FLAGS[@]}" \ - --request "${REQUEST_FILE}" \ - --response "${RESPONSE_FILE}" \ - "${METHOD}" "$@" +echo "${METHOD}" "$@" + +$CLIENT_COMMAND "${SERVICE_FLAGS[@]}" \ + --request "${REQUEST_FILE}" \ + --response "${RESPONSE_FILE}" \ + "${METHOD}" "$@" diff --git a/test/extensions/filters/network/thrift_proxy/driver/server.py b/test/extensions/filters/network/thrift_proxy/driver/server.py index e4d5a5c7cc5b9..650280919eaa0 100755 --- a/test/extensions/filters/network/thrift_proxy/driver/server.py +++ b/test/extensions/filters/network/thrift_proxy/driver/server.py @@ -15,6 +15,11 @@ from fbthrift import THeaderTransport from finagle import TFinagleServerProcessor, TFinagleServerProtocol +# On Windows we run this test on Python3 +if sys.version_info[0] != 2: + sys.stdin.reconfigure(encoding='utf-8') + sys.stdout.reconfigure(encoding='utf-8') + class SuccessHandler: diff --git a/test/extensions/filters/network/thrift_proxy/integration.cc b/test/extensions/filters/network/thrift_proxy/integration.cc index 62f33950f4744..cd907b4e084a2 100644 --- a/test/extensions/filters/network/thrift_proxy/integration.cc +++ b/test/extensions/filters/network/thrift_proxy/integration.cc @@ -80,6 +80,10 @@ void BaseThriftIntegrationTest::preparePayloads(const PayloadOptions& options, args.push_back(absl::StrJoin(headers, ",")); } + auto temp_path = TestEnvironment::temporaryDirectory(); + args.push_back("-T"); + args.push_back(temp_path); + args.push_back(options.method_name_); std::copy(options.method_args_.begin(), options.method_args_.end(), std::back_inserter(args)); diff --git a/test/extensions/filters/network/thrift_proxy/integration_test.cc b/test/extensions/filters/network/thrift_proxy/integration_test.cc index 2766bf61d5403..c3ea956fb23fd 100644 --- a/test/extensions/filters/network/thrift_proxy/integration_test.cc +++ b/test/extensions/filters/network/thrift_proxy/integration_test.cc @@ -401,6 +401,9 @@ INSTANTIATE_TEST_SUITE_P(FramedTwitter, ThriftTwitterConnManagerIntegrationTest, // Because of the protocol upgrade requests and the difficulty of separating them, we test this // protocol independently. TEST_P(ThriftTwitterConnManagerIntegrationTest, Success) { +// This test relies on an old Apache Thrift Python package +// that is only available in Python2. Disabling the test on Windows. +#ifndef WIN32 initializeCall(DriverMode::Success); uint32_t upgrade_request_size = request_bytes_.peekBEInt() + 4; @@ -457,6 +460,7 @@ TEST_P(ThriftTwitterConnManagerIntegrationTest, Success) { EXPECT_EQ(2U, counter->value()); counter = test_server_->counter("thrift.thrift_stats.response_success"); EXPECT_EQ(2U, counter->value()); +#endif } } // namespace ThriftProxy