Remove Http2ReconstructObject.

I do not believe it is worth it to keep Http2ReconstructObject() and
Http2DefaultReconstructObject(): they are quite complicated and provide little
value.  I am not aware of any bugs caught by this device.

gfe-relnote: n/a, test-only code.
PiperOrigin-RevId: 289134799
Change-Id: Iedae75a482116753e4a975d8d55b758249757fac
diff --git a/http2/decoder/http2_frame_decoder_test.cc b/http2/decoder/http2_frame_decoder_test.cc
index 20e39eb..410202f 100644
--- a/http2/decoder/http2_frame_decoder_test.cc
+++ b/http2/decoder/http2_frame_decoder_test.cc
@@ -12,7 +12,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "net/third_party/quiche/src/http2/http2_constants.h"
 #include "net/third_party/quiche/src/http2/platform/api/http2_logging.h"
-#include "net/third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h"
 #include "net/third_party/quiche/src/http2/platform/api/http2_test_helpers.h"
 #include "net/third_party/quiche/src/http2/test_tools/frame_parts.h"
 #include "net/third_party/quiche/src/http2/test_tools/frame_parts_collector_listener.h"
@@ -38,9 +37,9 @@
  protected:
   void SetUp() override {
     // On any one run of this suite, we'll always choose the same value for
-    // use_default_reconstruct_ because the random seed is the same for each
+    // use_default_constructor_ because the random seed is the same for each
     // test case, but across runs the random seed changes.
-    use_default_reconstruct_ = Random().OneIn(2);
+    use_default_constructor_ = Random().OneIn(2);
   }
 
   DecodeStatus StartDecoding(DecodeBuffer* db) override {
@@ -48,7 +47,7 @@
     collector_.Reset();
     PrepareDecoder();
 
-    DecodeStatus status = decoder_.DecodeFrame(db);
+    DecodeStatus status = decoder_->DecodeFrame(db);
     if (status != DecodeStatus::kDecodeInProgress) {
       // Keep track of this so that a concrete test can verify that both fast
       // and slow decoding paths have been tested.
@@ -62,7 +61,7 @@
 
   DecodeStatus ResumeDecoding(DecodeBuffer* db) override {
     HTTP2_DVLOG(2) << "ResumeDecoding, db->Remaining=" << db->Remaining();
-    DecodeStatus status = decoder_.DecodeFrame(db);
+    DecodeStatus status = decoder_->DecodeFrame(db);
     if (status != DecodeStatus::kDecodeInProgress) {
       // Keep track of this so that a concrete test can verify that both fast
       // and slow decoding paths have been tested.
@@ -78,35 +77,31 @@
   // stays there until the remaining bytes of the frame's payload have been
   // skipped over. There are no callbacks for this situation.
   void ConfirmDiscardsRemainingPayload() {
-    ASSERT_TRUE(decoder_.IsDiscardingPayload());
+    ASSERT_TRUE(decoder_->IsDiscardingPayload());
     size_t remaining =
-        Http2FrameDecoderPeer::remaining_total_payload(&decoder_);
+        Http2FrameDecoderPeer::remaining_total_payload(decoder_.get());
     // The decoder will discard the remaining bytes, but not go beyond that,
     // which these conditions verify.
     size_t extra = 10;
     std::string junk(remaining + extra, '0');
     DecodeBuffer tmp(junk);
-    EXPECT_EQ(DecodeStatus::kDecodeDone, decoder_.DecodeFrame(&tmp));
+    EXPECT_EQ(DecodeStatus::kDecodeDone, decoder_->DecodeFrame(&tmp));
     EXPECT_EQ(remaining, tmp.Offset());
     EXPECT_EQ(extra, tmp.Remaining());
-    EXPECT_FALSE(decoder_.IsDiscardingPayload());
+    EXPECT_FALSE(decoder_->IsDiscardingPayload());
   }
 
   void PrepareDecoder() {
-    // Save and restore the maximum_payload_size when reconstructing
-    // the decoder.
-    size_t maximum_payload_size = decoder_.maximum_payload_size();
-
     // Alternate which constructor is used.
-    if (use_default_reconstruct_) {
-      Http2DefaultReconstructObject(&decoder_, RandomPtr());
-      decoder_.set_listener(&collector_);
+    if (use_default_constructor_) {
+      decoder_ = std::make_unique<Http2FrameDecoder>();
+      decoder_->set_listener(&collector_);
     } else {
-      Http2ReconstructObject(&decoder_, RandomPtr(), &collector_);
+      decoder_ = std::make_unique<Http2FrameDecoder>(&collector_);
     }
-    decoder_.set_maximum_payload_size(maximum_payload_size);
+    decoder_->set_maximum_payload_size(maximum_payload_size_);
 
-    use_default_reconstruct_ = !use_default_reconstruct_;
+    use_default_constructor_ = !use_default_constructor_;
   }
 
   void ResetDecodeSpeedCounters() {
@@ -216,9 +211,10 @@
   // ResumeDecodingPayload.
   size_t slow_decode_count_ = 0;
 
+  uint32_t maximum_payload_size_ = Http2SettingsInfo::DefaultMaxFrameSize();
   FramePartsCollectorListener collector_;
-  Http2FrameDecoder decoder_;
-  bool use_default_reconstruct_;
+  std::unique_ptr<Http2FrameDecoder> decoder_;
+  bool use_default_constructor_;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -828,7 +824,7 @@
 // The decoder calls the listener's OnFrameSizeError method if the frame's
 // payload is longer than the currently configured maximum payload size.
 TEST_F(Http2FrameDecoderTest, BeyondMaximum) {
-  decoder_.set_maximum_payload_size(2);
+  maximum_payload_size_ = 2;
   const char kFrameData[] = {
       '\x00', '\x00', '\x07',          // Payload length: 7
       '\x00',                          // DATA
diff --git a/http2/decoder/http2_structure_decoder_test.cc b/http2/decoder/http2_structure_decoder_test.cc
index 09db43e..c522c20 100644
--- a/http2/decoder/http2_structure_decoder_test.cc
+++ b/http2/decoder/http2_structure_decoder_test.cc
@@ -29,7 +29,6 @@
 #include "net/third_party/quiche/src/http2/http2_constants.h"
 #include "net/third_party/quiche/src/http2/http2_structures_test_util.h"
 #include "net/third_party/quiche/src/http2/platform/api/http2_logging.h"
-#include "net/third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h"
 #include "net/third_party/quiche/src/http2/platform/api/http2_test_helpers.h"
 #include "net/third_party/quiche/src/http2/tools/http2_frame_builder.h"
 #include "net/third_party/quiche/src/http2/tools/random_decoder_test.h"
@@ -56,12 +55,12 @@
   }
 
   DecodeStatus StartDecoding(DecodeBuffer* b) override {
-    // Overwrite the current contents of |structure_|, in to which we'll
+    // Overwrite the current contents of |structure_|, into which we'll
     // decode the buffer, so that we can be confident that we really decoded
     // the structure every time.
-    Http2DefaultReconstructObject(&structure_, RandomPtr());
+    structure_ = std::make_unique<S>();
     uint32_t old_remaining = b->Remaining();
-    if (structure_decoder_.Start(&structure_, b)) {
+    if (structure_decoder_.Start(structure_.get(), b)) {
       EXPECT_EQ(old_remaining - S::EncodedSize(), b->Remaining());
       ++fast_decode_count_;
       return DecodeStatus::kDecodeDone;
@@ -78,7 +77,7 @@
     uint32_t old_offset = structure_decoder_.offset();
     EXPECT_LT(old_offset, S::EncodedSize());
     uint32_t avail = b->Remaining();
-    if (structure_decoder_.Resume(&structure_, b)) {
+    if (structure_decoder_.Resume(structure_.get(), b)) {
       EXPECT_LE(S::EncodedSize(), old_offset + avail);
       EXPECT_EQ(b->Remaining(), avail - (S::EncodedSize() - old_offset));
       ++slow_decode_count_;
@@ -106,7 +105,7 @@
     if (expected != nullptr) {
       validator = [expected, this](const DecodeBuffer& db,
                                    DecodeStatus status) -> AssertionResult {
-        VERIFY_EQ(*expected, structure_);
+        VERIFY_EQ(*expected, *structure_);
         return AssertionSuccess();
       };
     }
@@ -138,8 +137,8 @@
     }
     if (expected != nullptr) {
       HTTP2_DVLOG(1) << "DecodeLeadingStructure expected: " << *expected;
-      HTTP2_DVLOG(1) << "DecodeLeadingStructure   actual: " << structure_;
-      VERIFY_EQ(*expected, structure_);
+      HTTP2_DVLOG(1) << "DecodeLeadingStructure   actual: " << *structure_;
+      VERIFY_EQ(*expected, *structure_);
     }
     return AssertionSuccess();
   }
@@ -182,7 +181,7 @@
   }
 
   uint32_t decode_offset_ = 0;
-  S structure_;
+  std::unique_ptr<S> structure_;
   Http2StructureDecoder structure_decoder_;
   size_t fast_decode_count_ = 0;
   size_t slow_decode_count_ = 0;
@@ -207,10 +206,10 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(5u, structure_.payload_length);
-    EXPECT_EQ(Http2FrameType::HEADERS, structure_.type);
-    EXPECT_EQ(Http2FrameFlag::PADDED, structure_.flags);
-    EXPECT_EQ(1u, structure_.stream_id);
+    EXPECT_EQ(5u, structure_->payload_length);
+    EXPECT_EQ(Http2FrameType::HEADERS, structure_->type);
+    EXPECT_EQ(Http2FrameFlag::PADDED, structure_->flags);
+    EXPECT_EQ(1u, structure_->stream_id);
   }
   {
     // Unlikely input.
@@ -223,10 +222,10 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ((1u << 24) - 1u, structure_.payload_length);
-    EXPECT_EQ(static_cast<Http2FrameType>(255), structure_.type);
-    EXPECT_EQ(255, structure_.flags);
-    EXPECT_EQ(0x7FFFFFFFu, structure_.stream_id);
+    EXPECT_EQ((1u << 24) - 1u, structure_->payload_length);
+    EXPECT_EQ(static_cast<Http2FrameType>(255), structure_->type);
+    EXPECT_EQ(255, structure_->flags);
+    EXPECT_EQ(0x7FFFFFFFu, structure_->stream_id);
   }
 }
 
@@ -248,9 +247,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(5u, structure_.stream_dependency);
-    EXPECT_EQ(256u, structure_.weight);
-    EXPECT_EQ(true, structure_.is_exclusive);
+    EXPECT_EQ(5u, structure_->stream_dependency);
+    EXPECT_EQ(256u, structure_->weight);
+    EXPECT_EQ(true, structure_->is_exclusive);
   }
   {
     // clang-format off
@@ -260,9 +259,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(StreamIdMask(), structure_.stream_dependency);
-    EXPECT_EQ(1u, structure_.weight);
-    EXPECT_FALSE(structure_.is_exclusive);
+    EXPECT_EQ(StreamIdMask(), structure_->stream_dependency);
+    EXPECT_EQ(1u, structure_->weight);
+    EXPECT_FALSE(structure_->is_exclusive);
   }
 }
 
@@ -283,8 +282,8 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_TRUE(structure_.IsSupportedErrorCode());
-    EXPECT_EQ(Http2ErrorCode::PROTOCOL_ERROR, structure_.error_code);
+    EXPECT_TRUE(structure_->IsSupportedErrorCode());
+    EXPECT_EQ(Http2ErrorCode::PROTOCOL_ERROR, structure_->error_code);
   }
   {
     // clang-format off
@@ -293,8 +292,8 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_FALSE(structure_.IsSupportedErrorCode());
-    EXPECT_EQ(static_cast<Http2ErrorCode>(0xffffffff), structure_.error_code);
+    EXPECT_FALSE(structure_->IsSupportedErrorCode());
+    EXPECT_EQ(static_cast<Http2ErrorCode>(0xffffffff), structure_->error_code);
   }
 }
 
@@ -316,9 +315,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_TRUE(structure_.IsSupportedParameter());
-    EXPECT_EQ(Http2SettingsParameter::HEADER_TABLE_SIZE, structure_.parameter);
-    EXPECT_EQ(1u << 14, structure_.value);
+    EXPECT_TRUE(structure_->IsSupportedParameter());
+    EXPECT_EQ(Http2SettingsParameter::HEADER_TABLE_SIZE, structure_->parameter);
+    EXPECT_EQ(1u << 14, structure_->value);
   }
   {
     // clang-format off
@@ -328,8 +327,8 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_FALSE(structure_.IsSupportedParameter());
-    EXPECT_EQ(static_cast<Http2SettingsParameter>(0), structure_.parameter);
+    EXPECT_FALSE(structure_->IsSupportedParameter());
+    EXPECT_EQ(static_cast<Http2SettingsParameter>(0), structure_->parameter);
   }
 }
 
@@ -350,7 +349,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(101010u, structure_.promised_stream_id);
+    EXPECT_EQ(101010u, structure_->promised_stream_id);
   }
   {
     // Promised stream id has R-bit (reserved for future use) set, which
@@ -362,7 +361,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(StreamIdMask(), structure_.promised_stream_id);
+    EXPECT_EQ(StreamIdMask(), structure_->promised_stream_id);
   }
 }
 
