/*
 * 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 org.apache.flink.statefun.e2e.smoke;
option java_package = "org.apache.flink.statefun.e2e.smoke.generated";

option java_multiple_files = true;

message SourceCommand {
  int32 target = 1;
  Commands commands = 2;
}

message Commands {
  repeated Command command = 1;
}

message Command {
  message IncrementState {
  }
  message Send {
    int32 target = 1;
    Commands commands = 2;
  }
  message SendAfter {
    int32 target = 1;
    Commands commands = 2;
    string cancellation_token = 3;
  }
  message CancelSendAfter {
     int32 target = 1;
     string cancellation_token = 2;
  }
  message SendEgress {
  }
  message AsyncOperation {
    bool failure = 1;
    Commands resolved_commands = 2;
  }
  message Verify {
    int64 expected = 1;
  }

  oneof command {
    IncrementState increment = 1;
    Send send = 2;
    SendAfter send_after = 3;
    SendEgress send_egress = 4;
    AsyncOperation async_operation = 5;
    Verify verify = 6;
    CancelSendAfter cancel_send_after = 7;
  }
}

message VerificationResult {
  int32 id = 1;
  int64 expected = 2;
  int64 actual = 3;
}

