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

#include "src/streams.h"

#include <functional>

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <weave/provider/test/fake_task_runner.h>

#include <src/bind_lambda.h>

namespace weave {

TEST(Stream, CopyStreams) {
  provider::test::FakeTaskRunner task_runner;
  std::vector<uint8_t> test_data(1024 * 1024);
  for (size_t i = 0; i < test_data.size(); ++i)
    test_data[i] = static_cast<uint8_t>(std::hash<size_t>()(i));
  MemoryStream source{test_data, &task_runner};
  MemoryStream destination{{}, &task_runner};

  bool done = false;

  auto callback = base::Bind(
      [](std::vector<uint8_t>* test_data, bool* done, MemoryStream* destination,
         size_t size, ErrorPtr error) {
        EXPECT_FALSE(error);
        *done = true;
        EXPECT_EQ(*test_data, destination->GetData());
      },
      base::Unretained(&test_data), base::Unretained(&done),
      base::Unretained(&destination));
  StreamCopier copier{&source, &destination};
  copier.Copy(callback);

  task_runner.Run(test_data.size());
  EXPECT_TRUE(done);
}

}  // namespace weave
