/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "base/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "cobalt/base/cobalt_paths.h"
#include "cobalt/storage/savegame.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace storage {

namespace {
scoped_ptr<Savegame> CreateSavegame() {
  Savegame::Options options;
  FilePath test_path;
  CHECK(PathService::Get(paths::DIR_COBALT_TEST_OUT, &test_path));
  options.path_override = test_path.Append("test.db").value();
  scoped_ptr<Savegame> savegame = Savegame::Create(options);
  return savegame.Pass();
}

}  // namespace

TEST(Savegame, Basic) {
  scoped_ptr<Savegame> savegame = CreateSavegame();

  Savegame::ByteVector buf;
  for (int i = 0; i < 1024; ++i) {
    buf.push_back(static_cast<uint8>(i % 256));
  }
  EXPECT_EQ(true, savegame->Write(buf));

  Savegame::ByteVector buf2;
  EXPECT_EQ(true, savegame->Read(&buf2));
  EXPECT_EQ(buf, buf2);

  EXPECT_EQ(true, savegame->Delete());
}

TEST(Savegame, DoubleRead) {
  // Verify that reading the save twice gives us the same data.
  scoped_ptr<Savegame> savegame = CreateSavegame();
  Savegame::ByteVector buf;
  for (int i = 0; i < 1024; ++i) {
    buf.push_back(static_cast<uint8>(i % 256));
  }

  EXPECT_EQ(true, savegame->Write(buf));
  Savegame::ByteVector buf2;
  EXPECT_EQ(true, savegame->Read(&buf2));
  EXPECT_EQ(buf, buf2);

  Savegame::ByteVector buf3;
  EXPECT_EQ(true, savegame->Read(&buf3));
  EXPECT_EQ(buf2, buf3);
}

TEST(Savegame, ReadAfterDelete) {
  // Verify that reading after delete fails.
  scoped_ptr<Savegame> savegame = CreateSavegame();

  Savegame::ByteVector buf;
  for (int i = 0; i < 1024; ++i) {
    buf.push_back(static_cast<uint8>(i % 256));
  }

  EXPECT_EQ(true, savegame->Write(buf));
  Savegame::ByteVector buf2;
  EXPECT_EQ(true, savegame->Delete());
  EXPECT_EQ(false, savegame->Read(&buf2));
}

TEST(Savegame, DoubleDelete) {
  scoped_ptr<Savegame> savegame = CreateSavegame();

  Savegame::ByteVector buf;
  for (int i = 0; i < 1024; ++i) {
    buf.push_back(static_cast<uint8>(i % 256));
  }

  EXPECT_EQ(true, savegame->Write(buf));
  EXPECT_EQ(true, savegame->Delete());
  EXPECT_EQ(false, savegame->Delete());
}

}  // namespace storage
}  // namespace cobalt
