// Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "core/fpdfdoc/cpdf_filespec.h"

#include <array>
#include <memory>
#include <utility>
#include <vector>

#include "build/build_config.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_string.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/test_support.h"

TEST(CPDFFileSpecTest, EncodeDecodeFileName) {
  static const std::vector<pdfium::NullTermWstrFuncTestData> test_data = {
    // Empty src string.
    {L"", L""},
    // only file name.
    {L"test.pdf", L"test.pdf"},
#if BUILDFLAG(IS_WIN)
    // With drive identifier.
    {L"r:\\pdfdocs\\spec.pdf", L"/r/pdfdocs/spec.pdf"},
    // Relative path.
    {L"My Document\\test.pdf", L"My Document/test.pdf"},
    // Absolute path without drive identifier.
    {L"\\pdfdocs\\spec.pdf", L"//pdfdocs/spec.pdf"},
    // Absolute path with double backslashes.
    {L"\\\\pdfdocs\\spec.pdf", L"/pdfdocs/spec.pdf"},
// Network resource name. It is not supported yet.
// {L"pclib/eng:\\pdfdocs\\spec.pdf", L"/pclib/eng/pdfdocs/spec.pdf"},
#elif BUILDFLAG(IS_APPLE)
    // Absolute path with colon separator.
    {L"Mac HD:PDFDocs:spec.pdf", L"/Mac HD/PDFDocs/spec.pdf"},
    // Relative path with colon separator.
    {L"PDFDocs:spec.pdf", L"PDFDocs/spec.pdf"},
#else
    // Relative path.
    {L"./docs/test.pdf", L"./docs/test.pdf"},
    // Relative path with parent dir.
    {L"../test_docs/test.pdf", L"../test_docs/test.pdf"},
    // Absolute path.
    {L"/usr/local/home/test.pdf", L"/usr/local/home/test.pdf"},
#endif
  };
  for (const auto& data : test_data) {
    EXPECT_EQ(data.expected, CPDF_FileSpec::EncodeFileName(data.input));
    // DecodeFileName is the reverse procedure of EncodeFileName.
    EXPECT_EQ(data.input, CPDF_FileSpec::DecodeFileName(data.expected));
  }
}

TEST(CPDFFileSpecTest, GetFileName) {
  {
    // String object.
    static const pdfium::NullTermWstrFuncTestData test_data = {
#if BUILDFLAG(IS_WIN)
      L"/C/docs/test.pdf",
      L"C:\\docs\\test.pdf"
#elif BUILDFLAG(IS_APPLE)
      L"/Mac HD/docs/test.pdf",
      L"Mac HD:docs:test.pdf"
#else
      L"/docs/test.pdf",
      L"/docs/test.pdf"
#endif
    };
    auto str_obj = pdfium::MakeRetain<CPDF_String>(nullptr, test_data.input);
    CPDF_FileSpec file_spec(str_obj);
    EXPECT_EQ(test_data.expected, file_spec.GetFileName());
  }
  {
    // Dictionary object.
    static constexpr std::array<pdfium::NullTermWstrFuncTestData, 5> test_data =
        {{
#if BUILDFLAG(IS_WIN)
            {L"/C/docs/test.pdf", L"C:\\docs\\test.pdf"},
            {L"/D/docs/test.pdf", L"D:\\docs\\test.pdf"},
            {L"/E/docs/test.pdf", L"E:\\docs\\test.pdf"},
            {L"/F/docs/test.pdf", L"F:\\docs\\test.pdf"},
            {L"/G/docs/test.pdf", L"G:\\docs\\test.pdf"},
#elif BUILDFLAG(IS_APPLE)
            {L"/Mac HD/docs1/test.pdf", L"Mac HD:docs1:test.pdf"},
            {L"/Mac HD/docs2/test.pdf", L"Mac HD:docs2:test.pdf"},
            {L"/Mac HD/docs3/test.pdf", L"Mac HD:docs3:test.pdf"},
            {L"/Mac HD/docs4/test.pdf", L"Mac HD:docs4:test.pdf"},
            {L"/Mac HD/docs5/test.pdf", L"Mac HD:docs5:test.pdf"},
#else
            {L"/docs/a/test.pdf", L"/docs/a/test.pdf"},
            {L"/docs/b/test.pdf", L"/docs/b/test.pdf"},
            {L"/docs/c/test.pdf", L"/docs/c/test.pdf"},
            {L"/docs/d/test.pdf", L"/docs/d/test.pdf"},
            {L"/docs/e/test.pdf", L"/docs/e/test.pdf"},
#endif
        }};
    // Keyword fields in reverse order of precedence to retrieve the file name.
    static constexpr std::array<const char*, 5> keywords = {
        {"Unix", "Mac", "DOS", "F", "UF"}};
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    CPDF_FileSpec file_spec(dict_obj);
    EXPECT_TRUE(file_spec.GetFileName().IsEmpty());
    for (size_t i = 0; i < std::size(keywords); ++i) {
      dict_obj->SetNewFor<CPDF_String>(keywords[i], test_data[i].input);
      EXPECT_EQ(test_data[i].expected, file_spec.GetFileName());
    }

    // With all the former fields and 'FS' field suggests 'URL' type.
    dict_obj->SetNewFor<CPDF_String>("FS", "URL");
    // Url string is not decoded.
    EXPECT_EQ(test_data[4].input, file_spec.GetFileName());
  }
  {
    // Invalid object.
    auto name_obj = pdfium::MakeRetain<CPDF_Name>(nullptr, "test.pdf");
    CPDF_FileSpec file_spec(name_obj);
    EXPECT_TRUE(file_spec.GetFileName().IsEmpty());
  }
  {
    // Invalid CPDF_Name objects in dictionary. See https://crbug.com/959183
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    CPDF_FileSpec file_spec(dict_obj);
    for (const char* key : {"Unix", "Mac", "DOS", "F", "UF"}) {
      dict_obj->SetNewFor<CPDF_Name>(key, "http://evil.org");
      EXPECT_TRUE(file_spec.GetFileName().IsEmpty());
    }
    dict_obj->SetNewFor<CPDF_String>("FS", "URL");
    EXPECT_TRUE(file_spec.GetFileName().IsEmpty());
  }
}

