1 /*
2 * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10 #include "net/dcsctp/socket/state_cookie.h"
11
12 #include "net/dcsctp/testing/testing_macros.h"
13 #include "rtc_base/gunit.h"
14 #include "test/gmock.h"
15
16 namespace dcsctp {
17 namespace {
18 using ::testing::SizeIs;
19
TEST(StateCookieTest,SerializeAndDeserialize)20 TEST(StateCookieTest, SerializeAndDeserialize) {
21 Capabilities capabilities = {.partial_reliability = true,
22 .message_interleaving = false,
23 .reconfig = true,
24 .negotiated_maximum_incoming_streams = 123,
25 .negotiated_maximum_outgoing_streams = 234};
26 StateCookie cookie(VerificationTag(123), TSN(456),
27 /*a_rwnd=*/789, TieTag(101112), capabilities);
28 std::vector<uint8_t> serialized = cookie.Serialize();
29 EXPECT_THAT(serialized, SizeIs(StateCookie::kCookieSize));
30 ASSERT_HAS_VALUE_AND_ASSIGN(StateCookie deserialized,
31 StateCookie::Deserialize(serialized));
32 EXPECT_EQ(deserialized.initiate_tag(), VerificationTag(123));
33 EXPECT_EQ(deserialized.initial_tsn(), TSN(456));
34 EXPECT_EQ(deserialized.a_rwnd(), 789u);
35 EXPECT_EQ(deserialized.tie_tag(), TieTag(101112));
36 EXPECT_TRUE(deserialized.capabilities().partial_reliability);
37 EXPECT_FALSE(deserialized.capabilities().message_interleaving);
38 EXPECT_TRUE(deserialized.capabilities().reconfig);
39 EXPECT_EQ(deserialized.capabilities().negotiated_maximum_incoming_streams,
40 123);
41 EXPECT_EQ(deserialized.capabilities().negotiated_maximum_outgoing_streams,
42 234);
43 }
44
TEST(StateCookieTest,ValidateMagicValue)45 TEST(StateCookieTest, ValidateMagicValue) {
46 Capabilities capabilities = {.partial_reliability = true,
47 .message_interleaving = false,
48 .reconfig = true};
49 StateCookie cookie(VerificationTag(123), TSN(456),
50 /*a_rwnd=*/789, TieTag(101112), capabilities);
51 std::vector<uint8_t> serialized = cookie.Serialize();
52 ASSERT_THAT(serialized, SizeIs(StateCookie::kCookieSize));
53
54 absl::string_view magic(reinterpret_cast<const char*>(serialized.data()), 8);
55 EXPECT_EQ(magic, "dcSCTP00");
56 }
57
58 } // namespace
59 } // namespace dcsctp
60