@@ -382,7 +381,7 @@
         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     };
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_.opaque_bytes));
+    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_->opaque_bytes));
   }
   {
     // All zeros, detect problems handling NULs.
@@ -390,14 +389,14 @@
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     };
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_.opaque_bytes));
+    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_->opaque_bytes));
   }
   {
     const unsigned char kData[] = {
         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     };
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_.opaque_bytes));
+    EXPECT_EQ(ToStringPiece(kData), ToStringPiece(structure_->opaque_bytes));
   }
 }
 
@@ -419,9 +418,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(0u, structure_.last_stream_id);
-    EXPECT_TRUE(structure_.IsSupportedErrorCode());
-    EXPECT_EQ(Http2ErrorCode::HTTP2_NO_ERROR, structure_.error_code);
+    EXPECT_EQ(0u, structure_->last_stream_id);
+    EXPECT_TRUE(structure_->IsSupportedErrorCode());
+    EXPECT_EQ(Http2ErrorCode::HTTP2_NO_ERROR, structure_->error_code);
   }
   {
     // clang-format off
@@ -431,9 +430,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(1u, structure_.last_stream_id);
-    EXPECT_TRUE(structure_.IsSupportedErrorCode());
-    EXPECT_EQ(Http2ErrorCode::HTTP_1_1_REQUIRED, structure_.error_code);
+    EXPECT_EQ(1u, structure_->last_stream_id);
+    EXPECT_TRUE(structure_->IsSupportedErrorCode());
+    EXPECT_EQ(Http2ErrorCode::HTTP_1_1_REQUIRED, structure_->error_code);
   }
   {
     // clang-format off
@@ -443,9 +442,9 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(StreamIdMask(), structure_.last_stream_id);  // No high-bit.
-    EXPECT_FALSE(structure_.IsSupportedErrorCode());
-    EXPECT_EQ(static_cast<Http2ErrorCode>(0xffffffff), structure_.error_code);
+    EXPECT_EQ(StreamIdMask(), structure_->last_stream_id);  // No high-bit.
+    EXPECT_FALSE(structure_->IsSupportedErrorCode());
+    EXPECT_EQ(static_cast<Http2ErrorCode>(0xffffffff), structure_->error_code);
   }
 }
 
