// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_WEBSHARE_WIN_FAKE_DATA_WRITER_FACTORY_H_
#define CHROME_BROWSER_WEBSHARE_WIN_FAKE_DATA_WRITER_FACTORY_H_

#include <windows.storage.streams.h>
#include <wrl/implements.h>

namespace webshare {

// Provides an implementation of IDataWriterFactory for use in GTests.
class __declspec(uuid("4A0022E7-D891-4B52-8736-77497F9FFE14"))
    FakeDataWriterFactory final
    : public Microsoft::WRL::RuntimeClass<
          Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::WinRtClassicComMix>,
          ABI::Windows::Storage::Streams::IDataWriterFactory> {
 public:
  FakeDataWriterFactory();
  FakeDataWriterFactory(const FakeDataWriterFactory&) = delete;
  FakeDataWriterFactory& operator=(const FakeDataWriterFactory&) = delete;
  ~FakeDataWriterFactory() final;

  // ABI::Windows::Storage::Streams::IDataWriterFactory:
  IFACEMETHODIMP CreateDataWriter(
      ABI::Windows::Storage::Streams::IOutputStream* outputStream,
      ABI::Windows::Storage::Streams::IDataWriter** data_writer) final;

  // By default any IDataWriters created by this factory will check if they are
  // destroyed without having FlushAsync called on them, as this should not
  // happen for normal operations. If a test needs to allow for this (for
  // example, to test an error case where the operation is abandoned) it should
  // call this to disable/re-enable that check.
  void SetCheckForUnflushedWriterDestroyed(bool check);

 private:
  bool check_for_unflushed_writer_destroyed_ = true;
};

}  // namespace webshare

#endif  // CHROME_BROWSER_WEBSHARE_WIN_FAKE_DATA_WRITER_FACTORY_H_
