// Copyright 2016 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 <algorithm>
#include <string>

#include <base/files/scoped_temp_dir.h>
#include <base/strings/utf_string_conversions.h>
#include <gtest/gtest.h>

#include "arc/container/obb-mounter/util.h"

namespace fat {

TEST(UtilTest, AppendLongFileNameCharactersReversed) {
  // 20 characters: 13 characters for slot2, 7 for slot1.
  std::u16string str = u"0123456789abcdef.txt";
  msdos_dir_slot slot1 = {}, slot2 = {};
  // The last slot comes first.
  memcpy(slot2.name0_4, str.c_str(), sizeof(slot2.name0_4));
  memcpy(slot2.name5_10, str.c_str() + 5, sizeof(slot2.name5_10));
  memcpy(slot2.name11_12, str.c_str() + 11, sizeof(slot2.name11_12));
  memcpy(slot1.name0_4, str.c_str() + 13, sizeof(slot1.name0_4));
  memcpy(slot1.name5_10, str.c_str() + 18, sizeof(char16_t) * 2);

  std::u16string buf;
  AppendLongFileNameCharactersReversed(slot1, &buf);
  ASSERT_EQ(13, buf.size());
  AppendLongFileNameCharactersReversed(slot2, &buf);
  ASSERT_EQ(13 * 2, buf.size());
  // Characters are reversed.
  std::reverse(buf.begin(), buf.end());
  // Compare with the string.
  EXPECT_EQ(0, buf[str.size()]);  // Null-terminated.
  EXPECT_EQ(str, buf.substr(0, str.size()));

  // ID == 0x40 means starting a new name.
  slot1.id = 0x40;
  AppendLongFileNameCharactersReversed(slot1, &buf);
  // The buffer was cleared before appending characters.
  EXPECT_EQ(13, buf.size());
}

TEST(UtilTest, ReadFileAllocationTable) {
  base::ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
  base::File file;
  file.Initialize(
      temp_dir.GetPath().AppendASCII("test"),
      base::File::FLAG_CREATE | base::File::FLAG_READ | base::File::FLAG_WRITE);
  ASSERT_TRUE(file.IsValid());

  // Test FAT 12.
  // 0x123, 0x456, 0x789, EOF
  const int64_t fat_start = 0x100;
  const uint8_t data12[] = {0x23, 0x61, 0x45, 0x89, 0xf7, 0xff};
  EXPECT_EQ(file.Write(fat_start, reinterpret_cast<const char*>(data12),
                       sizeof(data12)),
            sizeof(data12));
  EXPECT_EQ(0x123,
            ReadFileAllocationTable(&file, FatType::FAT_12, fat_start, 0));
  EXPECT_EQ(0x456,
            ReadFileAllocationTable(&file, FatType::FAT_12, fat_start, 1));
  EXPECT_EQ(0x789,
            ReadFileAllocationTable(&file, FatType::FAT_12, fat_start, 2));
  EXPECT_EQ(kInvalidValue,
            ReadFileAllocationTable(&file, FatType::FAT_12, fat_start, 3));

  // Test FAT 16.
  const __le16 data16[] = {htole16(0x1234), htole16(0x5678), htole16(0x9abc),
                           htole16(0xffff)};
  EXPECT_EQ(file.Write(fat_start, reinterpret_cast<const char*>(data16),
                       sizeof(data16)),
            sizeof(data16));
  EXPECT_EQ(0x1234,
            ReadFileAllocationTable(&file, FatType::FAT_16, fat_start, 0));
  EXPECT_EQ(0x5678,
            ReadFileAllocationTable(&file, FatType::FAT_16, fat_start, 1));
  EXPECT_EQ(0x9abc,
            ReadFileAllocationTable(&file, FatType::FAT_16, fat_start, 2));
  EXPECT_EQ(kInvalidValue,
            ReadFileAllocationTable(&file, FatType::FAT_16, fat_start, 3));

  // Test FAT 32.
  const __le32 data32[] = {htole32(0x01234567), htole32(0x089abcde),
                           htole32(0x0f123456), htole32(0xffffffff)};
  EXPECT_EQ(file.Write(fat_start, reinterpret_cast<const char*>(data32),
                       sizeof(data32)),
            sizeof(data32));
  EXPECT_EQ(0x01234567,
            ReadFileAllocationTable(&file, FatType::FAT_32, fat_start, 0));
  EXPECT_EQ(0x089abcde,
            ReadFileAllocationTable(&file, FatType::FAT_32, fat_start, 1));
  EXPECT_EQ(0x0f123456,
            ReadFileAllocationTable(&file, FatType::FAT_32, fat_start, 2));
  EXPECT_EQ(kInvalidValue,
            ReadFileAllocationTable(&file, FatType::FAT_32, fat_start, 3));
}

}  // namespace fat
