// Copyright 2018 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.

#ifndef PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_
#define PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_

#include "peridot/lib/testing/component_base.h"
#include "peridot/lib/testing/session_shell_impl.h"

namespace modular {
namespace testing {

class SessionShellBase : public ComponentBase<void> {
 public:
  SessionShellBase(component::StartupContext* const startup_context)
      : ComponentBase(startup_context) {
    startup_context->ConnectToEnvironmentService(
        session_shell_context_.NewRequest());

    session_shell_context_->GetStoryProvider(story_provider_.NewRequest());

    startup_context->outgoing().AddPublicService(
        session_shell_impl_.GetHandler());
  }

 protected:
  modular::testing::SessionShellImpl* session_shell_impl() {
    return &session_shell_impl_;
  }

  fuchsia::modular::SessionShellContext* session_shell_context() {
    return session_shell_context_.get();
  }

  fuchsia::modular::StoryProvider* story_provider() {
    return story_provider_.get();
  }

 private:
  modular::testing::SessionShellImpl session_shell_impl_;
  fuchsia::modular::SessionShellContextPtr session_shell_context_;
  fuchsia::modular::StoryProviderPtr story_provider_;

  FXL_DISALLOW_COPY_AND_ASSIGN(SessionShellBase);
};

}  // namespace testing
}  // namespace modular

#endif  // PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_