@@ -466,7 +465,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(1u << 16, structure_.window_size_increment);
+    EXPECT_EQ(1u << 16, structure_->window_size_increment);
   }
   {
     // Increment must be non-zero, but we need to be able to decode the invalid
@@ -477,7 +476,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(0u, structure_.window_size_increment);
+    EXPECT_EQ(0u, structure_->window_size_increment);
   }
   {
     // Increment has R-bit (reserved for future use) set, which
@@ -489,7 +488,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(StreamIdMask(), structure_.window_size_increment);
+    EXPECT_EQ(StreamIdMask(), structure_->window_size_increment);
   }
 }
 
@@ -510,7 +509,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(0, structure_.origin_length);
+    EXPECT_EQ(0, structure_->origin_length);
   }
   {
     // clang-format off
@@ -519,7 +518,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(20, structure_.origin_length);
+    EXPECT_EQ(20, structure_->origin_length);
   }
   {
     // clang-format off
@@ -528,7 +527,7 @@
     };
     // clang-format on
     ASSERT_TRUE(DecodeLeadingStructure(kData));
-    EXPECT_EQ(65535, structure_.origin_length);
+    EXPECT_EQ(65535, structure_->origin_length);
   }
 }
 
diff --git a/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc b/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc
index 8e94f03..32969ef 100644
--- a/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc
+++ b/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc
@@ -39,11 +39,11 @@
 
   // Reconstruct the FrameDecoderState, prepare the listener, and add it to
   // the FrameDecoderState.