TEST(CPDFFileSpecTest, GetFileStream) {
  {
    // Invalid object.
    auto name_obj = pdfium::MakeRetain<CPDF_Name>(nullptr, "test.pdf");
    CPDF_FileSpec file_spec(name_obj);
    EXPECT_FALSE(file_spec.GetFileStream());
  }
  {
    // Dictionary object missing its embedded files dictionary.
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    CPDF_FileSpec file_spec(dict_obj);
    EXPECT_FALSE(file_spec.GetFileStream());
  }
  {
    // Dictionary object with an empty embedded files dictionary.
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    dict_obj->SetNewFor<CPDF_Dictionary>("EF");
    CPDF_FileSpec file_spec(dict_obj);
    EXPECT_FALSE(file_spec.GetFileStream());
  }
  {
    CPDF_IndirectObjectHolder object_holder;
    // Dictionary object with a non-empty embedded files dictionary.
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    dict_obj->SetNewFor<CPDF_Dictionary>("EF");
    CPDF_FileSpec file_spec(dict_obj);

    static constexpr wchar_t file_name[] = L"test.pdf";
    static constexpr std::array<const char*, 5> keys = {
        {"Unix", "Mac", "DOS", "F", "UF"}};
    static constexpr std::array<const char*, 5> streams = {
        {"test1", "test2", "test3", "test4", "test5"}};
    static_assert(std::size(keys) == std::size(streams), "size mismatch");
    RetainPtr<CPDF_Dictionary> file_dict = dict_obj->GetMutableDictFor("EF");

    // Keys in reverse order of precedence to retrieve the file content stream.
    for (size_t i = 0; i < std::size(keys); ++i) {
      // Set the file name.
      dict_obj->SetNewFor<CPDF_String>(keys[i], file_name);

      // Set the file stream.
      auto stream_object = object_holder.NewIndirect<CPDF_Stream>(
          ByteStringView(streams[i]).unsigned_span());
      ASSERT_TRUE(stream_object);
      const uint32_t stream_object_number = stream_object->GetObjNum();
      ASSERT_GT(stream_object_number, 0u);
      file_dict->SetNewFor<CPDF_Reference>(keys[i], &object_holder,
                                           stream_object_number);

      // Check that the file content stream is as expected.
      EXPECT_EQ(streams[i],
                file_spec.GetFileStream()->GetUnicodeText().ToUTF8());

      if (i == 2) {
        dict_obj->SetNewFor<CPDF_String>("FS", "URL");
        EXPECT_FALSE(file_spec.GetFileStream());
      }
    }
  }
}

TEST(CPDFFileSpecTest, GetParamsDict) {
  {
    // Invalid object.
    auto name_obj = pdfium::MakeRetain<CPDF_Name>(nullptr, "test.pdf");
    CPDF_FileSpec file_spec(name_obj);
    EXPECT_FALSE(file_spec.GetParamsDict());
  }
  {
    CPDF_IndirectObjectHolder object_holder;

    // Dictionary object.
    auto dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
    dict_obj->SetNewFor<CPDF_Dictionary>("EF");
    dict_obj->SetNewFor<CPDF_String>("UF", L"test.pdf");
    CPDF_FileSpec file_spec(dict_obj);
    EXPECT_FALSE(file_spec.GetParamsDict());

    // Add a file stream to the embedded files dictionary.
    RetainPtr<CPDF_Dictionary> file_dict = dict_obj->GetMutableDictFor("EF");
    static constexpr char kHello[] = "hello";
    auto stream_object =
        object_holder.NewIndirect<CPDF_Stream>(pdfium::as_byte_span(kHello));
    ASSERT_TRUE(stream_object);
    const uint32_t stream_object_number = stream_object->GetObjNum();
    ASSERT_GT(stream_object_number, 0u);
    file_dict->SetNewFor<CPDF_Reference>("UF", &object_holder,
                                         stream_object_number);

    // Add a params dictionary to the file stream.
    RetainPtr<CPDF_Stream> stream = file_dict->GetMutableStreamFor("UF");
    RetainPtr<CPDF_Dictionary> stream_dict = stream->GetMutableDict();
    stream_dict->SetNewFor<CPDF_Dictionary>("Params");
    EXPECT_TRUE(file_spec.GetParamsDict());

    // Add a parameter to the params dictionary.
    RetainPtr<CPDF_Dictionary> params_dict =
        stream_dict->GetMutableDictFor("Params");
    params_dict->SetNewFor<CPDF_Number>("Size", 6);
    EXPECT_EQ(6, file_spec.GetParamsDict()->GetIntegerFor("Size"));
  }
}
