// Copyright 2018 The Chromium 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 "third_party/blink/renderer/platform/loader/ftp_directory_listing.h"

#include <string>

#include "base/test/icu_test_util.h"
#include "net/net_buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
#include "third_party/blink/renderer/platform/shared_buffer.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/allocator.h"
#include "third_party/icu/source/i18n/unicode/timezone.h"

namespace blink {
namespace {

class ScopedRestoreDefaultTimezone {
  STACK_ALLOCATED();

 public:
  explicit ScopedRestoreDefaultTimezone(const char* zoneid) {
    original_zone_.reset(icu::TimeZone::createDefault());
    icu::TimeZone::adoptDefault(icu::TimeZone::createTimeZone(zoneid));
  }
  ~ScopedRestoreDefaultTimezone() {
    icu::TimeZone::adoptDefault(original_zone_.release());
  }

  ScopedRestoreDefaultTimezone(const ScopedRestoreDefaultTimezone&) = delete;
  ScopedRestoreDefaultTimezone& operator=(const ScopedRestoreDefaultTimezone&) =
      delete;

 private:
  std::unique_ptr<icu::TimeZone> original_zone_;
};

#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
TEST(FtpDirectoryListingTest, Top) {
  base::test::ScopedRestoreICUDefaultLocale locale("en_US");
  ScopedRestoreDefaultTimezone timezone("Asia/Tokyo");

  const KURL url("ftp://ftp.example.com/");

  const std::string input = "drwxr-xr-x  1 ftp ftp 17 Feb 15 2016 top\r\n";
  // Referring to code in net/base/dir_header.html, but the code itself
  // is not included in the expectation due to unittest configuration.
  std::string expected = R"JS(<script>start("/");</script>
<script>addRow("top","top",1,0,"0 B",1455494400,"2/15/16, 9:00:00 AM");</script>
)JS";
  auto input_buffer = SharedBuffer::Create();
  input_buffer->Append(input.data(), input.size());

  auto output = GenerateFtpDirectoryListingHtml(url, input_buffer.get());
  std::string flatten_output;
  for (const auto span : *output) {
    flatten_output.append(span.data(), span.size());
  }

  EXPECT_EQ(expected, flatten_output);
}
#endif  // !BUILDFLAG(DISABLE_FTP_SUPPORT)

#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
TEST(FtpDirectoryListingTest, NonTop) {
  base::test::ScopedRestoreICUDefaultLocale locale("en_US");
  ScopedRestoreDefaultTimezone timezone("Asia/Tokyo");
  const KURL url("ftp://ftp.example.com/foo/");

  const std::string input = "drwxr-xr-x  1 ftp ftp 17 Feb 15 2016 dir\r\n";
  // Referring to code in net/base/dir_header.html, but the code itself
  // is not included in the expectation due to unittest configuration.
  std::string expected = R"JS(<script>start("/foo/");</script>
<script>onHasParentDirectory();</script>
<script>addRow("dir","dir",1,0,"0 B",1455494400,"2/15/16, 9:00:00 AM");</script>
)JS";

  auto input_buffer = SharedBuffer::Create();
  input_buffer->Append(input.data(), input.size());

  auto output = GenerateFtpDirectoryListingHtml(url, input_buffer.get());
  std::string flatten_output;
  for (const auto span : *output) {
    flatten_output.append(span.data(), span.size());
  }

  EXPECT_EQ(expected, flatten_output);
}
#endif  // !BUILDFLAG(DISABLE_FTP_SUPPORT)

TEST(FtpDirectoryListingTest, Fail) {
  base::test::ScopedRestoreICUDefaultLocale locale("en_US");
  ScopedRestoreDefaultTimezone timezone("Asia/Tokyo");
  const KURL url("ftp://ftp.example.com/");
  auto input = SharedBuffer::Create();
  input->Append("bogus", 5u);
  std::string expected = R"JS(<script>start("/");</script>
<script>onListingParsingError();</script>
)JS";
  auto output = GenerateFtpDirectoryListingHtml(url, input.get());
  std::string flatten_output;
  for (const auto span : *output) {
    flatten_output.append(span.data(), span.size());
  }

  EXPECT_EQ(expected, flatten_output);
}

}  // namespace

}  // namespace blink