-  Http2DefaultReconstructObject(&frame_decoder_state_, RandomPtr());
-  frame_decoder_state_.set_listener(PrepareListener());
+  frame_decoder_state_ = std::make_unique<FrameDecoderState>();
+  frame_decoder_state_->set_listener(PrepareListener());
 
   // Make sure that a listener was provided.
-  if (frame_decoder_state_.listener() == nullptr) {
+  if (frame_decoder_state_->listener() == nullptr) {
     ADD_FAILURE() << "PrepareListener must return a listener.";
     return DecodeStatus::kDecodeError;
   }
@@ -52,7 +52,8 @@
   // Http2FrameHeader whose payload we're about to decode. That header is the
   // only state that a payload decoder should expect is valid when its Start
   // method is called.
-  FrameDecoderStatePeer::set_frame_header(frame_header_, &frame_decoder_state_);
+  FrameDecoderStatePeer::set_frame_header(frame_header_,
+                                          frame_decoder_state_.get());
   DecodeStatus status = StartDecodingPayload(db);
   if (status != DecodeStatus::kDecodeInProgress) {
     // Keep track of this so that a concrete test can verify that both fast
diff --git a/http2/decoder/payload_decoders/payload_decoder_base_test_util.h b/http2/decoder/payload_decoders/payload_decoder_base_test_util.h
index faa99fd..c5a97a5 100644
--- a/http2/decoder/payload_decoders/payload_decoder_base_test_util.h
+++ b/http2/decoder/payload_decoders/payload_decoder_base_test_util.h
@@ -20,7 +20,6 @@
 #include "net/third_party/quiche/src/http2/http2_constants_test_util.h"
 #include "net/third_party/quiche/src/http2/http2_structures.h"
 #include "net/third_party/quiche/src/http2/platform/api/http2_logging.h"
-#include "net/third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h"
 #include "net/third_party/quiche/src/http2/test_tools/frame_parts.h"
 #include "net/third_party/quiche/src/http2/tools/http2_frame_builder.h"
 #include "net/third_party/quiche/src/http2/tools/random_decoder_test.h"
@@ -62,7 +61,7 @@
     frame_header_is_set_ = true;
   }
 
-  FrameDecoderState* mutable_state() { return &frame_decoder_state_; }
+  FrameDecoderState* mutable_state() { return frame_decoder_state_.get(); }
 
   // Randomize the payload decoder, sets the payload decoder's frame_header_,
   // then start decoding the payload. Called by RandomDecoderTest. This method
@@ -103,7 +102,7 @@
  private:
   bool frame_header_is_set_ = false;
   Http2FrameHeader frame_header_;
-  FrameDecoderState frame_decoder_state_;
+  std::unique_ptr<FrameDecoderState> frame_decoder_state_;
 };
 
 // Base class for payload decoders of type Decoder, with corresponding test
