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