text: /*
   * Copyright 2017 Facebook, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  #include <thread>
  
  #include <folly/Baton.h>
  #include <folly/ScopeGuard.h>
  #include <folly/ThreadName.h>
  #include <folly/portability/GTest.h>
  
  using namespace std;
  using namespace folly;
  
  namespace {
  
  const bool expectedSetOtherThreadNameResult = folly::canSetOtherThreadName();
  const bool expectedSetSelfThreadNameResult = folly::canSetCurrentThreadName();
  constexpr StringPiece kThreadName{"rockin-thread"};
  
  } // namespace
  
  TEST(ThreadName, getCurrentThreadName) {
    thread th([] {
      EXPECT_EQ(expectedSetSelfThreadNameResult, setThreadName(kThreadName));
      if (expectedSetSelfThreadNameResult) {
        EXPECT_EQ(kThreadName.toString(), *getCurrentThreadName());
      }
    });
    SCOPE_EXIT { th.join(); };
  }
  
  TEST(ThreadName, setThreadName_other_pthread) {
    Baton<> handle_set;
    Baton<> let_thread_end;
    pthread_t handle;
    thread th([&] {
        handle = pthread_self();
        handle_set.post();
        let_thread_end.wait();
    });
    SCOPE_EXIT { th.join(); };
    handle_set.wait();
    SCOPE_EXIT { let_thread_end.post(); };
    EXPECT_EQ(
        expectedSetOtherThreadNameResult, setThreadName(handle, kThreadName));
  }
  
  TEST(ThreadName, setThreadName_other_id) {
    Baton<> let_thread_end;
    thread th([&] {
        let_thread_end.wait();
    });
    SCOPE_EXIT { th.join(); };
    SCOPE_EXIT { let_thread_end.post(); };
    EXPECT_EQ(
        expectedSetOtherThreadNameResult,
        setThreadName(th.get_id(), kThreadName));
    if (expectedSetOtherThreadNameResult) {
      EXPECT_EQ(*getThreadName(th.get_id()), kThreadName);
    }
  }
  