Home | History | Annotate | Download | only in test
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
      6 #define BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
      7 
      8 #include <stddef.h>
      9 
     10 #include <cstddef>
     11 #include <string>
     12 
     13 #include "base/callback.h"
     14 #include "base/compiler_specific.h"
     15 #include "base/macros.h"
     16 #include "base/memory/ref_counted.h"
     17 #include "base/run_loop.h"
     18 #include "base/synchronization/lock.h"
     19 #include "base/threading/sequenced_worker_pool.h"
     20 
     21 namespace base {
     22 
     23 class MessageLoop;
     24 
     25 // Wrapper around SequencedWorkerPool for testing that blocks destruction
     26 // until the pool is actually destroyed.  This is so that a
     27 // SequencedWorkerPool from one test doesn't outlive its test and cause
     28 // strange races with other tests that touch global stuff (like histograms and
     29 // logging).  However, this requires that nothing else on this thread holds a
     30 // ref to the pool when the SequencedWorkerPoolOwner is destroyed.
     31 //
     32 // This class calls Shutdown on the owned SequencedWorkerPool in the destructor.
     33 // Tests may themselves call Shutdown earlier to test shutdown behavior.
     34 class SequencedWorkerPoolOwner : public SequencedWorkerPool::TestingObserver {
     35  public:
     36   SequencedWorkerPoolOwner(size_t max_threads,
     37                            const std::string& thread_name_prefix);
     38 
     39   ~SequencedWorkerPoolOwner() override;
     40 
     41   // Don't change the returned pool's testing observer.
     42   const scoped_refptr<SequencedWorkerPool>& pool() const;
     43 
     44   // The given callback will be called on WillWaitForShutdown().
     45   void SetWillWaitForShutdownCallback(const Closure& callback);
     46 
     47   int has_work_call_count() const;
     48 
     49  private:
     50   // SequencedWorkerPool::TestingObserver implementation.
     51   void OnHasWork() override;
     52   void WillWaitForShutdown() override;
     53   void OnDestruct() override;
     54 
     55   // Used to run the current thread's message loop until the
     56   // SequencedWorkerPool's destruction has been verified.
     57   base::RunLoop exit_loop_;
     58   MessageLoop* const constructor_message_loop_;
     59 
     60   scoped_refptr<SequencedWorkerPool> pool_;
     61   Closure will_wait_for_shutdown_callback_;
     62 
     63   mutable Lock has_work_lock_;
     64   int has_work_call_count_;
     65 
     66   DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolOwner);
     67 };
     68 
     69 }  // namespace base
     70 
     71 #endif  // BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
     72