// Copyright (c) 2020 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 "net/third_party/quiche/src/quic/core/http/http_frames.h"

#include <sstream>

#include "net/third_party/quiche/src/quic/core/http/http_constants.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"

namespace quic {
namespace test {

TEST(HttpFramesTest, CancelPushFrame) {
  CancelPushFrame a{1};
  EXPECT_TRUE(a == a);

  CancelPushFrame b{1};
  EXPECT_TRUE(a == b);

  b.push_id = 2;
  EXPECT_FALSE(a == b);
}

TEST(HttpFramesTest, SettingsFrame) {
  SettingsFrame a;
  EXPECT_TRUE(a == a);
  EXPECT_EQ("", a.ToString());

  SettingsFrame b;
  b.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] = 1;
  EXPECT_FALSE(a == b);
  EXPECT_TRUE(b == b);

  a.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] = 2;
  EXPECT_FALSE(a == b);
  a.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] = 1;
  EXPECT_TRUE(a == b);

  EXPECT_EQ("SETTINGS_QPACK_MAX_TABLE_CAPACITY = 1; ", b.ToString());
  std::stringstream s;
  s << b;
  EXPECT_EQ("SETTINGS_QPACK_MAX_TABLE_CAPACITY = 1; ", s.str());
}

TEST(HttpFramesTest, PushPromiseFrame) {
  PushPromiseFrame a{1, ""};
  EXPECT_TRUE(a == a);

  PushPromiseFrame b{2, ""};
  EXPECT_FALSE(a == b);

  b.push_id = 1;
  EXPECT_TRUE(a == b);

  b.headers = "foo";
  EXPECT_FALSE(a == b);
  EXPECT_TRUE(b == b);
}

TEST(HttpFramesTest, GoAwayFrame) {
  GoAwayFrame a{1};
  EXPECT_TRUE(a == a);

  GoAwayFrame b{2};
  EXPECT_FALSE(a == b);

  b.id = 1;
  EXPECT_TRUE(a == b);
}

TEST(HttpFramesTest, MaxPushIdFrame) {
  MaxPushIdFrame a{1};
  EXPECT_TRUE(a == a);

  MaxPushIdFrame b{2};
  EXPECT_FALSE(a == b);

  b.push_id = 1;
  EXPECT_TRUE(a == b);
}

TEST(HttpFramesTest, PriorityUpdateFrame) {
  PriorityUpdateFrame a{REQUEST_STREAM, 0, ""};
  EXPECT_TRUE(a == a);
  PriorityUpdateFrame b{REQUEST_STREAM, 4, ""};
  EXPECT_FALSE(a == b);
  a.prioritized_element_id = 4;
  EXPECT_TRUE(a == b);

  a.prioritized_element_type = PUSH_STREAM;
  EXPECT_FALSE(a == b);
  b.prioritized_element_type = PUSH_STREAM;
  EXPECT_TRUE(a == b);

  a.priority_field_value = "foo";
  EXPECT_FALSE(a == b);

  EXPECT_EQ(
      "Priority Frame : {prioritized_element_type: 128, "
      "prioritized_element_id: 4, priority_field_value: foo}",
      a.ToString());
  std::stringstream s;
  s << a;
  EXPECT_EQ(
      "Priority Frame : {prioritized_element_type: 128, "
      "prioritized_element_id: 4, priority_field_value: foo}",
      s.str());
}

TEST(HttpFramesTest, AcceptChFrame) {
  AcceptChFrame a;
  EXPECT_TRUE(a == a);
  EXPECT_EQ("ACCEPT_CH frame with 0 entries: ", a.ToString());

  AcceptChFrame b{{{"foo", "bar"}}};
  EXPECT_FALSE(a == b);

  a.entries.push_back({"foo", "bar"});
  EXPECT_TRUE(a == b);

  EXPECT_EQ("ACCEPT_CH frame with 1 entries: origin: foo; value: bar",
            a.ToString());
  std::stringstream s;
  s << a;
  EXPECT_EQ("ACCEPT_CH frame with 1 entries: origin: foo; value: bar", s.str());
}

}  // namespace test
}  // namespace quic
