| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <errno.h> | 5 #include <errno.h> |
| 6 #include <fcntl.h> | 6 #include <fcntl.h> |
| 7 #include <poll.h> | 7 #include <poll.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #include <sys/time.h> | 10 #include <sys/time.h> |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 base::ConditionVariable condition_; | 96 base::ConditionVariable condition_; |
| 97 }; | 97 }; |
| 98 | 98 |
| 99 class TestListenSocketDelegate : public StreamListenSocket::Delegate { | 99 class TestListenSocketDelegate : public StreamListenSocket::Delegate { |
| 100 public: | 100 public: |
| 101 explicit TestListenSocketDelegate( | 101 explicit TestListenSocketDelegate( |
| 102 const scoped_refptr<EventManager>& event_manager) | 102 const scoped_refptr<EventManager>& event_manager) |
| 103 : event_manager_(event_manager) {} | 103 : event_manager_(event_manager) {} |
| 104 | 104 |
| 105 virtual void DidAccept(StreamListenSocket* server, | 105 virtual void DidAccept(StreamListenSocket* server, |
| 106 StreamListenSocket* connection) OVERRIDE { | 106 scoped_ptr<StreamListenSocket> connection) OVERRIDE { |
| 107 LOG(ERROR) << __PRETTY_FUNCTION__; | 107 LOG(ERROR) << __PRETTY_FUNCTION__; |
| 108 connection_ = connection; | 108 connection_ = connection.Pass(); |
| 109 Notify(EVENT_ACCEPT); | 109 Notify(EVENT_ACCEPT); |
| 110 } | 110 } |
| 111 | 111 |
| 112 virtual void DidRead(StreamListenSocket* connection, | 112 virtual void DidRead(StreamListenSocket* connection, |
| 113 const char* data, | 113 const char* data, |
| 114 int len) OVERRIDE { | 114 int len) OVERRIDE { |
| 115 { | 115 { |
| 116 base::AutoLock lock(mutex_); | 116 base::AutoLock lock(mutex_); |
| 117 DCHECK(len); | 117 DCHECK(len); |
| 118 data_.assign(data, len - 1); | 118 data_.assign(data, len - 1); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 132 base::AutoLock lock(mutex_); | 132 base::AutoLock lock(mutex_); |
| 133 return data_; | 133 return data_; |
| 134 } | 134 } |
| 135 | 135 |
| 136 private: | 136 private: |
| 137 void Notify(EventType event) { | 137 void Notify(EventType event) { |
| 138 event_manager_->Notify(event); | 138 event_manager_->Notify(event); |
| 139 } | 139 } |
| 140 | 140 |
| 141 const scoped_refptr<EventManager> event_manager_; | 141 const scoped_refptr<EventManager> event_manager_; |
| 142 scoped_refptr<StreamListenSocket> connection_; | 142 scoped_ptr<StreamListenSocket> connection_; |
| 143 base::Lock mutex_; | 143 base::Lock mutex_; |
| 144 string data_; | 144 string data_; |
| 145 }; | 145 }; |
| 146 | 146 |
| 147 bool UserCanConnectCallback( | 147 bool UserCanConnectCallback( |
| 148 bool allow_user, const scoped_refptr<EventManager>& event_manager, | 148 bool allow_user, const scoped_refptr<EventManager>& event_manager, |
| 149 uid_t, gid_t) { | 149 uid_t, gid_t) { |
| 150 event_manager->Notify( | 150 event_manager->Notify( |
| 151 allow_user ? EVENT_AUTH_GRANTED : EVENT_AUTH_DENIED); | 151 allow_user ? EVENT_AUTH_GRANTED : EVENT_AUTH_DENIED); |
| 152 return allow_user; | 152 return allow_user; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 166 allow_user_(allow_user) {} | 166 allow_user_(allow_user) {} |
| 167 | 167 |
| 168 virtual void SetUp() OVERRIDE { | 168 virtual void SetUp() OVERRIDE { |
| 169 event_manager_ = new EventManager(); | 169 event_manager_ = new EventManager(); |
| 170 socket_delegate_.reset(new TestListenSocketDelegate(event_manager_)); | 170 socket_delegate_.reset(new TestListenSocketDelegate(event_manager_)); |
| 171 DeleteSocketFile(); | 171 DeleteSocketFile(); |
| 172 } | 172 } |
| 173 | 173 |
| 174 virtual void TearDown() OVERRIDE { | 174 virtual void TearDown() OVERRIDE { |
| 175 DeleteSocketFile(); | 175 DeleteSocketFile(); |
| 176 socket_ = NULL; | 176 socket_.reset(); |
| 177 socket_delegate_.reset(); | 177 socket_delegate_.reset(); |
| 178 event_manager_ = NULL; | 178 event_manager_ = NULL; |
| 179 } | 179 } |
| 180 | 180 |
| 181 UnixDomainSocket::AuthCallback MakeAuthCallback() { | 181 UnixDomainSocket::AuthCallback MakeAuthCallback() { |
| 182 return base::Bind(&UserCanConnectCallback, allow_user_, event_manager_); | 182 return base::Bind(&UserCanConnectCallback, allow_user_, event_manager_); |
| 183 } | 183 } |
| 184 | 184 |
| 185 void DeleteSocketFile() { | 185 void DeleteSocketFile() { |
| 186 ASSERT_FALSE(file_path_.empty()); | 186 ASSERT_FALSE(file_path_.empty()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 215 FROM_HERE, | 215 FROM_HERE, |
| 216 base::Bind(&UnixDomainSocketTestHelper::CreateAndListen, | 216 base::Bind(&UnixDomainSocketTestHelper::CreateAndListen, |
| 217 base::Unretained(this))); | 217 base::Unretained(this))); |
| 218 return thread.Pass(); | 218 return thread.Pass(); |
| 219 } | 219 } |
| 220 | 220 |
| 221 const base::FilePath file_path_; | 221 const base::FilePath file_path_; |
| 222 const bool allow_user_; | 222 const bool allow_user_; |
| 223 scoped_refptr<EventManager> event_manager_; | 223 scoped_refptr<EventManager> event_manager_; |
| 224 scoped_ptr<TestListenSocketDelegate> socket_delegate_; | 224 scoped_ptr<TestListenSocketDelegate> socket_delegate_; |
| 225 scoped_refptr<UnixDomainSocket> socket_; | 225 scoped_ptr<UnixDomainSocket> socket_; |
| 226 }; | 226 }; |
| 227 | 227 |
| 228 class UnixDomainSocketTest : public UnixDomainSocketTestHelper { | 228 class UnixDomainSocketTest : public UnixDomainSocketTestHelper { |
| 229 protected: | 229 protected: |
| 230 UnixDomainSocketTest() | 230 UnixDomainSocketTest() |
| 231 : UnixDomainSocketTestHelper(MakeSocketPath(), true /* allow user */) {} | 231 : UnixDomainSocketTestHelper(MakeSocketPath(), true /* allow user */) {} |
| 232 }; | 232 }; |
| 233 | 233 |
| 234 class UnixDomainSocketTestWithInvalidPath : public UnixDomainSocketTestHelper { | 234 class UnixDomainSocketTestWithInvalidPath : public UnixDomainSocketTestHelper { |
| 235 protected: | 235 protected: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 258 // Test with an invalid path to make sure that the socket is not backed by a | 258 // Test with an invalid path to make sure that the socket is not backed by a |
| 259 // file. | 259 // file. |
| 260 TEST_F(UnixDomainSocketTestWithInvalidPath, | 260 TEST_F(UnixDomainSocketTestWithInvalidPath, |
| 261 CreateAndListenWithAbstractNamespace) { | 261 CreateAndListenWithAbstractNamespace) { |
| 262 socket_ = UnixDomainSocket::CreateAndListenWithAbstractNamespace( | 262 socket_ = UnixDomainSocket::CreateAndListenWithAbstractNamespace( |
| 263 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); | 263 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); |
| 264 EXPECT_FALSE(socket_.get() == NULL); | 264 EXPECT_FALSE(socket_.get() == NULL); |
| 265 } | 265 } |
| 266 | 266 |
| 267 TEST_F(UnixDomainSocketTest, TestFallbackName) { | 267 TEST_F(UnixDomainSocketTest, TestFallbackName) { |
| 268 scoped_refptr<UnixDomainSocket> existing_socket = | 268 scoped_ptr<UnixDomainSocket> existing_socket = |
| 269 UnixDomainSocket::CreateAndListenWithAbstractNamespace( | 269 UnixDomainSocket::CreateAndListenWithAbstractNamespace( |
| 270 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); | 270 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); |
| 271 EXPECT_FALSE(existing_socket.get() == NULL); | 271 EXPECT_FALSE(existing_socket.get() == NULL); |
| 272 // First, try to bind socket with the same name with no fallback name. | 272 // First, try to bind socket with the same name with no fallback name. |
| 273 socket_ = | 273 socket_ = |
| 274 UnixDomainSocket::CreateAndListenWithAbstractNamespace( | 274 UnixDomainSocket::CreateAndListenWithAbstractNamespace( |
| 275 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); | 275 file_path_.value(), "", socket_delegate_.get(), MakeAuthCallback()); |
| 276 EXPECT_TRUE(socket_.get() == NULL); | 276 EXPECT_TRUE(socket_.get() == NULL); |
| 277 // Now with a fallback name. | 277 // Now with a fallback name. |
| 278 socket_ = UnixDomainSocket::CreateAndListenWithAbstractNamespace( | 278 socket_ = UnixDomainSocket::CreateAndListenWithAbstractNamespace( |
| 279 file_path_.value(), | 279 file_path_.value(), |
| 280 MakeSocketPath(kFallbackSocketName), | 280 MakeSocketPath(kFallbackSocketName), |
| 281 socket_delegate_.get(), | 281 socket_delegate_.get(), |
| 282 MakeAuthCallback()); | 282 MakeAuthCallback()); |
| 283 EXPECT_FALSE(socket_.get() == NULL); | 283 EXPECT_FALSE(socket_.get() == NULL); |
| 284 existing_socket = NULL; | |
| 285 } | 284 } |
| 286 #endif | 285 #endif |
| 287 | 286 |
| 288 TEST_F(UnixDomainSocketTest, TestWithClient) { | 287 TEST_F(UnixDomainSocketTest, TestWithClient) { |
| 289 const scoped_ptr<base::Thread> server_thread = CreateAndRunServerThread(); | 288 const scoped_ptr<base::Thread> server_thread = CreateAndRunServerThread(); |
| 290 EventType event = event_manager_->WaitForEvent(); | 289 EventType event = event_manager_->WaitForEvent(); |
| 291 ASSERT_EQ(EVENT_LISTEN, event); | 290 ASSERT_EQ(EVENT_LISTEN, event); |
| 292 | 291 |
| 293 // Create the client socket. | 292 // Create the client socket. |
| 294 const SocketDescriptor sock = CreateClientSocket(); | 293 const SocketDescriptor sock = CreateClientSocket(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 | 329 |
| 331 // Send() must fail. | 330 // Send() must fail. |
| 332 ssize_t ret = HANDLE_EINTR(send(sock, kMsg, sizeof(kMsg), 0)); | 331 ssize_t ret = HANDLE_EINTR(send(sock, kMsg, sizeof(kMsg), 0)); |
| 333 ASSERT_EQ(-1, ret); | 332 ASSERT_EQ(-1, ret); |
| 334 ASSERT_EQ(EPIPE, errno); | 333 ASSERT_EQ(EPIPE, errno); |
| 335 ASSERT_FALSE(event_manager_->HasPendingEvent()); | 334 ASSERT_FALSE(event_manager_->HasPendingEvent()); |
| 336 } | 335 } |
| 337 | 336 |
| 338 } // namespace | 337 } // namespace |
| 339 } // namespace net | 338 } // namespace net |
| OLD | NEW |