// Copyright 2009 Google Inc. All Rights Reserved.

#include "file.h"

#include "UniquePtr.h"
#include "common_test.h"
#include "os.h"

namespace art {

class FileTest : public CommonTest {};

TEST_F(FileTest, Read) {
  std::string filename = GetLibCoreDexFileName();
  UniquePtr<File> file(OS::OpenFile(filename.c_str(), false));
  ASSERT_TRUE(file.get() != NULL);
  EXPECT_STREQ(filename.c_str(), file->name());
  char buffer[3];
  buffer[0] = '\0';
  EXPECT_TRUE(file->ReadFully(buffer, 2));  // ReadFully returns true.
  buffer[2] = '\0';
  EXPECT_STREQ("PK", buffer); // zip file magic
  EXPECT_FALSE(file->WriteByte(1));  // Cannot write to a read-only file.
}


TEST_F(FileTest, FileLength) {
  std::string filename = GetLibCoreDexFileName();
  UniquePtr<File> file(OS::OpenFile(filename.c_str(), false));
  ASSERT_TRUE(file.get() != NULL);
  EXPECT_NE(0, file->Length());
}


TEST_F(FileTest, FilePosition) {
  std::string filename = GetLibCoreDexFileName();
  UniquePtr<File> file(OS::OpenFile(filename.c_str(), false));
  ASSERT_TRUE(file.get() != NULL);
  char buf[4];
  EXPECT_TRUE(file->ReadFully(buf, 2));
  EXPECT_EQ(2, file->Position());
  EXPECT_TRUE(file->ReadFully(buf, 2));
  EXPECT_EQ(4, file->Position());
}


TEST_F(FileTest, FileFd) {
  std::string filename = GetLibCoreDexFileName();
  UniquePtr<File> file(OS::OpenFile(filename.c_str(), false));
  ASSERT_TRUE(file.get() != NULL);
  EXPECT_NE(-1, file->Fd());
}


}  // namespace art
