/*
 * Copyright (C) 2015 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.
 */

/*
 * Protocol Buffer messages used for testing Proto2Coder implementation.
 *
 * Copy from {@link https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/proto/proto2_coder_test_messages.proto}
 */

syntax = "proto2";

package proto2_coder_test_messages;

option java_package = "org.apache.bookkeeper.stream.coder.protobuf.test";

message MessageA {
  optional string field1 = 1;
  repeated MessageB field2 = 2;
}

message MessageB {
  optional bool field1 = 1;
}

message MessageC {
  extensions 100 to 105;
}

extend MessageC {
  optional MessageA field1 = 101;
  optional MessageB field2 = 102;
}

message MessageWithMap {
  map<string, MessageA> field1 = 1;
}

message ReferencesMessageWithMap {
  repeated MessageWithMap field1 = 1;
}
