Index: net/base/test_completion_callback_unittest.cc |
diff --git a/net/base/test_completion_callback_unittest.cc b/net/base/test_completion_callback_unittest.cc |
deleted file mode 100644 |
index b0c8565b112b7c4cd096f0c750f485f31aca276f..0000000000000000000000000000000000000000 |
--- a/net/base/test_completion_callback_unittest.cc |
+++ /dev/null |
@@ -1,150 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Illustrates how to use worker threads that issue completion callbacks |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/threading/worker_pool.h" |
-#include "net/base/completion_callback.h" |
-#include "net/base/test_completion_callback.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/platform_test.h" |
- |
-namespace { |
- |
-const int kMagicResult = 8888; |
- |
-void CallClosureAfterCheckingResult(const base::Closure& closure, |
- bool* did_check_result, |
- int result) { |
- DCHECK_EQ(result, kMagicResult); |
- *did_check_result = true; |
- closure.Run(); |
-} |
- |
-// ExampleEmployer is a toy version of HostResolver |
-// TODO: restore damage done in extracting example from real code |
-// (e.g. bring back real destructor, bring back comments) |
-class ExampleEmployer { |
- public: |
- ExampleEmployer(); |
- ~ExampleEmployer(); |
- |
- // Do some imaginary work on a worker thread; |
- // when done, worker posts callback on the original thread. |
- // Returns true on success |
- bool DoSomething(const net::CompletionCallback& callback); |
- |
- private: |
- class ExampleWorker; |
- friend class ExampleWorker; |
- scoped_refptr<ExampleWorker> request_; |
- DISALLOW_COPY_AND_ASSIGN(ExampleEmployer); |
-}; |
- |
-// Helper class; this is how ExampleEmployer puts work on a different thread |
-class ExampleEmployer::ExampleWorker |
- : public base::RefCountedThreadSafe<ExampleWorker> { |
- public: |
- ExampleWorker(ExampleEmployer* employer, |
- const net::CompletionCallback& callback) |
- : employer_(employer), |
- callback_(callback), |
- origin_loop_(base::MessageLoop::current()) {} |
- void DoWork(); |
- void DoCallback(); |
- private: |
- friend class base::RefCountedThreadSafe<ExampleWorker>; |
- |
- ~ExampleWorker() {} |
- |
- // Only used on the origin thread (where DoSomething was called). |
- ExampleEmployer* employer_; |
- net::CompletionCallback callback_; |
- // Used to post ourselves onto the origin thread. |
- base::Lock origin_loop_lock_; |
- base::MessageLoop* origin_loop_; |
-}; |
- |
-void ExampleEmployer::ExampleWorker::DoWork() { |
- // Running on the worker thread |
- // In a real worker thread, some work would be done here. |
- // Pretend it is, and send the completion callback. |
- |
- // The origin loop could go away while we are trying to post to it, so we |
- // need to call its PostTask method inside a lock. See ~ExampleEmployer. |
- { |
- base::AutoLock locked(origin_loop_lock_); |
- if (origin_loop_) |
- origin_loop_->PostTask(FROM_HERE, |
- base::Bind(&ExampleWorker::DoCallback, this)); |
- } |
-} |
- |
-void ExampleEmployer::ExampleWorker::DoCallback() { |
- // Running on the origin thread. |
- |
- // Drop the employer_'s reference to us. Do this before running the |
- // callback since the callback might result in the employer being |
- // destroyed. |
- employer_->request_ = NULL; |
- |
- callback_.Run(kMagicResult); |
-} |
- |
-ExampleEmployer::ExampleEmployer() { |
-} |
- |
-ExampleEmployer::~ExampleEmployer() { |
-} |
- |
-bool ExampleEmployer::DoSomething(const net::CompletionCallback& callback) { |
- DCHECK(!request_.get()) << "already in use"; |
- |
- request_ = new ExampleWorker(this, callback); |
- |
- // Dispatch to worker thread... |
- if (!base::WorkerPool::PostTask( |
- FROM_HERE, |
- base::Bind(&ExampleWorker::DoWork, request_.get()), |
- true)) { |
- NOTREACHED(); |
- request_ = NULL; |
- return false; |
- } |
- |
- return true; |
-} |
- |
-} // namespace |
- |
-typedef PlatformTest TestCompletionCallbackTest; |
- |
-TEST_F(TestCompletionCallbackTest, Simple) { |
- ExampleEmployer boss; |
- net::TestCompletionCallback callback; |
- bool queued = boss.DoSomething(callback.callback()); |
- EXPECT_TRUE(queued); |
- int result = callback.WaitForResult(); |
- EXPECT_EQ(result, kMagicResult); |
-} |
- |
-TEST_F(TestCompletionCallbackTest, Closure) { |
- ExampleEmployer boss; |
- net::TestClosure closure; |
- bool did_check_result = false; |
- net::CompletionCallback completion_callback = |
- base::Bind(&CallClosureAfterCheckingResult, |
- closure.closure(), base::Unretained(&did_check_result)); |
- bool queued = boss.DoSomething(completion_callback); |
- EXPECT_TRUE(queued); |
- |
- EXPECT_FALSE(did_check_result); |
- closure.WaitForResult(); |
- EXPECT_TRUE(did_check_result); |
-} |
- |
-// TODO: test deleting ExampleEmployer while work outstanding |