// Copyright 2015 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.

// Message definitions to be used by integration test service definitions.

syntax = "proto3";

package grpc.testing;

option objc_class_prefix = "RMT";

// TODO(dgq): Go back to using well-known types once
// https://github.com/grpc/grpc/issues/6980 has been fixed.
// import "google/protobuf/wrappers.proto";
message BoolValue {
  // The bool value.
  bool value = 1;
}

// DEPRECATED, don't use. To be removed shortly.
// The type of payload that should be returned.
enum PayloadType {
  // Compressable text format.
  COMPRESSABLE = 0;
}

// A block of data, to simply increase gRPC message size.
message Payload {
  // DEPRECATED, don't use. To be removed shortly.
  // The type of data in body.
  PayloadType type = 1;
  // Primary contents of payload.
  bytes body = 2;
}

// A protobuf representation for grpc status. This is used by test
// clients to specify a status that the server should attempt to return.
message EchoStatus {
  int32 code = 1;
  string message = 2;
}

// Unary request.
message SimpleRequest {
  // DEPRECATED, don't use. To be removed shortly.
  // Desired payload type in the response from the server.
  // If response_type is RANDOM, server randomly chooses one from other formats.
  PayloadType response_type = 1;

  // Desired payload size in the response from the server.
  int32 response_size = 2;

  // Optional input payload sent along with the request.
  Payload payload = 3;

  // Whether SimpleResponse should include username.
  bool fill_username = 4;

  // Whether SimpleResponse should include OAuth scope.
  bool fill_oauth_scope = 5;

  // Whether to request the server to compress the response. This field is
  // "nullable" in order to interoperate seamlessly with clients not able to
  // implement the full compression tests by introspecting the call to verify
  // the response's compression status.
  BoolValue response_compressed = 6;

  // Whether server should return a given status
  EchoStatus response_status = 7;

  // Whether the server should expect this request to be compressed.
  BoolValue expect_compressed = 8;
}

// Unary response, as configured by the request.
message SimpleResponse {
  // Payload to increase message size.
  Payload payload = 1;
  // The user the request came from, for verifying authentication was
  // successful when the client expected it.
  string username = 2;
  // OAuth scope.
  string oauth_scope = 3;
}

// Client-streaming request.
message StreamingInputCallRequest {
  // Optional input payload sent along with the request.
  Payload payload = 1;

  // Whether the server should expect this request to be compressed. This field
  // is "nullable" in order to interoperate seamlessly with servers not able to
  // implement the full compression tests by introspecting the call to verify
  // the request's compression status.
  BoolValue expect_compressed = 2;

  // Not expecting any payload from the response.
}

// Client-streaming response.
message StreamingInputCallResponse {
  // Aggregated size of payloads received from the client.
  int32 aggregated_payload_size = 1;
}

// Configuration for a particular response.
message ResponseParameters {
  // Desired payload sizes in responses from the server.
  int32 size = 1;

  // Desired interval between consecutive responses in the response stream in
  // microseconds.
  int32 interval_us = 2;

  // Whether to request the server to compress the response. This field is
  // "nullable" in order to interoperate seamlessly with clients not able to
  // implement the full compression tests by introspecting the call to verify
  // the response's compression status.
  BoolValue compressed = 3;
}

// Server-streaming request.
message StreamingOutputCallRequest {
  // DEPRECATED, don't use. To be removed shortly.
  // Desired payload type in the response from the server.
  // If response_type is RANDOM, the payload from each response in the stream
  // might be of different types. This is to simulate a mixed type of payload
  // stream.
  PayloadType response_type = 1;

  // Configuration for each expected response message.
  repeated ResponseParameters response_parameters = 2;

  // Optional input payload sent along with the request.
  Payload payload = 3;

  // Whether server should return a given status
  EchoStatus response_status = 7;
}

// Server-streaming response, as configured by the request and parameters.
message StreamingOutputCallResponse {
  // Payload to increase response size.
  Payload payload = 1;
}

// For reconnect interop test only.
// Client tells server what reconnection parameters it used.
message ReconnectParams {
  int32 max_reconnect_backoff_ms = 1;
}

// For reconnect interop test only.
// Server tells client whether its reconnects are following the spec and the
// reconnect backoffs it saw.
message ReconnectInfo {
  bool passed = 1;
  repeated int32 backoff_ms = 2;
}
