Adds a new operator to SpdyHeaderBlock::ValueProxy, allowing it to be compared with SpdyStringPiece.

gfe-relnote: n/a (new code, only used in tests)
PiperOrigin-RevId: 285846905
Change-Id: I5273fbe19b4cb9c7778f98fd53e2fb7d003881d5
diff --git a/spdy/core/spdy_header_block.cc b/spdy/core/spdy_header_block.cc
index 609f6d7..c87bfff 100644
--- a/spdy/core/spdy_header_block.cc
+++ b/spdy/core/spdy_header_block.cc
@@ -140,7 +140,7 @@
 }
 
 SpdyHeaderBlock::ValueProxy& SpdyHeaderBlock::ValueProxy::operator=(
-    const SpdyStringPiece value) {
+    SpdyStringPiece value) {
   *spdy_header_block_value_size_ += value.size();
   SpdyHeaderStorage* storage = &block_->storage_;
   if (lookup_result_ == block_->map_.end()) {
@@ -158,6 +158,14 @@
   return *this;
 }
 
+bool SpdyHeaderBlock::ValueProxy::operator==(SpdyStringPiece value) const {
+  if (lookup_result_ == block_->map_.end()) {
+    return false;
+  } else {
+    return value == lookup_result_->second.value();
+  }
+}
+
 std::string SpdyHeaderBlock::ValueProxy::as_string() const {
   if (lookup_result_ == block_->map_.end()) {
     return "";
diff --git a/spdy/core/spdy_header_block.h b/spdy/core/spdy_header_block.h
index bd575f4..b02284f 100644
--- a/spdy/core/spdy_header_block.h
+++ b/spdy/core/spdy_header_block.h
@@ -194,7 +194,10 @@
     ValueProxy& operator=(const ValueProxy& other) = delete;
 
     // Assignment modifies the underlying SpdyHeaderBlock.
-    ValueProxy& operator=(const SpdyStringPiece other);
+    ValueProxy& operator=(SpdyStringPiece value);
+
+    // Provides easy comparison against SpdyStringPiece.
+    bool operator==(SpdyStringPiece value) const;
 
     std::string as_string() const;
 
diff --git a/spdy/core/spdy_header_block_test.cc b/spdy/core/spdy_header_block_test.cc
index 774854b..7695aad 100644
--- a/spdy/core/spdy_header_block_test.cc
+++ b/spdy/core/spdy_header_block_test.cc
@@ -189,6 +189,27 @@
   EXPECT_EQ("singleton", block["h4"]);
 }
 
+TEST(SpdyHeaderBlockTest, CompareValueToSpdyStringPiece) {
+  SpdyHeaderBlock block;
+  block["foo"] = "foo";
+  block.AppendValueOrAddHeader("foo", "bar");
+  const auto& val = block["foo"];
+  const char expected[] = "foo\0bar";
+  EXPECT_TRUE(SpdyStringPiece(expected, 7) == val);
+  EXPECT_TRUE(val == SpdyStringPiece(expected, 7));
+  EXPECT_FALSE(SpdyStringPiece(expected, 3) == val);
+  EXPECT_FALSE(val == SpdyStringPiece(expected, 3));
+  const char not_expected[] = "foo\0barextra";
+  EXPECT_FALSE(SpdyStringPiece(not_expected, 12) == val);
+  EXPECT_FALSE(val == SpdyStringPiece(not_expected, 12));
+
+  const auto& val2 = block["foo2"];
+  EXPECT_FALSE(SpdyStringPiece(expected, 7) == val2);
+  EXPECT_FALSE(val2 == SpdyStringPiece(expected, 7));
+  EXPECT_FALSE(SpdyStringPiece("") == val2);
+  EXPECT_FALSE(val2 == SpdyStringPiece(""));
+}
+
 // This test demonstrates that the SpdyHeaderBlock data structure does not place
 // any limitations on the characters present in the header names.
 TEST(SpdyHeaderBlockTest, UpperCaseNames) {
diff --git a/spdy/core/spdy_test_utils.h b/spdy/core/spdy_test_utils.h
index e2c3b47..ff08a50 100644
--- a/spdy/core/spdy_test_utils.h
+++ b/spdy/core/spdy_test_utils.h
@@ -19,7 +19,7 @@
 
 inline bool operator==(SpdyStringPiece x,
                        const SpdyHeaderBlock::ValueProxy& y) {
-  return x == y.as_string();
+  return y.operator==(x);
 }
 
 namespace test {