# 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日目に到達した。祝
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up