blob: d5a922ffab88d3a02611d680e5f01d6de202e6c0 [file] [log] [blame]
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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.
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +00009 */
10
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/sctputils.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000012#include "webrtc/base/bytebuffer.h"
13#include "webrtc/base/gunit.h"
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000014
15class SctpUtilsTest : public testing::Test {
16 public:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000017 void VerifyOpenMessageFormat(const rtc::Buffer& packet,
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000018 const std::string& label,
19 const webrtc::DataChannelInit& config) {
Peter Boström0c4e06b2015-10-07 12:23:21 +020020 uint8_t message_type;
21 uint8_t channel_type;
22 uint32_t reliability;
23 uint16_t priority;
24 uint16_t label_length;
25 uint16_t protocol_length;
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000026
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000027 rtc::ByteBuffer buffer(packet.data(), packet.length());
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000028 ASSERT_TRUE(buffer.ReadUInt8(&message_type));
29 EXPECT_EQ(0x03, message_type);
30
31 ASSERT_TRUE(buffer.ReadUInt8(&channel_type));
32 if (config.ordered) {
33 EXPECT_EQ(config.maxRetransmits > -1 ?
34 0x01 : (config.maxRetransmitTime > -1 ? 0x02 : 0),
35 channel_type);
36 } else {
37 EXPECT_EQ(config.maxRetransmits > -1 ?
38 0x81 : (config.maxRetransmitTime > -1 ? 0x82 : 0x80),
39 channel_type);
40 }
41
wu@webrtc.org97077a32013-10-25 21:18:33 +000042 ASSERT_TRUE(buffer.ReadUInt16(&priority));
43
44 ASSERT_TRUE(buffer.ReadUInt32(&reliability));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000045 if (config.maxRetransmits > -1 || config.maxRetransmitTime > -1) {
46 EXPECT_EQ(config.maxRetransmits > -1 ?
47 config.maxRetransmits : config.maxRetransmitTime,
wu@webrtc.org97077a32013-10-25 21:18:33 +000048 static_cast<int>(reliability));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000049 }
50
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000051 ASSERT_TRUE(buffer.ReadUInt16(&label_length));
52 ASSERT_TRUE(buffer.ReadUInt16(&protocol_length));
53 EXPECT_EQ(label.size(), label_length);
54 EXPECT_EQ(config.protocol.size(), protocol_length);
55
56 std::string label_output;
57 ASSERT_TRUE(buffer.ReadString(&label_output, label_length));
58 EXPECT_EQ(label, label_output);
59 std::string protocol_output;
60 ASSERT_TRUE(buffer.ReadString(&protocol_output, protocol_length));
61 EXPECT_EQ(config.protocol, protocol_output);
62 }
63};
64
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000065TEST_F(SctpUtilsTest, WriteParseOpenMessageWithOrderedReliable) {
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000066 webrtc::DataChannelInit config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000067 std::string label = "abc";
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000068 config.protocol = "y";
69
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000070 rtc::Buffer packet;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000071 ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000072
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000073 VerifyOpenMessageFormat(packet, label, config);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000074
75 std::string output_label;
76 webrtc::DataChannelInit output_config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000077 ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000078 packet, &output_label, &output_config));
79
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000080 EXPECT_EQ(label, output_label);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000081 EXPECT_EQ(config.protocol, output_config.protocol);
82 EXPECT_EQ(config.ordered, output_config.ordered);
83 EXPECT_EQ(config.maxRetransmitTime, output_config.maxRetransmitTime);
84 EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
85}
86
87TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmitTime) {
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000088 webrtc::DataChannelInit config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000089 std::string label = "abc";
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000090 config.ordered = false;
91 config.maxRetransmitTime = 10;
92 config.protocol = "y";
93
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000094 rtc::Buffer packet;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000095 ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000096
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +000097 VerifyOpenMessageFormat(packet, label, config);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +000098
99 std::string output_label;
100 webrtc::DataChannelInit output_config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000101 ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000102 packet, &output_label, &output_config));
103
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000104 EXPECT_EQ(label, output_label);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000105 EXPECT_EQ(config.protocol, output_config.protocol);
106 EXPECT_EQ(config.ordered, output_config.ordered);
107 EXPECT_EQ(config.maxRetransmitTime, output_config.maxRetransmitTime);
wu@webrtc.org97077a32013-10-25 21:18:33 +0000108 EXPECT_EQ(-1, output_config.maxRetransmits);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000109}
110
111TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmits) {
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000112 webrtc::DataChannelInit config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000113 std::string label = "abc";
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000114 config.maxRetransmits = 10;
115 config.protocol = "y";
116
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000117 rtc::Buffer packet;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000118 ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000119
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000120 VerifyOpenMessageFormat(packet, label, config);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000121
122 std::string output_label;
123 webrtc::DataChannelInit output_config;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000124 ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000125 packet, &output_label, &output_config));
126
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000127 EXPECT_EQ(label, output_label);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000128 EXPECT_EQ(config.protocol, output_config.protocol);
129 EXPECT_EQ(config.ordered, output_config.ordered);
130 EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
wu@webrtc.org97077a32013-10-25 21:18:33 +0000131 EXPECT_EQ(-1, output_config.maxRetransmitTime);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000132}
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000133
134TEST_F(SctpUtilsTest, WriteParseAckMessage) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000135 rtc::Buffer packet;
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000136 webrtc::WriteDataChannelOpenAckMessage(&packet);
137
Peter Boström0c4e06b2015-10-07 12:23:21 +0200138 uint8_t message_type;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000139 rtc::ByteBuffer buffer(packet.data(), packet.length());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +0000140 ASSERT_TRUE(buffer.ReadUInt8(&message_type));
141 EXPECT_EQ(0x02, message_type);
142
143 EXPECT_TRUE(webrtc::ParseDataChannelOpenAckMessage(packet));
144}
deadbeefab9b2d12015-10-14 11:33:11 -0700145
146TEST_F(SctpUtilsTest, TestIsOpenMessage) {
147 rtc::ByteBuffer open;
148 open.WriteUInt8(0x03);
149 EXPECT_TRUE(webrtc::IsOpenMessage(open));
150
151 rtc::ByteBuffer openAck;
152 openAck.WriteUInt8(0x02);
153 EXPECT_FALSE(webrtc::IsOpenMessage(open));
154
155 rtc::ByteBuffer invalid;
156 openAck.WriteUInt8(0x01);
157 EXPECT_FALSE(webrtc::IsOpenMessage(invalid));
158
159 rtc::ByteBuffer empty;
160 EXPECT_FALSE(webrtc::IsOpenMessage(empty));
161}