OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_framer.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include <algorithm> | |
10 #include <string> | |
11 | |
12 #include "extensions/common/api/cast_channel/cast_channel.pb.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace extensions { | |
16 namespace api { | |
17 namespace cast_channel { | |
18 | |
19 using ::cast_channel::ChannelError; | |
20 | |
21 class CastFramerTest : public testing::Test { | |
22 public: | |
23 CastFramerTest() {} | |
24 ~CastFramerTest() override {} | |
25 | |
26 void SetUp() override { | |
27 cast_message_.set_protocol_version(CastMessage::CASTV2_1_0); | |
28 cast_message_.set_source_id("source"); | |
29 cast_message_.set_destination_id("destination"); | |
30 cast_message_.set_namespace_("namespace"); | |
31 cast_message_.set_payload_type(CastMessage::STRING); | |
32 cast_message_.set_payload_utf8("payload"); | |
33 ASSERT_TRUE(MessageFramer::Serialize(cast_message_, &cast_message_str_)); | |
34 | |
35 buffer_ = new net::GrowableIOBuffer; | |
36 buffer_->SetCapacity(MessageFramer::MessageHeader::max_message_size()); | |
37 framer_.reset(new MessageFramer(buffer_.get())); | |
38 } | |
39 | |
40 void WriteToBuffer(const std::string& data) { | |
41 memcpy(buffer_->StartOfBuffer(), data.data(), data.size()); | |
42 } | |
43 | |
44 protected: | |
45 CastMessage cast_message_; | |
46 std::string cast_message_str_; | |
47 scoped_refptr<net::GrowableIOBuffer> buffer_; | |
48 std::unique_ptr<MessageFramer> framer_; | |
49 }; | |
50 | |
51 TEST_F(CastFramerTest, TestMessageFramerCompleteMessage) { | |
52 ChannelError error; | |
53 size_t message_length; | |
54 | |
55 WriteToBuffer(cast_message_str_); | |
56 | |
57 // Receive 1 byte of the header, framer demands 3 more bytes. | |
58 EXPECT_EQ(4u, framer_->BytesRequested()); | |
59 EXPECT_EQ(nullptr, framer_->Ingest(1, &message_length, &error).get()); | |
60 EXPECT_EQ(ChannelError::NONE, error); | |
61 EXPECT_EQ(3u, framer_->BytesRequested()); | |
62 | |
63 // Ingest remaining 3, expect that the framer has moved on to requesting the | |
64 // body contents. | |
65 EXPECT_EQ(nullptr, framer_->Ingest(3, &message_length, &error).get()); | |
66 EXPECT_EQ(ChannelError::NONE, error); | |
67 EXPECT_EQ( | |
68 cast_message_str_.size() - MessageFramer::MessageHeader::header_size(), | |
69 framer_->BytesRequested()); | |
70 | |
71 // Remainder of packet sent over the wire. | |
72 std::unique_ptr<CastMessage> message; | |
73 message = framer_->Ingest(framer_->BytesRequested(), &message_length, &error); | |
74 EXPECT_NE(static_cast<CastMessage*>(nullptr), message.get()); | |
75 EXPECT_EQ(ChannelError::NONE, error); | |
76 EXPECT_EQ(message->SerializeAsString(), cast_message_.SerializeAsString()); | |
77 EXPECT_EQ(4u, framer_->BytesRequested()); | |
78 EXPECT_EQ(message->SerializeAsString().size(), message_length); | |
79 } | |
80 | |
81 TEST_F(CastFramerTest, TestSerializeErrorMessageTooLarge) { | |
82 std::string serialized; | |
83 CastMessage big_message; | |
84 big_message.CopyFrom(cast_message_); | |
85 std::string payload; | |
86 payload.append(MessageFramer::MessageHeader::max_message_size() + 1, 'x'); | |
87 big_message.set_payload_utf8(payload); | |
88 EXPECT_FALSE(MessageFramer::Serialize(big_message, &serialized)); | |
89 } | |
90 | |
91 TEST_F(CastFramerTest, TestIngestIllegalLargeMessage) { | |
92 std::string mangled_cast_message = cast_message_str_; | |
93 mangled_cast_message[0] = 88; | |
94 mangled_cast_message[1] = 88; | |
95 mangled_cast_message[2] = 88; | |
96 mangled_cast_message[3] = 88; | |
97 WriteToBuffer(mangled_cast_message); | |
98 | |
99 size_t bytes_ingested; | |
100 ChannelError error; | |
101 EXPECT_EQ(4u, framer_->BytesRequested()); | |
102 EXPECT_EQ(nullptr, framer_->Ingest(4, &bytes_ingested, &error).get()); | |
103 EXPECT_EQ(ChannelError::INVALID_MESSAGE, error); | |
104 EXPECT_EQ(0u, framer_->BytesRequested()); | |
105 | |
106 // Test that the parser enters a terminal error state. | |
107 WriteToBuffer(cast_message_str_); | |
108 EXPECT_EQ(0u, framer_->BytesRequested()); | |
109 EXPECT_EQ(nullptr, framer_->Ingest(4, &bytes_ingested, &error).get()); | |
110 EXPECT_EQ(ChannelError::INVALID_MESSAGE, error); | |
111 EXPECT_EQ(0u, framer_->BytesRequested()); | |
112 } | |
113 | |
114 TEST_F(CastFramerTest, TestUnparsableBodyProto) { | |
115 // Message header is OK, but the body is replaced with "x"en. | |
116 std::string mangled_cast_message = cast_message_str_; | |
117 for (size_t i = MessageFramer::MessageHeader::header_size(); | |
118 i < mangled_cast_message.size(); | |
119 ++i) { | |
120 std::fill(mangled_cast_message.begin() + | |
121 MessageFramer::MessageHeader::header_size(), | |
122 mangled_cast_message.end(), | |
123 'x'); | |
124 } | |
125 WriteToBuffer(mangled_cast_message); | |
126 | |
127 // Send header. | |
128 size_t message_length; | |
129 ChannelError error; | |
130 EXPECT_EQ(4u, framer_->BytesRequested()); | |
131 EXPECT_EQ(nullptr, framer_->Ingest(4, &message_length, &error).get()); | |
132 EXPECT_EQ(ChannelError::NONE, error); | |
133 EXPECT_EQ(cast_message_str_.size() - 4, framer_->BytesRequested()); | |
134 | |
135 // Send body, expect an error. | |
136 std::unique_ptr<CastMessage> message; | |
137 EXPECT_EQ(nullptr, framer_->Ingest(framer_->BytesRequested(), &message_length, | |
138 &error).get()); | |
139 EXPECT_EQ(ChannelError::INVALID_MESSAGE, error); | |
140 } | |
141 } // namespace cast_channel | |
142 } // namespace api | |
143 } // namespace extensions | |
OLD | NEW |