// 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.auth.testing;

using fuchsia.auth;

/// This interface is intended as an additional interface implemented by an
/// AuthProvider.  It allows a test component to inject persistent credentials
/// into the AuthProvider.  This interface is intended as a short term solution
/// to enable end-to-end testing only and should not be generally used.
protocol LegacyAuthCredentialInjector {
    /// Injects a persistent credential to the AuthProvider.  This API should
    /// only be called while there is an ongoing call to the AuthProvider's
    /// GetPersistentCredential method.  Calling this causes
    /// GetPersistentCredential to return the supplied credential and
    /// UserProfileInfo.  It additionally stops the UI overlay started by
    /// AuthProvider as part of the normal process for obtaining the credential.
    ///
    /// |user_profile_info| should be information such as user id expected to
    /// be returned by the external identity provider when authenticating.
    /// |credential| should be a persistent credential provided by the external
    /// identity provider called by the AuthProvider.
    InjectPersistentCredential(fuchsia.auth.UserProfileInfo? user_profile_info,
                               string credential);
};
