OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <queue> | 5 #include <queue> |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "net/base/rand_callback.h" | 9 #include "net/base/rand_callback.h" |
10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
(...skipping 1006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1017 // This is a simplifying assumption based on the way the code works now. | 1017 // This is a simplifying assumption based on the way the code works now. |
1018 | 1018 |
1019 class SimpleMockSocketFactory | 1019 class SimpleMockSocketFactory |
1020 : public MDnsConnection::SocketFactory { | 1020 : public MDnsConnection::SocketFactory { |
1021 public: | 1021 public: |
1022 SimpleMockSocketFactory() { | 1022 SimpleMockSocketFactory() { |
1023 } | 1023 } |
1024 virtual ~SimpleMockSocketFactory() { | 1024 virtual ~SimpleMockSocketFactory() { |
1025 } | 1025 } |
1026 | 1026 |
1027 virtual scoped_ptr<DatagramServerSocket> CreateSocket() OVERRIDE { | 1027 virtual void CreateSockets( |
1028 MockMDnsDatagramServerSocket* socket = sockets_.back(); | 1028 ScopedVector<MDnsConnection::Socket>* sockets) OVERRIDE { |
1029 sockets_.weak_erase(sockets_.end() - 1); | 1029 sockets->swap(sockets_); |
1030 return scoped_ptr<DatagramServerSocket>(socket); | |
1031 } | 1030 } |
szym
2013/11/27 07:37:44
To avoid weird bugs, either sockets->clear() or DC
Vitaly Buka (NO REVIEWS)
2013/11/27 08:45:37
Done.
| |
1032 | 1031 |
1033 void PushSocket(MockMDnsDatagramServerSocket* socket) { | 1032 void PushSocket(MDnsConnection::Socket* socket) { |
1034 sockets_.push_back(socket); | 1033 sockets_.push_back(socket); |
1035 } | 1034 } |
1036 | 1035 |
1037 private: | 1036 private: |
1038 ScopedVector<MockMDnsDatagramServerSocket> sockets_; | 1037 ScopedVector<MDnsConnection::Socket> sockets_; |
1039 }; | 1038 }; |
1040 | 1039 |
1041 class MockMDnsConnectionDelegate : public MDnsConnection::Delegate { | 1040 class MockMDnsConnectionDelegate : public MDnsConnection::Delegate { |
1042 public: | 1041 public: |
1043 virtual void HandlePacket(DnsResponse* response, int size) { | 1042 virtual void HandlePacket(DnsResponse* response, int size) { |
1044 HandlePacketInternal(std::string(response->io_buffer()->data(), size)); | 1043 HandlePacketInternal(std::string(response->io_buffer()->data(), size)); |
1045 } | 1044 } |
1046 | 1045 |
1047 MOCK_METHOD1(HandlePacketInternal, void(std::string packet)); | 1046 MOCK_METHOD1(HandlePacketInternal, void(std::string packet)); |
1048 | 1047 |
1049 MOCK_METHOD1(OnConnectionError, void(int error)); | 1048 MOCK_METHOD1(OnConnectionError, void(int error)); |
1050 }; | 1049 }; |
1051 | 1050 |
1052 class MDnsConnectionTest : public ::testing::Test { | 1051 class MDnsConnectionTest : public ::testing::Test { |
1053 public: | 1052 public: |
1054 MDnsConnectionTest() : connection_(&delegate_) { | 1053 MDnsConnectionTest() : connection_(&delegate_) { |
1055 } | 1054 } |
1056 | 1055 |
1057 protected: | 1056 protected: |
1058 // Follow successful connection initialization. | 1057 // Follow successful connection initialization. |
1059 virtual void SetUp() OVERRIDE { | 1058 virtual void SetUp() OVERRIDE { |
1060 socket_ipv4_ = new MockMDnsDatagramServerSocket; | 1059 socket_ipv4_ = new MockMDnsDatagramServerSocket; |
1061 socket_ipv6_ = new MockMDnsDatagramServerSocket; | 1060 socket_ipv6_ = new MockMDnsDatagramServerSocket; |
1062 factory_.PushSocket(socket_ipv6_); | 1061 factory_.PushSocket(socket_ipv6_); |
1063 factory_.PushSocket(socket_ipv4_); | 1062 factory_.PushSocket(socket_ipv4_); |
1064 } | 1063 } |
1065 | 1064 |
1066 bool InitConnection() { | 1065 bool InitConnection() { |
1067 EXPECT_CALL(*socket_ipv4_, AllowAddressReuse()); | |
1068 EXPECT_CALL(*socket_ipv6_, AllowAddressReuse()); | |
1069 | |
1070 EXPECT_CALL(*socket_ipv4_, SetMulticastLoopbackMode(false)); | |
1071 EXPECT_CALL(*socket_ipv6_, SetMulticastLoopbackMode(false)); | |
1072 | |
1073 EXPECT_CALL(*socket_ipv4_, ListenInternal("0.0.0.0:5353")) | |
1074 .WillOnce(Return(OK)); | |
1075 EXPECT_CALL(*socket_ipv6_, ListenInternal("[::]:5353")) | |
1076 .WillOnce(Return(OK)); | |
1077 | |
1078 EXPECT_CALL(*socket_ipv4_, JoinGroupInternal("224.0.0.251")) | |
1079 .WillOnce(Return(OK)); | |
1080 EXPECT_CALL(*socket_ipv6_, JoinGroupInternal("ff02::fb")) | |
1081 .WillOnce(Return(OK)); | |
1082 | |
1083 return connection_.Init(&factory_); | 1066 return connection_.Init(&factory_); |
1084 } | 1067 } |
1085 | 1068 |
1086 StrictMock<MockMDnsConnectionDelegate> delegate_; | 1069 StrictMock<MockMDnsConnectionDelegate> delegate_; |
1087 | 1070 |
1088 MockMDnsDatagramServerSocket* socket_ipv4_; | 1071 MockMDnsDatagramServerSocket* socket_ipv4_; |
1089 MockMDnsDatagramServerSocket* socket_ipv6_; | 1072 MockMDnsDatagramServerSocket* socket_ipv6_; |
1090 SimpleMockSocketFactory factory_; | 1073 SimpleMockSocketFactory factory_; |
1091 MDnsConnection connection_; | 1074 MDnsConnection connection_; |
1092 TestCompletionCallback callback_; | 1075 TestCompletionCallback callback_; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1135 new IOBufferWithSize(sizeof kSamplePacket1)); | 1118 new IOBufferWithSize(sizeof kSamplePacket1)); |
1136 memcpy(buf->data(), kSamplePacket1, sizeof(kSamplePacket1)); | 1119 memcpy(buf->data(), kSamplePacket1, sizeof(kSamplePacket1)); |
1137 | 1120 |
1138 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) | 1121 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) |
1139 .WillOnce(Return(ERR_IO_PENDING)); | 1122 .WillOnce(Return(ERR_IO_PENDING)); |
1140 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) | 1123 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) |
1141 .WillOnce(Return(ERR_IO_PENDING)); | 1124 .WillOnce(Return(ERR_IO_PENDING)); |
1142 | 1125 |
1143 ASSERT_TRUE(InitConnection()); | 1126 ASSERT_TRUE(InitConnection()); |
1144 | 1127 |
1145 EXPECT_CALL(*socket_ipv4_, | 1128 EXPECT_CALL(*socket_ipv4_, SendToInternal(sample_packet, _)); |
1146 SendToInternal(sample_packet, "224.0.0.251:5353", _)); | 1129 EXPECT_CALL(*socket_ipv6_, SendToInternal(sample_packet, _)); |
1147 EXPECT_CALL(*socket_ipv6_, | |
1148 SendToInternal(sample_packet, "[ff02::fb]:5353", _)); | |
1149 | 1130 |
1150 connection_.Send(buf, buf->size()); | 1131 connection_.Send(buf, buf->size()); |
1151 } | 1132 } |
1152 | 1133 |
1153 TEST_F(MDnsConnectionTest, Error) { | 1134 TEST_F(MDnsConnectionTest, Error) { |
1154 CompletionCallback callback; | 1135 CompletionCallback callback; |
1155 | 1136 |
1156 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) | 1137 EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _)) |
1157 .WillOnce(Return(ERR_IO_PENDING)); | 1138 .WillOnce(Return(ERR_IO_PENDING)); |
1158 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) | 1139 EXPECT_CALL(*socket_ipv6_, RecvFrom(_, _, _, _)) |
1159 .WillOnce(DoAll(SaveArg<3>(&callback), Return(ERR_IO_PENDING))); | 1140 .WillOnce(DoAll(SaveArg<3>(&callback), Return(ERR_IO_PENDING))); |
1160 | 1141 |
1161 ASSERT_TRUE(InitConnection()); | 1142 ASSERT_TRUE(InitConnection()); |
1162 | 1143 |
1163 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); | 1144 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); |
1164 callback.Run(ERR_SOCKET_NOT_CONNECTED); | 1145 callback.Run(ERR_SOCKET_NOT_CONNECTED); |
1165 } | 1146 } |
1166 | 1147 |
1167 } // namespace | 1148 } // namespace |
1168 | 1149 |
1169 } // namespace net | 1150 } // namespace net |
OLD | NEW |