| 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 } |
| 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 |