/*
Copyright 2012 Google Inc.

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.
*/

package testpb;

message TestMessage {
  optional string name = 1;
  optional string city = 2;
}

message TestRequest {
  required string lower = 1; // to be returned upper case
  optional int32 repeat_count = 2 [default = 1]; // .. this many times
}

message TestResponse {
  optional string value = 1;
}

message CacheStats {
  optional int64 items = 1;
  optional int64 bytes = 2;
  optional int64 gets = 3;
  optional int64 hits = 4;
  optional int64 evicts = 5;
}

message StatsResponse {
  optional int64 gets = 1;
  optional int64 cache_hits = 12;
  optional int64 fills = 2;
  optional uint64 total_alloc = 3;
  optional CacheStats main_cache = 4;
  optional CacheStats hot_cache = 5;
  optional int64 server_in = 6;
  optional int64 loads = 8;
  optional int64 peer_loads = 9;
  optional int64 peer_errors = 10;
  optional int64 local_loads = 11;
}

message Empty {}

service GroupCacheTest {
  rpc InitPeers(Empty) returns (Empty) {};
  rpc Get(TestRequest) returns (TestResponse) {};
  rpc GetStats(Empty) returns (StatsResponse) {};
}
