// 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 fuchsia.component.test;

/// A 32-bit counter.
closed protocol Counter {
    /// Return the current counter value, then increment it.
    strict GetAndIncrement() -> (struct {
        response uint32;
    });
};

/// A new, 64-bit counter.
closed protocol CounterV2 {
    /// Return the current counter value, then increment it.
    strict GetAndIncrement() -> (struct {
        response uint64;
    });
};

/// Provides the old legacy 32-bit counter as well as a new 64-bit counter.
service CounterService {
    counter client_end:Counter;
    counter_v2 client_end:CounterV2;
};
