// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You 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.

syntax = "proto3";

package a;

import "google/protobuf/any.proto";
import "google/protobuf/empty.proto";

service One {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(stream google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bat(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
}

service One2 {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(stream google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bat(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
}

service Two2 {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(stream google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bat(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
}

service Three2 {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(stream google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bat(google.protobuf.Empty) returns (stream google.protobuf.Empty) {}
}

service Three {
  rpc Foo(stream google.protobuf.Any) returns (google.protobuf.Any) {}
  rpc Bar(google.protobuf.Any) returns (stream google.protobuf.Any) {}
  rpc Baz(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Bat(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

service Four {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(google.protobuf.Empty) returns (google.protobuf.Empty) {
    option idempotency_level = IDEMPOTENT;
  }
}

service Four2 {
  rpc Foo(google.protobuf.Empty) returns (google.protobuf.Empty) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc Baz(google.protobuf.Empty) returns (google.protobuf.Empty) {
    option idempotency_level = IDEMPOTENT;
  }
}
