| Index: snapshot/win/process_reader_win_test.cc
 | 
| diff --git a/snapshot/win/process_reader_win_test.cc b/snapshot/win/process_reader_win_test.cc
 | 
| index 1cb4bdda51ad37efe98fdc25f256adaf9cbcf352..9e2e52cd6a9ceb9e1bd4ce1d560d3ecbccabf7c8 100644
 | 
| --- a/snapshot/win/process_reader_win_test.cc
 | 
| +++ b/snapshot/win/process_reader_win_test.cc
 | 
| @@ -19,6 +19,8 @@
 | 
|  
 | 
|  #include "gtest/gtest.h"
 | 
|  #include "test/win/win_multiprocess.h"
 | 
| +#include "util/synchronization/semaphore.h"
 | 
| +#include "util/thread/thread.h"
 | 
|  #include "util/win/scoped_process_suspend.h"
 | 
|  
 | 
|  namespace crashpad {
 | 
| @@ -104,7 +106,7 @@ TEST(ProcessReaderWin, SelfOneThread) {
 | 
|    // thread, not exactly one thread.
 | 
|    ASSERT_GE(threads.size(), 1u);
 | 
|  
 | 
| -  EXPECT_EQ(GetThreadId(GetCurrentThread()), threads[0].id);
 | 
| +  EXPECT_EQ(GetCurrentThreadId(), threads[0].id);
 | 
|  #if defined(ARCH_CPU_64_BITS)
 | 
|    EXPECT_NE(0, threads[0].context.Rip);
 | 
|  #else
 | 
| @@ -120,14 +122,36 @@ class ProcessReaderChildThreadSuspendCount final : public WinMultiprocess {
 | 
|    ~ProcessReaderChildThreadSuspendCount() {}
 | 
|  
 | 
|   private:
 | 
| +  enum : unsigned int { kCreatedThreads = 3 };
 | 
| +
 | 
| +  class SleepingThread : public Thread {
 | 
| +   public:
 | 
| +    SleepingThread() : done_(nullptr) {}
 | 
| +
 | 
| +    void SetHandle(Semaphore* done) {
 | 
| +      done_= done;
 | 
| +    }
 | 
| +
 | 
| +    void ThreadMain() override {
 | 
| +      done_->Wait();
 | 
| +    };
 | 
| +
 | 
| +   private:
 | 
| +    Semaphore* done_;
 | 
| +  };
 | 
| +
 | 
|    void WinMultiprocessParent() override {
 | 
| +    char c;
 | 
| +    CheckedReadFile(ReadPipeHandle(), &c, sizeof(c));
 | 
| +    ASSERT_EQ(' ', c);
 | 
| +
 | 
|      {
 | 
|        ProcessReaderWin process_reader;
 | 
|        ASSERT_TRUE(process_reader.Initialize(ChildProcess(),
 | 
|                                              ProcessSuspensionState::kRunning));
 | 
|  
 | 
|        const auto& threads = process_reader.Threads();
 | 
| -      ASSERT_FALSE(threads.empty());
 | 
| +      ASSERT_GE(threads.size(), kCreatedThreads + 1);
 | 
|        for (const auto& thread : threads)
 | 
|          EXPECT_EQ(0u, thread.suspend_count);
 | 
|      }
 | 
| @@ -142,19 +166,33 @@ class ProcessReaderChildThreadSuspendCount final : public WinMultiprocess {
 | 
|        // Confirm that thread counts are adjusted correctly for the process being
 | 
|        // suspended.
 | 
|        const auto& threads = process_reader.Threads();
 | 
| -      ASSERT_FALSE(threads.empty());
 | 
| +      ASSERT_GE(threads.size(), kCreatedThreads + 1);
 | 
|        for (const auto& thread : threads)
 | 
|          EXPECT_EQ(0u, thread.suspend_count);
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    void WinMultiprocessChild() override {
 | 
| -    WinVMAddress address = reinterpret_cast<WinVMAddress>(kTestMemory);
 | 
| -    CheckedWriteFile(WritePipeHandle(), &address, sizeof(address));
 | 
| +    // Create three dummy threads so we can confirm we read successfully read
 | 
| +    // more than just the main thread.
 | 
| +    SleepingThread threads[kCreatedThreads];
 | 
| +    Semaphore done(0);
 | 
| +    for (auto& thread : threads)
 | 
| +      thread.SetHandle(&done);
 | 
| +    for (auto& thread : threads)
 | 
| +      thread.Start();
 | 
| +
 | 
| +    char c = ' ';
 | 
| +    CheckedWriteFile(WritePipeHandle(), &c, sizeof(c));
 | 
|  
 | 
|      // Wait for the parent to signal that it's OK to exit by closing its end of
 | 
|      // the pipe.
 | 
|      CheckedReadFileAtEOF(ReadPipeHandle());
 | 
| +
 | 
| +    for (int i = 0; i < arraysize(threads); ++i)
 | 
| +      done.Signal();
 | 
| +    for (auto& thread : threads)
 | 
| +      thread.Join();
 | 
|    }
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(ProcessReaderChildThreadSuspendCount);
 | 
| 
 |