@@ -156,7 +155,7 @@
   }
 
   void PreparePayloadDecoder() override {
-    Http2DefaultReconstructObject(&payload_decoder_, RandomPtr());
+    payload_decoder_ = std::make_unique<Decoder>();
   }
 
   Http2FrameDecoderListener* PrepareListener() override {
@@ -176,14 +175,14 @@
   // Start decoding the payload.
   DecodeStatus StartDecodingPayload(DecodeBuffer* db) override {
     HTTP2_DVLOG(2) << "StartDecodingPayload, db->Remaining=" << db->Remaining();
-    return payload_decoder_.StartDecodingPayload(mutable_state(), db);
+    return payload_decoder_->StartDecodingPayload(mutable_state(), db);
   }
 
   // Resume decoding the payload.
   DecodeStatus ResumeDecodingPayload(DecodeBuffer* db) override {
     HTTP2_DVLOG(2) << "ResumeDecodingPayload, db->Remaining="
                    << db->Remaining();
-    return payload_decoder_.ResumeDecodingPayload(mutable_state(), db);
+    return payload_decoder_->ResumeDecodingPayload(mutable_state(), db);
   }
 
   // Decode one frame's payload and confirm that the listener recorded the
@@ -318,13 +317,7 @@
   }
 
   Listener listener_;
