[EventEngine] Refactoring the EventEngine Test Suite: Part 1 (#32127)

* Add back EventEngine test suite tools (echo binary)

This reverts commit d5c12195a2.

* more refactoring

* fix

* Automated change: Fix sanity tests

* fix

* fix posix oracle build def

* fix FuzzingEventEngine includes

* sanitize

* tidy and rm DNS

* fix cfstream includes

* header guards

* format & fix deps

* fix

* fix

* iwyu

* fix

* remove redundant code

* reviewer feedback

Co-authored-by: drfloob <drfloob@users.noreply.github.com>
pull/32189/head
AJ Heller 2 years ago committed by GitHub
parent e8e9514a11
commit 3980ed706a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 54
      CMakeLists.txt
  2. 2
      bazel/grpc_build_system.bzl
  3. 93
      build_autogenerated.yaml
  4. 22
      test/core/event_engine/BUILD
  5. 14
      test/core/event_engine/event_engine_test_utils.cc
  6. 39
      test/core/event_engine/event_engine_test_utils.h
  7. 8
      test/core/event_engine/posix/BUILD
  8. 4
      test/core/event_engine/posix/posix_endpoint_test.cc
  9. 2
      test/core/event_engine/posix/posix_event_engine_connect_test.cc
  10. 141
      test/core/event_engine/test_suite/BUILD
  11. 48
      test/core/event_engine/test_suite/README.md
  12. 4
      test/core/event_engine/test_suite/cf_event_engine_test.cc
  13. 2
      test/core/event_engine/test_suite/event_engine_test_framework.cc
  14. 6
      test/core/event_engine/test_suite/event_engine_test_framework.h
  15. 4
      test/core/event_engine/test_suite/fuzzing_event_engine_test.cc
  16. 61
      test/core/event_engine/test_suite/posix/BUILD
  17. 2
      test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
  18. 8
      test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
  19. 4
      test/core/event_engine/test_suite/posix/oracle_event_engine_posix_test.cc
  20. 10
      test/core/event_engine/test_suite/posix_event_engine_test.cc
  21. 88
      test/core/event_engine/test_suite/tests/BUILD
  22. 19
      test/core/event_engine/test_suite/tests/client_test.cc
  23. 25
      test/core/event_engine/test_suite/tests/client_test.h
  24. 10
      test/core/event_engine/test_suite/tests/dns_test.cc
  25. 25
      test/core/event_engine/test_suite/tests/dns_test.h
  26. 12
      test/core/event_engine/test_suite/tests/server_test.cc
  27. 25
      test/core/event_engine/test_suite/tests/server_test.h
  28. 10
      test/core/event_engine/test_suite/tests/timer_test.cc
  29. 25
      test/core/event_engine/test_suite/tests/timer_test.h
  30. 70
      test/core/event_engine/test_suite/tools/BUILD
  31. 159
      test/core/event_engine/test_suite/tools/echo_client.cc
  32. 46
      test/core/event_engine/test_suite/tools/posix_event_engine_factory.cc
  33. 45
      test/core/event_engine/test_suite/tools/windows_event_engine_factory.cc
  34. 4
      test/core/event_engine/test_suite/windows_event_engine_test.cc
  35. 1
      test/core/iomgr/endpoint_pair_test.cc

54
CMakeLists.txt generated

@ -7638,10 +7638,10 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(cf_event_engine_test
src/core/lib/event_engine/cf_engine/cf_engine.cc
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/test_suite/cf_event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/timer_test.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/tests/timer_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -7670,6 +7670,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)
@ -11631,11 +11632,11 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h
${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.grpc.pb.h
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/fuzzing_event_engine_test.cc
test/core/event_engine/test_suite/timer_test.cc
test/core/event_engine/test_suite/tests/timer_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -11664,6 +11665,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)
@ -15495,12 +15497,12 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(oracle_event_engine_posix_test
test/core/event_engine/test_suite/client_test.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/oracle_event_engine_posix.cc
test/core/event_engine/test_suite/oracle_event_engine_posix_test.cc
test/core/event_engine/test_suite/server_test.cc
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
test/core/event_engine/test_suite/posix/oracle_event_engine_posix_test.cc
test/core/event_engine/test_suite/tests/client_test.cc
test/core/event_engine/test_suite/tests/server_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -15529,6 +15531,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)
@ -16276,11 +16279,11 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(posix_endpoint_test
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/posix/posix_endpoint_test.cc
test/core/event_engine/posix/posix_engine_test_utils.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/oracle_event_engine_posix.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -16309,6 +16312,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)
@ -16358,10 +16362,10 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(posix_event_engine_connect_test
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/posix/posix_event_engine_connect_test.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/oracle_event_engine_posix.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -16390,6 +16394,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)
@ -16400,13 +16405,13 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(posix_event_engine_test
test/core/event_engine/test_suite/client_test.cc
test/core/event_engine/test_suite/event_engine_test.cc
test/core/event_engine/test_suite/event_engine_test_utils.cc
test/core/event_engine/test_suite/oracle_event_engine_posix.cc
test/core/event_engine/event_engine_test_utils.cc
test/core/event_engine/test_suite/event_engine_test_framework.cc
test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
test/core/event_engine/test_suite/posix_event_engine_test.cc
test/core/event_engine/test_suite/server_test.cc
test/core/event_engine/test_suite/timer_test.cc
test/core/event_engine/test_suite/tests/client_test.cc
test/core/event_engine/test_suite/tests/server_test.cc
test/core/event_engine/test_suite/tests/timer_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
@ -16435,6 +16440,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_unsecure
grpc_test_util
)

@ -459,7 +459,7 @@ def grpc_cc_test(name, srcs = [], deps = [], external_deps = [], args = [], data
"linkstatic": linkstatic,
}
if "grpc-fuzzer" not in tags:
if "grpc-fuzzer" not in tags and "no_test_ios" not in tags:
ios_cc_test(
name = name,
srcs = srcs,

@ -5491,15 +5491,17 @@ targets:
language: c++
headers:
- src/core/lib/event_engine/cf_engine/cf_engine.h
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/tests/timer_test.h
src:
- src/core/lib/event_engine/cf_engine/cf_engine.cc
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/test_suite/cf_event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/timer_test.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/tests/timer_test.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux
@ -7799,17 +7801,19 @@ targets:
build: test
language: c++
headers:
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/tests/timer_test.h
src:
- test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/fuzzing_event_engine_test.cc
- test/core/event_engine/test_suite/timer_test.cc
- test/core/event_engine/test_suite/tests/timer_test.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux
@ -9491,17 +9495,20 @@ targets:
build: test
language: c++
headers:
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/test_suite/oracle_event_engine_posix.h
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
- test/core/event_engine/test_suite/tests/client_test.h
- test/core/event_engine/test_suite/tests/server_test.h
src:
- test/core/event_engine/test_suite/client_test.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/oracle_event_engine_posix.cc
- test/core/event_engine/test_suite/oracle_event_engine_posix_test.cc
- test/core/event_engine/test_suite/server_test.cc
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix_test.cc
- test/core/event_engine/test_suite/tests/client_test.cc
- test/core/event_engine/test_suite/tests/server_test.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux
@ -9873,17 +9880,18 @@ targets:
build: test
language: c++
headers:
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/posix/posix_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/test_suite/oracle_event_engine_posix.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
src:
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/posix/posix_endpoint_test.cc
- test/core/event_engine/posix/posix_engine_test_utils.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/oracle_event_engine_posix.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux
@ -9907,15 +9915,16 @@ targets:
build: test
language: c++
headers:
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/test_suite/oracle_event_engine_posix.h
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
src:
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/posix/posix_event_engine_connect_test.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/oracle_event_engine_posix.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux
@ -9926,18 +9935,22 @@ targets:
build: test
language: c++
headers:
- test/core/event_engine/test_suite/event_engine_test.h
- test/core/event_engine/test_suite/event_engine_test_utils.h
- test/core/event_engine/test_suite/oracle_event_engine_posix.h
- test/core/event_engine/event_engine_test_utils.h
- test/core/event_engine/test_suite/event_engine_test_framework.h
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h
- test/core/event_engine/test_suite/tests/client_test.h
- test/core/event_engine/test_suite/tests/server_test.h
- test/core/event_engine/test_suite/tests/timer_test.h
src:
- test/core/event_engine/test_suite/client_test.cc
- test/core/event_engine/test_suite/event_engine_test.cc
- test/core/event_engine/test_suite/event_engine_test_utils.cc
- test/core/event_engine/test_suite/oracle_event_engine_posix.cc
- test/core/event_engine/event_engine_test_utils.cc
- test/core/event_engine/test_suite/event_engine_test_framework.cc
- test/core/event_engine/test_suite/posix/oracle_event_engine_posix.cc
- test/core/event_engine/test_suite/posix_event_engine_test.cc
- test/core/event_engine/test_suite/server_test.cc
- test/core/event_engine/test_suite/timer_test.cc
- test/core/event_engine/test_suite/tests/client_test.cc
- test/core/event_engine/test_suite/tests/server_test.cc
- test/core/event_engine/test_suite/tests/timer_test.cc
deps:
- grpc_unsecure
- grpc_test_util
platforms:
- linux

@ -189,3 +189,25 @@ grpc_cc_test(
"//src/core:iomgr_port",
],
)
grpc_cc_library(
name = "event_engine_test_utils",
testonly = True,
srcs = ["event_engine_test_utils.cc"],
hdrs = ["event_engine_test_utils.h"],
external_deps = [
"absl/status",
"absl/status:statusor",
"absl/strings",
"absl/time",
],
deps = [
"//:gpr",
"//:grpc_unsecure",
"//src/core:channel_args_endpoint_config",
"//src/core:event_engine_tcp_socket_utils",
"//src/core:memory_quota",
"//src/core:notification",
"//src/core:time",
],
)

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/event_engine_test_utils.h"
#include <stdlib.h>
@ -38,6 +38,7 @@
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/resource_quota/memory_quota.h"
// IWYU pragma: no_include <sys/socket.h>
@ -46,10 +47,8 @@ namespace grpc_event_engine {
namespace experimental {
namespace {
constexpr int kMinMessageSize = 1024;
constexpr int kMaxMessageSize = 4096;
} // namespace
// Returns a random message with bounded length.
@ -78,11 +77,12 @@ std::string GetNextSendMessage() {
void WaitForSingleOwner(std::shared_ptr<EventEngine>&& engine) {
while (engine.use_count() > 1) {
GRPC_LOG_EVERY_N_SEC(2, "engine.use_count() = %ld", engine.use_count());
absl::SleepFor(absl::Milliseconds(100));
}
}
void AppendStringToSliceBuffer(SliceBuffer* buf, std::string data) {
void AppendStringToSliceBuffer(SliceBuffer* buf, absl::string_view data) {
buf->Append(Slice::FromCopiedString(data));
}
@ -97,7 +97,7 @@ std::string ExtractSliceBufferIntoString(SliceBuffer* buf) {
return tmp;
}
absl::Status SendValidatePayload(std::string data,
absl::Status SendValidatePayload(absl::string_view data,
EventEngine::Endpoint* send_endpoint,
EventEngine::Endpoint* receive_endpoint) {
GPR_ASSERT(receive_endpoint != nullptr && send_endpoint != nullptr);
@ -145,7 +145,7 @@ absl::Status SendValidatePayload(std::string data,
// Check if data written == data read
std::string data_read = ExtractSliceBufferIntoString(&read_store_buf);
if (data != data_read) {
gpr_log(GPR_INFO, "Data written = %s", data.c_str());
gpr_log(GPR_INFO, "Data written = %s", data.data());
gpr_log(GPR_INFO, "Data read = %s", data_read.c_str());
return absl::CancelledError("Data read != Data written");
}
@ -153,7 +153,7 @@ absl::Status SendValidatePayload(std::string data,
}
absl::Status ConnectionManager::BindAndStartListener(
std::vector<std::string> addrs, bool listener_type_oracle) {
const std::vector<std::string>& addrs, bool listener_type_oracle) {
grpc_core::MutexLock lock(&mu_);
if (addrs.empty()) {
return absl::InvalidArgumentError(

@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_UTILS_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_UTILS_H
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_EVENT_ENGINE_TEST_UTILS_H
#define GRPC_TEST_CORE_EVENT_ENGINE_EVENT_ENGINE_TEST_UTILS_H
#include <functional>
#include <map>
@ -25,6 +25,7 @@
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/event_engine/slice_buffer.h>
@ -39,8 +40,6 @@ using EventEngineFactory = std::function<
namespace grpc_event_engine {
namespace experimental {
void AppendStringToSliceBuffer(SliceBuffer* buf, std::string data);
std::string ExtractSliceBufferIntoString(SliceBuffer* buf);
// Returns a random message with bounded length.
@ -55,7 +54,7 @@ void WaitForSingleOwner(std::shared_ptr<EventEngine>&& engine);
// written by the sender_endpoint and read by the receiver_endpoint. It
// returns OK status only if data written == data read. It also blocks the
// calling thread until said Write and Read operations are complete.
absl::Status SendValidatePayload(std::string data,
absl::Status SendValidatePayload(absl::string_view data,
EventEngine::Endpoint* send_endpoint,
EventEngine::Endpoint* receive_endpoint);
@ -76,7 +75,7 @@ class ConnectionManager {
// It creates and starts a listener bound to all the specified list of
// addresses. If successful, return OK status. The type of the listener is
// determined by the 2nd argument.
absl::Status BindAndStartListener(std::vector<std::string> addrs,
absl::Status BindAndStartListener(const std::vector<std::string>& addrs,
bool listener_type_oracle = true);
// If connection is successful, returns a tuple containing:
@ -132,7 +131,33 @@ class ConnectionManager {
std::unique_ptr<EventEngine> oracle_event_engine_;
};
void AppendStringToSliceBuffer(SliceBuffer* buf, absl::string_view data);
class NotifyOnDelete {
public:
explicit NotifyOnDelete(grpc_core::Notification* signal) : signal_(signal) {}
NotifyOnDelete(const NotifyOnDelete&) = delete;
NotifyOnDelete& operator=(const NotifyOnDelete&) = delete;
NotifyOnDelete(NotifyOnDelete&& other) noexcept {
signal_ = other.signal_;
other.signal_ = nullptr;
}
NotifyOnDelete& operator=(NotifyOnDelete&& other) noexcept {
signal_ = other.signal_;
other.signal_ = nullptr;
return *this;
}
~NotifyOnDelete() {
if (signal_ != nullptr) {
signal_->Notify();
}
}
private:
grpc_core::Notification* signal_;
};
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_UTILS_H
#endif // GRPC_TEST_CORE_EVENT_ENGINE_EVENT_ENGINE_TEST_UTILS_H

@ -192,9 +192,9 @@ grpc_cc_test(
"//src/core:posix_event_engine_endpoint",
"//src/core:posix_event_engine_event_poller",
"//src/core:posix_event_engine_poller_posix_default",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/posix:posix_engine_test_utils",
"//test/core/event_engine/test_suite:conformance_test_base_lib",
"//test/core/event_engine/test_suite:oracle_event_engine_posix",
"//test/core/event_engine/test_suite/posix:oracle_event_engine_posix",
"//test/core/util:grpc_test_util",
],
)
@ -236,8 +236,8 @@ grpc_cc_test(
"//src/core:posix_event_engine_endpoint",
"//src/core:posix_event_engine_event_poller",
"//src/core:posix_event_engine_poller_posix_default",
"//test/core/event_engine/test_suite:conformance_test_base_lib",
"//test/core/event_engine/test_suite:oracle_event_engine_posix",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite/posix:oracle_event_engine_posix",
"//test/core/util:grpc_test_util",
],
)

@ -48,9 +48,9 @@
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "test/core/event_engine/event_engine_test_utils.h"
#include "test/core/event_engine/posix/posix_engine_test_utils.h"
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/test_suite/oracle_event_engine_posix.h"
#include "test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h"
#include "test/core/util/port.h"
GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy);

@ -48,7 +48,7 @@
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/event_engine_test_utils.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"

@ -16,66 +16,22 @@ load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_p
licenses(["notice"])
grpc_package(name = "test/core/event_engine/test_suite")
COMMON_HEADERS = [
"event_engine_test.h",
"event_engine_test_utils.h",
]
grpc_cc_library(
name = "timer",
testonly = True,
srcs = ["timer_test.cc"],
hdrs = COMMON_HEADERS,
deps = [":conformance_test_base_lib"],
alwayslink = 1,
)
grpc_cc_library(
name = "dns",
testonly = True,
srcs = ["dns_test.cc"],
hdrs = COMMON_HEADERS,
deps = [":conformance_test_base_lib"],
alwayslink = 1,
)
grpc_cc_library(
name = "client",
testonly = True,
srcs = ["client_test.cc"],
hdrs = COMMON_HEADERS,
deps = [
":conformance_test_base_lib",
"//src/core:channel_args",
],
alwayslink = 1,
grpc_package(
name = "test/core/event_engine/test_suite",
visibility = "public",
)
grpc_cc_library(
name = "server",
name = "event_engine_test_framework",
testonly = True,
srcs = ["server_test.cc"],
hdrs = COMMON_HEADERS,
deps = [
":conformance_test_base_lib",
"//src/core:channel_args",
],
alwayslink = 1,
)
grpc_cc_library(
name = "complete",
testonly = 1,
hdrs = COMMON_HEADERS,
srcs = ["event_engine_test_framework.cc"],
hdrs = ["event_engine_test_framework.h"],
external_deps = ["gtest"],
deps = [
":client",
":dns",
":server",
":timer",
"//:grpc",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/util:grpc_test_util",
],
alwayslink = 1,
)
# -- EventEngine implementations --
@ -89,11 +45,12 @@ grpc_cc_test(
uses_event_engine = True,
uses_polling = True,
deps = [
":client",
":oracle_event_engine_posix",
":server",
"//src/core:posix_event_engine",
"//test/core/event_engine/test_suite:timer",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite/posix:oracle_event_engine_posix",
"//test/core/event_engine/test_suite/tests:client",
"//test/core/event_engine/test_suite/tests:server",
"//test/core/event_engine/test_suite/tests:timer",
],
)
@ -107,8 +64,11 @@ grpc_cc_test(
],
uses_polling = False,
deps = [
# TODO(hork): enable when the listener (or an oracle) is available
# "//test/core/event_engine/test_suite/tests:client",
"//test/core/event_engine/test_suite/tests:timer",
"//src/core:windows_event_engine",
"//test/core/event_engine/test_suite:timer",
"//test/core/event_engine:event_engine_test_utils",
],
)
@ -121,8 +81,8 @@ grpc_cc_test(
],
uses_polling = False,
deps = [
":timer",
"//src/core:cf_event_engine",
"//test/core/event_engine/test_suite/tests:timer",
],
)
@ -136,65 +96,6 @@ grpc_cc_test(
uses_polling = False,
deps = [
"//test/core/event_engine/fuzzing_event_engine",
"//test/core/event_engine/test_suite:timer",
],
)
# -- Internal targets --
grpc_cc_library(
name = "oracle_event_engine_posix",
testonly = True,
srcs = ["oracle_event_engine_posix.cc"],
hdrs = ["oracle_event_engine_posix.h"],
tags = [
"cpu:10",
"no_windows",
],
visibility = ["//test:__subpackages__"],
deps = [
":conformance_test_base_lib",
"//:grpc",
"//test/core/util:grpc_test_util",
],
)
grpc_cc_test(
name = "oracle_event_engine_posix_test",
srcs = ["oracle_event_engine_posix_test.cc"],
external_deps = ["gtest"],
language = "C++",
tags = [
"no_test_ios",
"no_windows",
],
# TODO(vignesbabu): This is required because the oracle event engine uses
# poll syscall. If uses_polling is set to False, there will be an attempt
# to run this test with GRPC_POLL_STRATEGY=none which will hijack the poll
# c-wrapper causing the test to fail. A more generic posix oracle event
# engine design which doesn't rely on poll is required.
uses_polling = True,
deps = [
":client",
":oracle_event_engine_posix",
":server",
"//:grpc",
"//test/core/util:grpc_test_util",
],
)
grpc_cc_library(
name = "conformance_test_base_lib",
testonly = True,
srcs = [
"event_engine_test.cc",
"event_engine_test_utils.cc",
],
hdrs = COMMON_HEADERS,
external_deps = ["gtest"],
visibility = ["@grpc:public"],
deps = [
"//:grpc",
"//test/core/util:grpc_test_util",
"//test/core/event_engine/test_suite/tests:timer",
],
)

@ -1,8 +1,10 @@
A reusable test suite for EventEngine implementations.
# Customizing tests for your EventEngine implementation
To exercise a custom EventEngine, create a new bazel test target that links
against the `//test/core/event_engine/test_suite:complete` library, and provide
a testing `main` function that sets a custom EventEngine factory.
against some set of targets in the `//test/core/event_engine/test_suite/tests/...`
folder, and provide a testing `main` function that sets a custom EventEngine factory.
Your custom test target will look something like:
@ -11,7 +13,7 @@ grpc_cc_test(
name = "my_custom_event_engine_test",
srcs = ["my_custom_event_engine_test.cc"],
uses_polling = False,
deps = ["//test/core/event_engine/test_suite:complete"],
deps = ["//test/core/event_engine/test_suite/tests:timer"],
)
```
@ -19,7 +21,7 @@ And the main function will be similar to:
```
#include "path/to/my_custom_event_engine.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
@ -33,7 +35,37 @@ int main(int argc, char** argv) {
Alternatively, if you only want to exercise a subset of the conformance tests,
you could depend on any subset of the following:
* `//test/core/event_engine/test_suite:timer`
* `//test/core/event_engine/test_suite:dns`
* `//test/core/event_engine/test_suite:client`
* `//test/core/event_engine/test_suite:server`
* `//test/core/event_engine/test_suite/tests:timer`
* `//test/core/event_engine/test_suite/tests:dns`
* `//test/core/event_engine/test_suite/tests:client`
* `//test/core/event_engine/test_suite/tests:server`
# Useful testing tools
The suite also provides [tools](tools/) that let you exercise your custom EventEngine in other ways.
For example, the `echo_client` library allows you to prop up a TCP echo client based on your EventEngine::Connect and ::Endpoint implementations, and communicate with a remote TCP listener of your choosing.
You'll need to provide the following code
```
# tools/BUILD:
grpc_cc_binary(
name = "my_event_engine_echo_client",
srcs = ["my_event_engine_factory.cc"],
deps = ["echo_client"],
)
# tools/my_event_engine_factory.cc: an implementation of CustomEventEngineFactory
absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory() {
return []() {
return std::make_unique<
grpc_event_engine::experimental::WindowsEventEngine>();
};
}
```
To exercise the echo client, run `bazel run //test/core/event_engine/test_suite/tools:my_event_engine_echo_client`, and in a separate terminal, open something like netcat to run a TCP listener and communicate with the client.
Each tool is documented more fully in its source file.

@ -18,7 +18,8 @@
#include <grpc/grpc.h>
#include "src/core/lib/event_engine/cf_engine/cf_engine.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/event_engine/test_suite/tests/timer_test.h"
#include "test/core/util/test_config.h"
int main(int argc, char** argv) {
@ -28,6 +29,7 @@ int main(int argc, char** argv) {
return std::make_unique<grpc_event_engine::experimental::CFEventEngine>();
};
SetEventEngineFactories(factory, factory);
grpc_event_engine::experimental::InitTimerTests();
// TODO(ctiller): EventEngine temporarily needs grpc to be initialized first
// until we clear out the iomgr shutdown code.
grpc_init();

@ -11,7 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include <gtest/gtest.h>

@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_H
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_FRAMEWORK_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_FRAMEWORK_H
#include <memory>
#include <utility>
@ -89,4 +89,4 @@ void SetEventEngineFactories(
std::unique_ptr<grpc_event_engine::experimental::EventEngine>()>
oracle_ee_factory);
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_H
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_EVENT_ENGINE_TEST_FRAMEWORK_H

@ -24,7 +24,8 @@
#include "absl/time/time.h"
#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/event_engine/test_suite/tests/timer_test.h"
namespace grpc_event_engine {
namespace experimental {
@ -72,5 +73,6 @@ int main(int argc, char** argv) {
grpc_event_engine::experimental::ThreadedFuzzingEventEngine>();
},
nullptr);
grpc_event_engine::experimental::InitTimerTests();
return RUN_ALL_TESTS();
}

@ -0,0 +1,61 @@
# Copyright 2023 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_package")
licenses(["notice"])
grpc_package(name = "test/core/event_engine/test_suite/posix")
grpc_cc_library(
name = "oracle_event_engine_posix",
testonly = True,
srcs = ["oracle_event_engine_posix.cc"],
hdrs = ["oracle_event_engine_posix.h"],
tags = [
"cpu:10",
"no_windows",
],
visibility = ["//test:__subpackages__"],
deps = [
"//:grpc",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite:event_engine_test_framework",
"//test/core/util:grpc_test_util",
],
)
grpc_cc_test(
name = "oracle_event_engine_posix_test",
srcs = ["oracle_event_engine_posix_test.cc"],
external_deps = ["gtest"],
language = "C++",
tags = [
"no_test_ios",
"no_windows",
],
# TODO(vignesbabu): This is required because the oracle event engine uses
# poll syscall. If uses_polling is set to False, there will be an attempt
# to run this test with GRPC_POLL_STRATEGY=none which will hijack the poll
# c-wrapper causing the test to fail. A more generic posix oracle event
# engine design which doesn't rely on poll is required.
uses_polling = True,
deps = [
"oracle_event_engine_posix",
"//:grpc",
"//test/core/event_engine/test_suite/tests:client",
"//test/core/event_engine/test_suite/tests:server",
"//test/core/util:grpc_test_util",
],
)

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "test/core/event_engine/test_suite/oracle_event_engine_posix.h"
#include "test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h"
#include <poll.h>
#include <sys/socket.h>

@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_ORACLE_EVENT_ENGINE_POSIX_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_ORACLE_EVENT_ENGINE_POSIX_H
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_POSIX_ORACLE_EVENT_ENGINE_POSIX_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_POSIX_ORACLE_EVENT_ENGINE_POSIX_H
#include <memory>
#include <string>
@ -34,7 +34,7 @@
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/gprpp/thd.h"
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/event_engine_test_utils.h"
namespace grpc_event_engine {
namespace experimental {
@ -195,4 +195,4 @@ class PosixOracleEventEngine final : public EventEngine {
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_ORACLE_EVENT_ENGINE_POSIX_H
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_POSIX_ORACLE_EVENT_ENGINE_POSIX_H

@ -11,11 +11,11 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "test/core/event_engine/test_suite/oracle_event_engine_posix.h"
#include "test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h"
#include <gtest/gtest.h>
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/util/test_config.h"
int main(int argc, char** argv) {

@ -20,8 +20,11 @@
#include "src/core/lib/event_engine/posix_engine/posix_engine.h"
#include "src/core/lib/experiments/config.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/oracle_event_engine_posix.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/event_engine/test_suite/posix/oracle_event_engine_posix.h"
#include "test/core/event_engine/test_suite/tests/client_test.h"
#include "test/core/event_engine/test_suite/tests/server_test.h"
#include "test/core/event_engine/test_suite/tests/timer_test.h"
#include "test/core/util/test_config.h"
int main(int argc, char** argv) {
@ -36,6 +39,9 @@ int main(int argc, char** argv) {
return std::make_unique<
grpc_event_engine::experimental::PosixOracleEventEngine>();
});
grpc_event_engine::experimental::InitTimerTests();
grpc_event_engine::experimental::InitClientTests();
grpc_event_engine::experimental::InitServerTests();
// TODO(vigneshbabu): remove when the experiment is over
grpc_core::ForceEnableExperiment("event_engine_client", true);
// TODO(ctiller): EventEngine temporarily needs grpc to be initialized first

@ -0,0 +1,88 @@
# Copyright 2023 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_package")
licenses(["notice"])
grpc_package(
name = "test/core/event_engine/test_suite/tests",
visibility = "public",
)
# TODO(hork): A single InitTestSuite() call should initialize all tests.
# This can be done after each test suite specialization can explicitly opt in or out
# of tests declaratively.
# grpc_cc_library(
# name = "init",
# testonly = True,
# hdrs = ["init.h"],
# deps = [
# "client",
# "dns",
# "server",
# "timer",
# ],
# alwayslink = 1,
# )
grpc_cc_library(
name = "timer",
testonly = True,
srcs = ["timer_test.cc"],
hdrs = ["timer_test.h"],
deps = [
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite:event_engine_test_framework",
],
alwayslink = 1,
)
grpc_cc_library(
name = "dns",
testonly = True,
srcs = ["dns_test.cc"],
hdrs = ["dns_test.h"],
deps = [
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite:event_engine_test_framework",
],
alwayslink = 1,
)
grpc_cc_library(
name = "client",
testonly = True,
srcs = ["client_test.cc"],
hdrs = ["client_test.h"],
deps = [
"//src/core:channel_args",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite:event_engine_test_framework",
],
alwayslink = 1,
)
grpc_cc_library(
name = "server",
testonly = True,
srcs = ["server_test.cc"],
hdrs = ["server_test.h"],
deps = [
"//src/core:channel_args",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/event_engine/test_suite:event_engine_test_framework",
],
alwayslink = 1,
)

@ -44,10 +44,18 @@
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/event_engine_test_utils.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/util/port.h"
namespace grpc_event_engine {
namespace experimental {
void InitClientTests() {}
} // namespace experimental
} // namespace grpc_event_engine
class EventEngineClientTest : public EventEngineTest {};
using namespace std::chrono_literals;
@ -60,6 +68,7 @@ using ::grpc_event_engine::experimental::URIToResolvedAddress;
using Endpoint = ::grpc_event_engine::experimental::EventEngine::Endpoint;
using Listener = ::grpc_event_engine::experimental::EventEngine::Listener;
using ::grpc_event_engine::experimental::GetNextSendMessage;
using ::grpc_event_engine::experimental::NotifyOnDelete;
using ::grpc_event_engine::experimental::WaitForSingleOwner;
constexpr int kNumExchangedMessages = 100;
@ -79,10 +88,10 @@ TEST_F(EventEngineClientTest, ConnectToNonExistentListenerTest) {
// listener.
ChannelArgsEndpointConfig config;
test_ee->Connect(
[&signal](absl::StatusOr<std::unique_ptr<Endpoint>> status) {
[_ = NotifyOnDelete(&signal)](
absl::StatusOr<std::unique_ptr<Endpoint>> status) {
// Connect should fail.
ASSERT_FALSE(status.ok());
signal.Notify();
EXPECT_FALSE(status.ok());
},
*URIToResolvedAddress(target_addr), config,
memory_quota->CreateMemoryAllocator("conn-1"), 24h);

@ -0,0 +1,25 @@
// Copyright 2023 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_CLIENT_TEST_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_CLIENT_TEST_H
namespace grpc_event_engine {
namespace experimental {
void InitClientTests();
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_CLIENT_TEST_H

@ -15,7 +15,15 @@
#include <gtest/gtest.h>
#include "src/core/lib/iomgr/exec_ctx.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
namespace grpc_event_engine {
namespace experimental {
void InitDNSTests() {}
} // namespace experimental
} // namespace grpc_event_engine
class EventEngineDNSTest : public EventEngineTest {};

@ -0,0 +1,25 @@
// Copyright 2023 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_DNS_TEST_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_DNS_TEST_H
namespace grpc_event_engine {
namespace experimental {
void InitDNSTests();
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_DNS_TEST_H

@ -44,10 +44,18 @@
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_utils.h"
#include "test/core/event_engine/event_engine_test_utils.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/util/port.h"
namespace grpc_event_engine {
namespace experimental {
void InitServerTests() {}
} // namespace experimental
} // namespace grpc_event_engine
class EventEngineServerTest : public EventEngineTest {};
using namespace std::chrono_literals;

@ -0,0 +1,25 @@
// Copyright 2023 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_SERVER_TEST_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_SERVER_TEST_H
namespace grpc_event_engine {
namespace experimental {
void InitServerTests();
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_SERVER_TEST_H

@ -36,11 +36,19 @@
#include <grpc/support/log.h>
#include "src/core/lib/gprpp/sync.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
using ::testing::ElementsAre;
using namespace std::chrono_literals;
namespace grpc_event_engine {
namespace experimental {
void InitTimerTests() {}
} // namespace experimental
} // namespace grpc_event_engine
class EventEngineTimerTest : public EventEngineTest {
public:
void ScheduleCheckCB(std::chrono::steady_clock::time_point when,

@ -0,0 +1,25 @@
// Copyright 2023 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_TIMER_TEST_H
#define GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_TIMER_TEST_H
namespace grpc_event_engine {
namespace experimental {
void InitTimerTests();
} // namespace experimental
} // namespace grpc_event_engine
#endif // GRPC_TEST_CORE_EVENT_ENGINE_TEST_SUITE_TESTS_TIMER_TEST_H

@ -0,0 +1,70 @@
# Copyright 2022 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_cc_binary", "grpc_cc_library", "grpc_package")
licenses(["notice"])
grpc_package(name = "test/core/event_engine/test_suite/tools")
# -- Implementations --
grpc_cc_binary(
name = "windows_event_engine_echo_client",
testonly = True,
srcs = ["windows_event_engine_factory.cc"],
tags = [
"bazel_only",
"no_linux",
"no_mac",
],
deps = [
"echo_client",
"//src/core:windows_event_engine",
],
)
# TODO(hork): this needs to reuse the same configuration in the test suite.
grpc_cc_binary(
name = "posix_event_engine_echo_client",
testonly = True,
srcs = ["posix_event_engine_factory.cc"],
tags = [
"bazel_only",
"no_windows",
],
deps = [
"echo_client",
"//src/core:posix_event_engine",
],
)
# -- Testing tools --
grpc_cc_library(
name = "echo_client",
testonly = True,
srcs = ["echo_client.cc"],
external_deps = [
"absl/flags:flag",
"absl/flags:parse",
],
language = "C++",
deps = [
"//:gpr_platform",
"//src/core:common_event_engine_closures",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/util:grpc_test_util",
],
)

@ -0,0 +1,159 @@
// Copyright 2022 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <grpc/support/port_platform.h>
#include <stdint.h>
#include <stdlib.h>
#include <grpc/event_engine/slice.h>
// The echo client wraps an EventEngine::Connect and EventEngine::Endpoint
// implementations, allowing third-party TCP listeners to interact with your
// EventEngine client. Example usage:
//
// # in one shell
// choco install nmap
// ncat -klp 32000
// # wait for a connection, than send data (e.g., keyboard input)
//
// # in a separate shell
// bazel run
// //test/core/event_engine/test_suite/tools:my_event_engine_echo_client
#include <chrono>
#include <memory>
#include <ratio>
#include <string>
#include <utility>
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/event_engine/slice_buffer.h>
#include <grpc/grpc.h>
#include <grpc/support/log.h>
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "src/core/lib/resource_quota/memory_quota.h"
extern absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory();
ABSL_FLAG(std::string, target, "ipv4:127.0.0.1:50051", "Target string");
namespace {
using namespace std::chrono_literals;
using ::grpc_event_engine::experimental::ChannelArgsEndpointConfig;
using ::grpc_event_engine::experimental::EventEngine;
using ::grpc_event_engine::experimental::GetDefaultEventEngine;
using ::grpc_event_engine::experimental::Slice;
using ::grpc_event_engine::experimental::SliceBuffer;
using ::grpc_event_engine::experimental::URIToResolvedAddress;
void SendMessage(EventEngine::Endpoint* endpoint, int message_id) {
SliceBuffer buf;
buf.Append(Slice::FromCopiedString(
absl::StrFormat("Waiting for message %d ... \n", message_id)));
grpc_core::Notification write_done;
endpoint->Write(
[&](absl::Status status) {
GPR_ASSERT(status.ok());
write_done.Notify();
},
&buf, nullptr);
write_done.WaitForNotification();
}
void ReceiveAndEchoMessage(EventEngine::Endpoint* endpoint, int message_id) {
SliceBuffer buf;
grpc_core::Notification read_done;
endpoint->Read(
[&](absl::Status status) {
if (!status.ok()) {
gpr_log(GPR_ERROR, "Error reading from endpoint: %s",
status.ToString().c_str());
exit(1);
}
Slice received = buf.TakeFirst();
gpr_log(GPR_ERROR, "Received message %d: %.*s", message_id,
static_cast<int>(received.as_string_view().length()),
received.as_string_view().data());
read_done.Notify();
},
&buf, nullptr);
read_done.WaitForNotification();
}
void RunUntilInterrupted() {
auto engine = GetDefaultEventEngine();
std::unique_ptr<EventEngine::Endpoint> endpoint;
grpc_core::Notification connected;
auto memory_quota = std::make_unique<grpc_core::MemoryQuota>("bar");
ChannelArgsEndpointConfig config{grpc_core::CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(nullptr)};
std::string canonical_target =
grpc_core::CoreConfiguration::Get()
.resolver_registry()
.AddDefaultPrefixIfNeeded(absl::GetFlag(FLAGS_target));
auto addr = URIToResolvedAddress(canonical_target);
GPR_ASSERT(addr.ok());
engine->Connect(
[&](absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>> ep) {
if (!ep.ok()) {
gpr_log(GPR_ERROR, "Error connecting: %s",
ep.status().ToString().c_str());
exit(1);
}
endpoint = std::move(*ep);
connected.Notify();
},
*addr, config, memory_quota->CreateMemoryAllocator("client"), 2h);
connected.WaitForNotification();
GPR_ASSERT(endpoint.get() != nullptr);
gpr_log(GPR_DEBUG, "peer addr: %s",
ResolvedAddressToString(endpoint->GetPeerAddress())->c_str());
gpr_log(GPR_DEBUG, "local addr: %s",
ResolvedAddressToString(endpoint->GetLocalAddress())->c_str());
int message_id = 0;
while (true) {
SendMessage(endpoint.get(), message_id++);
ReceiveAndEchoMessage(endpoint.get(), message_id);
}
}
} // namespace
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
grpc_event_engine::experimental::SetEventEngineFactory(
CustomEventEngineFactory());
grpc_init();
RunUntilInterrupted();
grpc_shutdown();
return 0;
}

@ -0,0 +1,46 @@
// Copyright 2023 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <grpc/support/port_platform.h>
#include <memory>
#include "absl/functional/any_invocable.h"
#include <grpc/event_engine/event_engine.h>
#include "src/core/lib/iomgr/port.h"
#ifdef GRPC_POSIX_SOCKET_TCP
#include "src/core/lib/event_engine/posix_engine/posix_engine.h"
absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory() {
return []() {
return std::make_unique<
grpc_event_engine::experimental::PosixEventEngine>();
};
}
#else
absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory() {
GPR_ASSERT(false && "This tool was not built for Posix environments.");
}
#endif

@ -0,0 +1,45 @@
// Copyright 2022 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <grpc/support/port_platform.h>
#include <memory>
#include "absl/functional/any_invocable.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/support/log.h>
#ifdef GPR_WINDOWS
#include "src/core/lib/event_engine/windows/windows_engine.h"
absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory() {
return []() {
return std::make_unique<
grpc_event_engine::experimental::WindowsEventEngine>();
};
}
#else
absl::AnyInvocable<
std::unique_ptr<grpc_event_engine::experimental::EventEngine>(void)>
CustomEventEngineFactory() {
GPR_ASSERT(false && "This tool was not built for Windows.");
}
#endif

@ -18,7 +18,8 @@
#include <grpc/grpc.h>
#include "src/core/lib/event_engine/windows/windows_engine.h"
#include "test/core/event_engine/test_suite/event_engine_test.h"
#include "test/core/event_engine/test_suite/event_engine_test_framework.h"
#include "test/core/event_engine/test_suite/tests/timer_test.h"
#include "test/core/util/test_config.h"
int main(int argc, char** argv) {
@ -29,6 +30,7 @@ int main(int argc, char** argv) {
grpc_event_engine::experimental::WindowsEventEngine>();
};
SetEventEngineFactories(factory, factory);
grpc_event_engine::experimental::InitTimerTests();
// TODO(ctiller): EventEngine temporarily needs grpc to be initialized first
// until we clear out the iomgr shutdown code.
grpc_init();

@ -34,7 +34,6 @@
#include "src/core/lib/event_engine/shim.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/notification.h"
#include "src/core/lib/iomgr/event_engine_shims/endpoint.h"
#include "src/core/lib/resource_quota/memory_quota.h"

Loading…
Cancel
Save