// Copyright (c) 2013 The Chromium OS 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 "p2p/common/testutil.h"

#include <glib-object.h>

#include <gtest/gtest.h>
#include <gtest/gtest-spi.h>

#include <base/files/file_util.h>

using std::string;
using std::vector;

using base::FilePath;

namespace p2p {

namespace testutil {

TEST(TestUtil, TestDir) {
  FilePath testdir = SetupTestDir("test-dir");

  string path = testdir.value();

  EXPECT_EQ(path.find("/tmp/p2p-testing-test-dir."), 0);

  EXPECT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_EXISTS));
  EXPECT_TRUE(g_file_test(path.c_str(), G_FILE_TEST_IS_DIR));

  int num_files = 0;
  GDir* dir = g_dir_open(path.c_str(), 0, NULL);
  while (g_dir_read_name(dir) != NULL) {
    num_files++;
  }
  g_dir_close(dir);
  EXPECT_EQ(num_files, 0);

  TeardownTestDir(testdir);

  EXPECT_TRUE(!g_file_test(path.c_str(), G_FILE_TEST_EXISTS));
}

TEST(TestUtil, ExpectCommandSimple) {
  EXPECT_COMMAND(0, "true");
  EXPECT_COMMAND(1, "false");
}

TEST(TestUtil, ExpectCommandSideEffects) {
  FilePath testdir = SetupTestDir("expect-command-side-effects");

  EXPECT_COMMAND(
      0, "echo -n xyz > %s", testdir.Append("file.txt").value().c_str());

  string contents;
  EXPECT_TRUE(base::ReadFileToString(testdir.Append("file.txt"), &contents));
  EXPECT_EQ(contents, "xyz");

  TeardownTestDir(testdir);
}

TEST(TestUtil, FileSize) {
  FilePath testdir = SetupTestDir("expect-file-size");

  EXPECT_COMMAND(0, "echo -n 1 > %s", testdir.Append("a").value().c_str());
  EXPECT_COMMAND(0, "echo -n 11 > %s", testdir.Append("b").value().c_str());
  EXPECT_COMMAND(0, "echo -n 111 > %s", testdir.Append("c").value().c_str());

  ExpectFileSize(testdir, "a", 1);
  ExpectFileSize(testdir, "b", 2);
  ExpectFileSize(testdir, "c", 3);

  TeardownTestDir(testdir);
}

}  // namespace testutil

}  // namespace p2p