-  union {
-    // Confirm at compile time that Decoder can be in an anonymous union,
-    // i.e. complain loudly if Decoder has members that prevent this, as it
-    // becomes annoying and possibly difficult to deal with non-anonymous
-    // unions and such union members.
-    Decoder payload_decoder_;
-  };
+  std::unique_ptr<Decoder> payload_decoder_;
 };
 
 // A base class for tests parameterized by the total number of bytes of
diff --git a/http2/platform/api/http2_reconstruct_object.h b/http2/platform/api/http2_reconstruct_object.h
deleted file mode 100644
index ddcb312..0000000
--- a/http2/platform/api/http2_reconstruct_object.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 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.
-
-#ifndef QUICHE_HTTP2_PLATFORM_API_HTTP2_RECONSTRUCT_OBJECT_H_
-#define QUICHE_HTTP2_PLATFORM_API_HTTP2_RECONSTRUCT_OBJECT_H_
-
-#include <utility>
-
-#include "net/http2/platform/impl/http2_reconstruct_object_impl.h"
-
-namespace http2 {
-namespace test {
-
-class Http2Random;
-
-// Reconstruct an object so that it is initialized as when it was first
-// constructed. Runs the destructor to handle objects that might own resources,
-// and runs the constructor with the provided arguments, if any.
-template <class T, class... Args>
-void Http2ReconstructObject(T* ptr, Http2Random* rng, Args&&... args) {
-  Http2ReconstructObjectImpl(ptr, rng, std::forward<Args>(args)...);
-}
-
-// This version applies default-initialization to the object.
-template <class T>
-void Http2DefaultReconstructObject(T* ptr, Http2Random* rng) {
-  Http2DefaultReconstructObjectImpl(ptr, rng);
-}
-
-}  // namespace test
-}  // namespace http2
-
-#endif  // QUICHE_HTTP2_PLATFORM_API_HTTP2_RECONSTRUCT_OBJECT_H_