---
# System prepended metadata

title: CHECK_IS_TEST
tags: [Chromium-General, elkurin-daily-note]

---

# CHECK_IS_TEST

[`CHECK_IS_TEST()`](https://source.chromium.org/chromium/chromium/src/+/main:base/check_is_test.h;l=37;drc=e4622aaeccea84652488d1822c28c78b7115684f)というマクロを見つけた。  
これは何？

## 概要
テストかどうかを判定するために使われる。
```cpp=
UserManagerBase::UserManagerBase(...) {
  if (!local_state) {
    CHECK_IS_TEST();
  }
}
```

[AllowCheckIsTestForTesting](https://source.chromium.org/chromium/chromium/src/+/main:base/check_is_test.cc;l=24;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)を呼ぶことで終了時まで`g_this_is_a_test`がtrueにセットされ、[check_is_test_impl()](https://source.chromium.org/chromium/chromium/src/+/main:base/check_is_test.cc;l=15;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)がこのフラグを確認するようになる。  
なお、`g_this_is_a_test`のdefault値はfalseだが、falseに上書きするメソッドはないので、一度trueにセットしたらずっとtestフラグがセットされたままであることが保証されている。  

### 実装のポイント
AllowCheckIsTestForTestingは実装は[`base/check_is_test.cc`](https://source.chromium.org/chromium/chromium/src/+/main:base/check_is_test.cc;l=24;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)にあるが、[`base/test/allow_check_is_test_for_testing.h`](https://source.chromium.org/chromium/chromium/src/+/main:base/test/allow_check_is_test_for_testing.h)で宣言している。  
これは、Chromiumのルールでfor_testingファイルはtest codeからしかinlucdeしてはいけないことになっていることに関係している。  
AllowCheckIsTestForTestingはテストからしかセットしてはいけない関数だが、そこでセットされるflagである`g_this_is_a_test`はCHECK_IS_TESTから参照されるが、この関数はproduction codeで使われるものである。  
なので、実装はnon-testコードにすることで解決している。

## 使用しているクラス
* unit_tests の [LaunchUnitTestsInternal](https://source.chromium.org/chromium/chromium/src/+/main:base/test/launcher/unit_test_launcher.cc;l=221;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)
* ios用のunit_tests の [LaunchUnitTests](https://source.chromium.org/chromium/chromium/src/+/main:base/test/launcher/unit_test_launcher_ios.cc;l=32;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)
* chromeのtestの [LaunchChtomeTests](https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/base/chrome_test_launcher.cc;l=263;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)
* android_webview_unittests の [webview_tests.cc](https://source.chromium.org/chromium/chromium/src/+/main:android_webview/lib/webview_tests.cc)
* [FakeAshTestChromeBrowserMainExtraParts](https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/base/chromeos/fake_ash_test_chrome_browser_main_extra_parts.cc;l=31;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)
* [KeepAliveURLBrowserTestBase](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/loader/keep_alive_url_browsertest.cc;l=83;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)

中途半端な導入のされ方なのは、比較的最近導入されたマクロだからだと思う。([CL](https://chromium-review.googlesource.com/c/chromium/src/+/3650548))

ところで[check_is_test.ccのコメント](https://source.chromium.org/chromium/chromium/src/+/main:base/check_is_test.cc;l=25-28;drc=6f4c64436342c818aa41e6a5c55034e74ec9c6b6)曰くAllowCheckIsTestForTestingはbase::TestSuiteで呼ばれるとある。  
browsertestからランダムに呼ぶコードがあると、今後TestSuiteに追加しようとしたときに大変そう。  
AllowCheckIsTestForTestingが二度以上呼ばれることをCHECKで弾いているので、これを全部取り除く作業が必要になりそう？  
（ただ、Blameを追ってると、CHECK_IS_TESTの実装者もこういう使い方をされてることを認識しているっぽいので大丈夫？）

## Note
daily noteも100日目に到達した。祝
