// 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
