// 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 "quic/core/http/http_frames.h"

#include <sstream>

#include "quic/core/http/http_constants.h"
#include "quic/platform/api/quic_test.h"

namespace quic {
namespace test {

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, 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
