OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "modules/mediastream/RTCDataChannel.h" | |
6 | |
7 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | |
8 #include "core/dom/DOMArrayBuffer.h" | |
9 #include "core/dom/DOMException.h" | |
10 #include "core/events/Event.h" | |
11 #include "platform/heap/Heap.h" | |
12 #include "public/platform/WebRTCDataChannelHandler.h" | |
13 #include "public/platform/WebVector.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 #include "wtf/PtrUtil.h" | |
16 #include "wtf/RefPtr.h" | |
17 #include "wtf/text/WTFString.h" | |
18 | |
19 namespace blink { | |
20 namespace { | |
21 | |
22 class MockHandler final : public WebRTCDataChannelHandler { | |
23 public: | |
24 MockHandler() | |
25 : m_client(0) | |
26 , m_state(WebRTCDataChannelHandlerClient::ReadyStateConnecting) | |
27 , m_bufferedAmount(0) | |
28 { | |
29 } | |
30 void setClient(WebRTCDataChannelHandlerClient* client) override { m_client =
client; } | |
31 WebString label() override { return WebString(""); } | |
32 bool ordered() const override { return true; } | |
33 unsigned short maxRetransmitTime() const override { return 0; } | |
34 unsigned short maxRetransmits() const override { return 0; } | |
35 WebString protocol() const override { return WebString(""); } | |
36 bool negotiated() const override { return false; } | |
37 unsigned short id() const override { return 0; } | |
38 | |
39 WebRTCDataChannelHandlerClient::ReadyState state() const override { return m
_state; } | |
40 unsigned long bufferedAmount() override { return m_bufferedAmount; } | |
41 bool sendStringData(const WebString& s) override | |
42 { | |
43 m_bufferedAmount += s.length(); | |
44 return true; | |
45 } | |
46 bool sendRawData(const char* data, size_t length) override | |
47 { | |
48 m_bufferedAmount += length; | |
49 return true; | |
50 } | |
51 void close() override { } | |
52 | |
53 // Methods for testing. | |
54 void changeState(WebRTCDataChannelHandlerClient::ReadyState state) | |
55 { | |
56 m_state = state; | |
57 if (m_client) { | |
58 m_client->didChangeReadyState(m_state); | |
59 } | |
60 } | |
61 void drainBuffer(unsigned long bytes) | |
62 { | |
63 unsigned long oldBufferedAmount = m_bufferedAmount; | |
64 m_bufferedAmount -= bytes; | |
65 if (m_client) { | |
66 m_client->didDecreaseBufferedAmount(oldBufferedAmount); | |
67 } | |
68 } | |
69 | |
70 private: | |
71 WebRTCDataChannelHandlerClient* m_client; | |
72 WebRTCDataChannelHandlerClient::ReadyState m_state; | |
73 unsigned long m_bufferedAmount; | |
74 }; | |
75 | |
76 } // namespace | |
77 | |
78 TEST(RTCDataChannelTest, BufferedAmount) | |
79 { | |
80 MockHandler* handler = new MockHandler(); | |
81 RTCDataChannel* channel = RTCDataChannel::create(0, wrapUnique(handler)); | |
82 | |
83 handler->changeState(WebRTCDataChannelHandlerClient::ReadyStateOpen); | |
84 String message(std::string(100, 'A').c_str()); | |
85 channel->send(message, IGNORE_EXCEPTION); | |
86 EXPECT_EQ(100U, channel->bufferedAmount()); | |
87 } | |
88 | |
89 TEST(RTCDataChannelTest, BufferedAmountLow) | |
90 { | |
91 MockHandler* handler = new MockHandler(); | |
92 RTCDataChannel* channel = RTCDataChannel::create(0, wrapUnique(handler)); | |
93 | |
94 // Add and drain 100 bytes | |
95 handler->changeState(WebRTCDataChannelHandlerClient::ReadyStateOpen); | |
96 String message(std::string(100, 'A').c_str()); | |
97 channel->send(message, IGNORE_EXCEPTION); | |
98 EXPECT_EQ(100U, channel->bufferedAmount()); | |
99 EXPECT_EQ(1U, channel->m_scheduledEvents.size()); | |
100 | |
101 handler->drainBuffer(100); | |
102 EXPECT_EQ(0U, channel->bufferedAmount()); | |
103 EXPECT_EQ(2U, channel->m_scheduledEvents.size()); | |
104 EXPECT_EQ("bufferedamountlow", std::string(channel->m_scheduledEvents.last()
->type().utf8().data())); | |
105 | |
106 // Add and drain 1 byte | |
107 channel->send("A", IGNORE_EXCEPTION); | |
108 EXPECT_EQ(1U, channel->bufferedAmount()); | |
109 EXPECT_EQ(2U, channel->m_scheduledEvents.size()); | |
110 | |
111 handler->drainBuffer(1); | |
112 EXPECT_EQ(0U, channel->bufferedAmount()); | |
113 EXPECT_EQ(3U, channel->m_scheduledEvents.size()); | |
114 EXPECT_EQ("bufferedamountlow", std::string(channel->m_scheduledEvents.last()
->type().utf8().data())); | |
115 | |
116 // Set the threshold to 99 bytes, add 101, and drain 1 byte at a time. | |
117 channel->setBufferedAmountLowThreshold(99U); | |
118 channel->send(message, IGNORE_EXCEPTION); | |
119 EXPECT_EQ(100U, channel->bufferedAmount()); | |
120 | |
121 channel->send("A", IGNORE_EXCEPTION); | |
122 EXPECT_EQ(101U, channel->bufferedAmount()); | |
123 | |
124 handler->drainBuffer(1); | |
125 EXPECT_EQ(100U, channel->bufferedAmount()); | |
126 EXPECT_EQ(3U, channel->m_scheduledEvents.size()); // No new events. | |
127 | |
128 handler->drainBuffer(1); | |
129 EXPECT_EQ(99U, channel->bufferedAmount()); | |
130 EXPECT_EQ(4U, channel->m_scheduledEvents.size()); // One new event. | |
131 EXPECT_EQ("bufferedamountlow", std::string(channel->m_scheduledEvents.last()
->type().utf8().data())); | |
132 | |
133 handler->drainBuffer(1); | |
134 EXPECT_EQ(98U, channel->bufferedAmount()); | |
135 | |
136 channel->setBufferedAmountLowThreshold(97U); | |
137 EXPECT_EQ(4U, channel->m_scheduledEvents.size()); // No new events. | |
138 | |
139 handler->drainBuffer(1); | |
140 EXPECT_EQ(97U, channel->bufferedAmount()); | |
141 EXPECT_EQ(5U, channel->m_scheduledEvents.size()); // New event. | |
142 EXPECT_EQ("bufferedamountlow", std::string(channel->m_scheduledEvents.last()
->type().utf8().data())); | |
143 } | |
144 | |
145 } // namespace blink | |
OLD | NEW |