|  | /* | 
|  | *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  | #include "net/dcsctp/socket/state_cookie.h" | 
|  |  | 
|  | #include "net/dcsctp/testing/testing_macros.h" | 
|  | #include "rtc_base/gunit.h" | 
|  | #include "test/gmock.h" | 
|  |  | 
|  | namespace dcsctp { | 
|  | namespace { | 
|  | using ::testing::SizeIs; | 
|  |  | 
|  | TEST(StateCookieTest, SerializeAndDeserialize) { | 
|  | Capabilities capabilities = {.partial_reliability = true, | 
|  | .message_interleaving = false, | 
|  | .reconfig = true, | 
|  | .zero_checksum = true, | 
|  | .negotiated_maximum_incoming_streams = 123, | 
|  | .negotiated_maximum_outgoing_streams = 234}; | 
|  | StateCookie cookie(/*peer_tag=*/VerificationTag(123), | 
|  | /*my_tag=*/VerificationTag(321), | 
|  | /*peer_initial_tsn=*/TSN(456), /*my_initial_tsn=*/TSN(654), | 
|  | /*a_rwnd=*/789, TieTag(101112), capabilities); | 
|  | std::vector<uint8_t> serialized = cookie.Serialize(); | 
|  | EXPECT_THAT(serialized, SizeIs(StateCookie::kCookieSize)); | 
|  | ASSERT_HAS_VALUE_AND_ASSIGN(StateCookie deserialized, | 
|  | StateCookie::Deserialize(serialized)); | 
|  | EXPECT_EQ(deserialized.peer_tag(), VerificationTag(123)); | 
|  | EXPECT_EQ(deserialized.my_tag(), VerificationTag(321)); | 
|  | EXPECT_EQ(deserialized.peer_initial_tsn(), TSN(456)); | 
|  | EXPECT_EQ(deserialized.my_initial_tsn(), TSN(654)); | 
|  | EXPECT_EQ(deserialized.a_rwnd(), 789u); | 
|  | EXPECT_EQ(deserialized.tie_tag(), TieTag(101112)); | 
|  | EXPECT_TRUE(deserialized.capabilities().partial_reliability); | 
|  | EXPECT_FALSE(deserialized.capabilities().message_interleaving); | 
|  | EXPECT_TRUE(deserialized.capabilities().reconfig); | 
|  | EXPECT_TRUE(deserialized.capabilities().zero_checksum); | 
|  | EXPECT_EQ(deserialized.capabilities().negotiated_maximum_incoming_streams, | 
|  | 123); | 
|  | EXPECT_EQ(deserialized.capabilities().negotiated_maximum_outgoing_streams, | 
|  | 234); | 
|  | } | 
|  |  | 
|  | TEST(StateCookieTest, ValidateMagicValue) { | 
|  | Capabilities capabilities = {.partial_reliability = true, | 
|  | .message_interleaving = false, | 
|  | .reconfig = true}; | 
|  | StateCookie cookie(/*peer_tag=*/VerificationTag(123), | 
|  | /*my_tag=*/VerificationTag(321), | 
|  | /*peer_initial_tsn=*/TSN(456), /*my_initial_tsn=*/TSN(654), | 
|  | /*a_rwnd=*/789, TieTag(101112), capabilities); | 
|  | std::vector<uint8_t> serialized = cookie.Serialize(); | 
|  | ASSERT_THAT(serialized, SizeIs(StateCookie::kCookieSize)); | 
|  |  | 
|  | absl::string_view magic(reinterpret_cast<const char*>(serialized.data()), 8); | 
|  | EXPECT_EQ(magic, "dcSCTP00"); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace dcsctp |