Reland "Use absl::optional instead or rtc::Optional"

This reverts commit 28e6a164bf9d2a42545d058bd50d39e1767f7398.

Reason for revert: the static initializer removed from abseil

Original change's description:
> Revert "Use absl::optional instead or rtc::Optional"
>
> This reverts commit 7ba9e92fa0dfb16579f4f6ecd746397bdfdd174d.
>
> Reason for revert: Breaks Chromium static initialized regression test.
> https://ci.chromium.org/p/chromium/builders/luci.chromium.try/android-marshmallow-arm64-rel/5068
>
> Original change's description:
> > Use absl::optional instead or rtc::Optional
> >
> > BUG: webrtc:9078
> > Change-Id: I69aedce324d86e8894b81210a2de17c5ef68fd11
> > Reviewed-on: https://webrtc-review.googlesource.com/77082
> > Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
> > Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
> > Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#23440}
>
> TBR=danilchap@webrtc.org,mbonadei@webrtc.org,kwiberg@webrtc.org
>
> Change-Id: I09ae74bddc69d0b25c8dfbcacc4ec906b34ca748
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://webrtc-review.googlesource.com/79980
> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#23449}

TBR=danilchap@webrtc.org,mbonadei@webrtc.org,kwiberg@webrtc.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Change-Id: Ib5dc71fb63fe02b78743b03f8252b962616eead0
Bug: webrtc:9078
Reviewed-on: https://webrtc-review.googlesource.com/82760
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23586}
diff --git a/api/optional_unittest.cc b/api/optional_unittest.cc
index ad700dc..f56dc6d 100644
--- a/api/optional_unittest.cc
+++ b/api/optional_unittest.cc
@@ -8,6 +8,9 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+// TODO(bugs.webrtc.org/8821): Delete this file when absl unittests run on
+// webrtc bots.
+
 #include <memory>
 #include <sstream>
 #include <string>
@@ -702,31 +705,16 @@
 
 TEST(OptionalTest, TestDereferenceWithDefault) {
   auto log = Logger::Setup();
-  {
-    const Logger a(17), b(42);
-    Optional<Logger> x(a);
-    Optional<Logger> y;
-    log->push_back("-1-");
-    EXPECT_EQ(a, x.value_or(Logger(42)));
-    log->push_back("-2-");
-    EXPECT_EQ(b, y.value_or(Logger(42)));
-    log->push_back("-3-");
-    EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b));
-    log->push_back("-4-");
-    EXPECT_EQ(b, Optional<Logger>().value_or(b));
-    log->push_back("-5-");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:42. explicit constructor",
-        "2:17. copy constructor (from 0:17)", "-1-",
-        "3:42. explicit constructor", "operator== 0:17, 2:17",
-        "3:42. destructor", "-2-", "4:42. explicit constructor",
-        "operator== 1:42, 4:42", "4:42. destructor", "-3-",
-        "5:17. explicit constructor", "6:17. move constructor (from 5:17)",
-        "operator== 0:17, 6:17", "6:17. destructor", "5:17. destructor", "-4-",
-        "operator== 1:42, 1:42", "-5-", "2:17. destructor", "1:42. destructor",
-        "0:17. destructor"),
-      *log);
+  const Logger a(17), b(42);
+  Optional<Logger> x(a);
+  Optional<Logger> y;
+  EXPECT_EQ(a, x.value_or(Logger(42)));
+  EXPECT_EQ(b, y.value_or(Logger(42)));
+  EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b));
+  EXPECT_EQ(b, Optional<Logger>().value_or(b));
+  // Can't expect exact list of constructors and destructors because it is
+  // compiler-dependent. i.e. msvc produce different output than clang. Calls
+  // above are subject to copy elision that allow to change behavior.
 }
 
 TEST(OptionalTest, TestEquality) {
@@ -871,8 +859,16 @@
       *log);
 }
 
-TEST(OptionalTest, TestPrintTo) {
-  constexpr char kEmptyOptionalMessage[] = "<empty optional>";
+// Nice printing available only when GTEST aware ABSL is present
+#ifdef GTEST_HAS_ABSL
+#define MaybeTestPrintTo TestPrintTo
+#define MaybeTestUnprintablePrintTo TestUnprintablePrintTo
+#else
+#define MaybeTestPrintTo DISABLED_TestPrintTo
+#define MaybeTestUnprintablePrintTo DISABLED_TestUnprintablePrintTo
+#endif
+TEST(OptionalTest, MaybeTestPrintTo) {
+  constexpr char kEmptyOptionalMessage[] = "(nullopt)";
   const Optional<MyUnprintableType> empty_unprintable;
   const Optional<MyPrintableType> empty_printable;
   const Optional<MyOstreamPrintableType> empty_ostream_printable;
@@ -880,14 +876,22 @@
   EXPECT_EQ(kEmptyOptionalMessage, ::testing::PrintToString(empty_printable));
   EXPECT_EQ(kEmptyOptionalMessage,
             ::testing::PrintToString(empty_ostream_printable));
-  EXPECT_NE("1", ::testing::PrintToString(Optional<MyUnprintableType>({1})));
-  EXPECT_NE("1", ::testing::PrintToString(Optional<MyPrintableType>({1})));
-  EXPECT_EQ("The value is 1",
+  EXPECT_NE("(1)", ::testing::PrintToString(Optional<MyUnprintableType>({1})));
+  EXPECT_NE("(1)", ::testing::PrintToString(Optional<MyPrintableType>({1})));
+  EXPECT_EQ("(The value is 1)",
             ::testing::PrintToString(Optional<MyPrintableType>({1})));
-  EXPECT_EQ("1",
+  EXPECT_EQ("(1)",
             ::testing::PrintToString(Optional<MyOstreamPrintableType>({1})));
 }
 
+TEST(OptionalTest, MaybeTestUnprintablePrintTo) {
+  struct UnprintableType {
+    uint8_t value[5];
+  };
+  Optional<UnprintableType> opt({0xa1, 0xb2, 0xc3, 0xd4, 0xe5});
+  EXPECT_EQ("(5-byte object <A1-B2 C3-D4 E5>)", ::testing::PrintToString(opt));
+}
+
 void UnusedFunctionWorkaround() {
   // These are here to ensure we don't get warnings about ostream and PrintTo
   // for MyPrintableType never getting called.