mirror of https://github.com/grpc/grpc.git
parent
7dcdabf593
commit
4fc02c6bf5
7 changed files with 254 additions and 0 deletions
@ -0,0 +1,132 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2019 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 <string> |
||||
|
||||
#include <gtest/gtest.h> |
||||
|
||||
#include <grpc/support/string_util.h> |
||||
#include "src/core/lib/surface/server.h" |
||||
#include "test/core/bad_client/bad_client.h" |
||||
|
||||
#define HEADER_FRAME_ID_1 \ |
||||
"\x00\x00\xc9\x01\x05\x00\x00\x00\x01" /* headers: generated from \
|
||||
simple_request.headers in this \
|
||||
directory */ \
|
||||
"\x10\x05:path\x08/foo/bar" \
|
||||
"\x10\x07:scheme\x04http" \
|
||||
"\x10\x07:method\x04POST" \
|
||||
"\x10\x0a:authority\x09localhost" \
|
||||
"\x10\x0c" \
|
||||
"content-type\x10" \
|
||||
"application/grpc" \
|
||||
"\x10\x14grpc-accept-encoding\x15" \
|
||||
"deflate,identity,gzip" \
|
||||
"\x10\x02te\x08trailers" \
|
||||
"\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)" |
||||
|
||||
#define HEADER_FRAME_ID_2 \ |
||||
"\x00\x00\xc9\x01\x05\x00\x00\x00\x02" /* headers: generated from \
|
||||
simple_request.headers in this \
|
||||
directory */ \
|
||||
"\x10\x05:path\x08/foo/bar" \
|
||||
"\x10\x07:scheme\x04http" \
|
||||
"\x10\x07:method\x04POST" \
|
||||
"\x10\x0a:authority\x09localhost" \
|
||||
"\x10\x0c" \
|
||||
"content-type\x10" \
|
||||
"application/grpc" \
|
||||
"\x10\x14grpc-accept-encoding\x15" \
|
||||
"deflate,identity,gzip" \
|
||||
"\x10\x02te\x08trailers" \
|
||||
"\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)" |
||||
|
||||
#define HEADER_FRAME_ID_3 \ |
||||
"\x00\x00\xc9\x01\x05\x00\x00\x00\x03" /* headers: generated from \
|
||||
simple_request.headers in this \
|
||||
directory */ \
|
||||
"\x10\x05:path\x08/foo/bar" \
|
||||
"\x10\x07:scheme\x04http" \
|
||||
"\x10\x07:method\x04POST" \
|
||||
"\x10\x0a:authority\x09localhost" \
|
||||
"\x10\x0c" \
|
||||
"content-type\x10" \
|
||||
"application/grpc" \
|
||||
"\x10\x14grpc-accept-encoding\x15" \
|
||||
"deflate,identity,gzip" \
|
||||
"\x10\x02te\x08trailers" \
|
||||
"\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)" |
||||
|
||||
namespace { |
||||
|
||||
void verifier(grpc_server* server, grpc_completion_queue* cq, |
||||
void* registered_method) { |
||||
while (grpc_server_has_open_connections(server)) { |
||||
GPR_ASSERT(grpc_completion_queue_next( |
||||
cq, grpc_timeout_milliseconds_to_deadline(20), nullptr) |
||||
.type == GRPC_QUEUE_TIMEOUT); |
||||
} |
||||
} |
||||
|
||||
TEST(BadStreamingId, RegularHeader) { |
||||
grpc_bad_client_arg args[2]; |
||||
args[0] = connection_preface_arg; |
||||
args[1].client_validator = nullptr; |
||||
args[1].client_payload = HEADER_FRAME_ID_1; |
||||
args[1].client_payload_length = sizeof(HEADER_FRAME_ID_1) - 1; |
||||
grpc_run_bad_client_test(verifier, args, 2, GRPC_BAD_CLIENT_DISCONNECT); |
||||
} |
||||
|
||||
TEST(BadStreamingId, NonClientStreamId) { |
||||
grpc_bad_client_arg args[2]; |
||||
args[0] = connection_preface_arg; |
||||
// send a header frame with non-client stream id 2
|
||||
args[1].client_validator = nullptr; |
||||
args[1].client_payload = HEADER_FRAME_ID_2; |
||||
args[1].client_payload_length = sizeof(HEADER_FRAME_ID_2) - 1; |
||||
grpc_run_bad_client_test(verifier, args, 2, GRPC_BAD_CLIENT_DISCONNECT); |
||||
} |
||||
|
||||
TEST(BadStreamingId, ClosedStreamId) { |
||||
grpc_bad_client_arg args[4]; |
||||
args[0] = connection_preface_arg; |
||||
// send a header frame with stream id 1
|
||||
args[1].client_validator = nullptr; |
||||
args[1].client_payload = HEADER_FRAME_ID_1; |
||||
args[1].client_payload_length = sizeof(HEADER_FRAME_ID_1) - 1; |
||||
// send a header frame with stream id 3
|
||||
args[2].client_validator = nullptr; |
||||
args[2].client_payload = HEADER_FRAME_ID_3; |
||||
args[2].client_payload_length = sizeof(HEADER_FRAME_ID_3) - 1; |
||||
// send a header frame with closed stream id 1 again
|
||||
args[3].client_validator = nullptr; |
||||
args[3].client_payload = HEADER_FRAME_ID_1; |
||||
args[3].client_payload_length = sizeof(HEADER_FRAME_ID_1) - 1; |
||||
grpc_run_bad_client_test(verifier, args, 4, GRPC_BAD_CLIENT_DISCONNECT); |
||||
} |
||||
|
||||
} // namespace
|
||||
|
||||
int main(int argc, char** argv) { |
||||
grpc_init(); |
||||
grpc::testing::TestEnvironment env(argc, argv); |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
int retval = RUN_ALL_TESTS(); |
||||
grpc_shutdown(); |
||||
return retval; |
||||
} |
Loading…
Reference in new issue