web_bundle_builder_unittest.cc 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/web_package/web_bundle_builder.h"
  5. #include "base/big_endian.h"
  6. #include "base/files/file_path.h"
  7. #include "base/files/file_util.h"
  8. #include "base/path_service.h"
  9. #include "base/strings/string_number_conversions.h"
  10. #include "base/test/task_environment.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace web_package {
  13. namespace {
  14. std::string kFallbackUrl = "https://test.example.org/";
  15. std::string GetTestFileContents(const base::FilePath& path) {
  16. base::FilePath test_data_dir;
  17. base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir);
  18. test_data_dir = test_data_dir.Append(
  19. base::FilePath(FILE_PATH_LITERAL("components/test/data/web_package")));
  20. std::string contents;
  21. EXPECT_TRUE(base::ReadFileToString(test_data_dir.Append(path), &contents));
  22. return contents;
  23. }
  24. std::vector<uint8_t> GetStringAsBytes(base::StringPiece contents) {
  25. auto bytes = base::as_bytes(base::make_span(contents));
  26. return std::vector<uint8_t>(bytes.begin(), bytes.end());
  27. }
  28. } // namespace
  29. class WebBundleBuilderTest : public testing::Test {
  30. private:
  31. base::test::TaskEnvironment task_environment_;
  32. };
  33. TEST_F(WebBundleBuilderTest, CorrectWebBundleSizeIsWritten) {
  34. WebBundleBuilder builder;
  35. builder.AddExchange("https://test.example.com/",
  36. {{":status", "200"}, {"content-type", "text/plain"}},
  37. "payload");
  38. std::vector<uint8_t> bundle = builder.CreateBundle();
  39. uint8_t written_size[8];
  40. memcpy(written_size, bundle.data() + bundle.size() - 8, 8);
  41. uint64_t written_size_int;
  42. base::ReadBigEndian(written_size, &written_size_int);
  43. EXPECT_EQ(bundle.size(), written_size_int);
  44. }
  45. TEST_F(WebBundleBuilderTest, ByteByByteComparison) {
  46. WebBundleBuilder builder;
  47. builder.AddExchange(
  48. "https://test.example.org/",
  49. {{":status", "200"}, {"content-type", "text/html; charset=UTF-8"}},
  50. "<a href='index.html'>click for web bundles</a>");
  51. builder.AddExchange(
  52. "https://test.example.org/index.html",
  53. {{":status", "200"}, {"content-type", "text/html; charset=UTF-8"}},
  54. "<p>Hello Web Bundles!</p>");
  55. std::vector<uint8_t> bundle = builder.CreateBundle();
  56. std::vector<uint8_t> expected_bundle = GetStringAsBytes(
  57. GetTestFileContents(base::FilePath(FILE_PATH_LITERAL("simple_b2.wbn"))));
  58. EXPECT_EQ(bundle, expected_bundle);
  59. }
  60. TEST_F(WebBundleBuilderTest, MoreThan23ResponsesInABundle) {
  61. WebBundleBuilder builder;
  62. for (int i = 0; i < 24; ++i) {
  63. builder.AddExchange("https://test.example.org/" + base::NumberToString(i),
  64. {{":status", "200"}, {"content-type", "text/html;"}},
  65. "<p>Hello Web Bundles!</p>");
  66. }
  67. std::vector<uint8_t> bundle = builder.CreateBundle();
  68. std::vector<uint8_t> expected_bundle = GetStringAsBytes(GetTestFileContents(
  69. base::FilePath(FILE_PATH_LITERAL("24_responses.wbn"))));
  70. EXPECT_EQ(bundle, expected_bundle);
  71. }
  72. } // namespace web_package