// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library llcpptest.flexible.test;

flexible resource union FlexibleXUnion {
    1: array<uint8>:30 want_more_than_30_bytes;
    2: array<handle?>:4 want_more_than_4_handles;
};

/// Only one of the fields will be set by the server. This allows
/// the transaction to infer which field is present. See flexible_test.cc.
resource table FlexibleTable {
    1: array<uint8>:30 want_more_than_30_bytes_at_ordinal_3;
    2: array<handle?>:4 want_more_than_4_handles_at_ordinal_4;
};

/// The server will be implemented manually to purposefully return xunion/tables
/// with an unknown ordinal.
protocol ReceiveFlexibleEnvelope {
    /// Receive a xunion with an unknown ordinal (suppose coming from a newer
    /// server) which contains more bytes than the current max message size.
    GetUnknownXUnionMoreBytes() -> (FlexibleXUnion xu);

    /// Receive a xunion with an unknown ordinal (suppose coming from a newer
    /// server) which contains more handles than the current max message handle
    /// count.
    GetUnknownXUnionMoreHandles() -> (FlexibleXUnion xu);

    /// Receive a table with an unknown ordinal (suppose coming from a newer
    /// server) which contains more bytes than the current max message size.
    GetUnknownTableMoreBytes() -> (FlexibleTable t);

    /// Receive a table with an unknown ordinal (suppose coming from a newer
    /// server) which contains more handles than the current max message handle
    /// count.
    GetUnknownTableMoreHandles() -> (FlexibleTable t);
};

union StrictBoundedXUnion {
    1: vector<uint8>:200 v;
};

union StrictUnboundedXUnion {
    1: vector<uint8> v;
};

// TODO(yifeit): Test strict tables once they are supported in fidlc.

/// Test that the response to GetBoundedXUnion could be allocated on the stack,
/// while that to GetUnboundedXUnion is allocated on the heap, through
/// compile-time assertions.
protocol ReceiveStrictEnvelope {
    GetBoundedXUnion() -> (StrictBoundedXUnion xu);
    GetUnboundedXUnion() -> (StrictUnboundedXUnion xu);
};
