|  | // Copyright 2019 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/message_loop/work_id_provider.h" | 
|  |  | 
|  | #include <limits> | 
|  | #include <memory> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/functional/callback.h" | 
|  | #include "base/test/bind.h" | 
|  | #include "base/threading/simple_thread.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class TestThread : public SimpleThread { | 
|  | public: | 
|  | explicit TestThread(OnceCallback<void(WorkIdProvider*)> validate_func) | 
|  | : SimpleThread("WorkIdProviderTestThread"), | 
|  | validate_func_(std::move(validate_func)) {} | 
|  |  | 
|  | void Run() override { | 
|  | std::move(validate_func_).Run(WorkIdProvider::GetForCurrentThread()); | 
|  | } | 
|  |  | 
|  | private: | 
|  | OnceCallback<void(WorkIdProvider*)> validate_func_; | 
|  | }; | 
|  |  | 
|  | template <class Func> | 
|  | void RunTest(const Func& func) { | 
|  | TestThread thread(BindLambdaForTesting(func)); | 
|  |  | 
|  | thread.Start(); | 
|  | thread.Join(); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | TEST(WorkIdProviderTest, StartsAtZero) { | 
|  | RunTest( | 
|  | [](WorkIdProvider* provider) { EXPECT_EQ(0u, provider->GetWorkId()); }); | 
|  | } | 
|  |  | 
|  | TEST(WorkIdProviderTest, Increment) { | 
|  | RunTest([](WorkIdProvider* provider) { | 
|  | provider->IncrementWorkIdForTesting(); | 
|  | EXPECT_EQ(1u, provider->GetWorkId()); | 
|  |  | 
|  | provider->IncrementWorkIdForTesting(); | 
|  | EXPECT_EQ(2u, provider->GetWorkId()); | 
|  |  | 
|  | provider->IncrementWorkIdForTesting(); | 
|  | EXPECT_EQ(3u, provider->GetWorkId()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | TEST(WorkIdProviderTest, SkipsZeroOnOverflow) { | 
|  | RunTest([](WorkIdProvider* provider) { | 
|  | provider->SetCurrentWorkIdForTesting( | 
|  | std::numeric_limits<unsigned int>::max()); | 
|  | provider->IncrementWorkIdForTesting(); | 
|  | EXPECT_EQ(1u, provider->GetWorkId()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | }  // namespace base |