From a53c14dc756b428991ed371c992f398d7f923462 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Fri, 19 Jul 2019 10:33:47 -0700 Subject: [PATCH] Add internal experiments API Summary: Adds internal API that we can use to conduct experiments. Reviewed By: SidharthGuglani Differential Revision: D16340463 fbshipit-source-id: 07a8bb7dbc4a02c5c95f1ad29b18845ab43752cf --- tests/InternalTest.cpp | 48 +++++++++++++++++++++++++++++++++ yoga/internal/experiments-inl.h | 31 +++++++++++++++++++++ yoga/internal/experiments.cpp | 37 +++++++++++++++++++++++++ yoga/internal/experiments.h | 25 +++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 tests/InternalTest.cpp create mode 100644 yoga/internal/experiments-inl.h create mode 100644 yoga/internal/experiments.cpp create mode 100644 yoga/internal/experiments.h diff --git a/tests/InternalTest.cpp b/tests/InternalTest.cpp new file mode 100644 index 00000000..8646aebc --- /dev/null +++ b/tests/InternalTest.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +#include +#include + +using namespace facebook::yoga::internal; + +struct YogaInternalTest : public testing::Test { + void SetUp() override; +}; + +TEST_F(YogaInternalTest, experiments_are_initially_disabled) { + ASSERT_EQ(isEnabled(Experiment::kDoubleMeasureCallbacks), false); +} + +TEST_F(YogaInternalTest, experiments_are_can_be_enabled) { + enable(Experiment::kDoubleMeasureCallbacks); + ASSERT_EQ(isEnabled(Experiment::kDoubleMeasureCallbacks), true); +} + +TEST_F(YogaInternalTest, experiments_are_can_be_disabled) { + enable(Experiment::kDoubleMeasureCallbacks); + disable(Experiment::kDoubleMeasureCallbacks); + + ASSERT_EQ(isEnabled(Experiment::kDoubleMeasureCallbacks), false); +} + +TEST_F(YogaInternalTest, experiments_are_can_be_toggled_on) { + disable(Experiment::kDoubleMeasureCallbacks); + + ASSERT_EQ(toggle(Experiment::kDoubleMeasureCallbacks), false); + ASSERT_EQ(isEnabled(Experiment::kDoubleMeasureCallbacks), true); +} + +TEST_F(YogaInternalTest, experiments_are_can_be_toggled_off) { + enable(Experiment::kDoubleMeasureCallbacks); + + ASSERT_EQ(toggle(Experiment::kDoubleMeasureCallbacks), true); + ASSERT_EQ(isEnabled(Experiment::kDoubleMeasureCallbacks), false); +} + +void YogaInternalTest::SetUp() { + disableAllExperiments(); +} diff --git a/yoga/internal/experiments-inl.h b/yoga/internal/experiments-inl.h new file mode 100644 index 00000000..ebbeccbc --- /dev/null +++ b/yoga/internal/experiments-inl.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +#pragma once + +#include "experiments.h" + +#include + +namespace facebook { +namespace yoga { +namespace internal { + +namespace detail { +extern std::bitset enabledExperiments; +} // namespace detail + +inline bool isEnabled(Experiment experiment) { + return detail::enabledExperiments.test(static_cast(experiment)); +} + +inline void disableAllExperiments() { + detail::enabledExperiments = 0; +} + +} // namespace internal +} // namespace yoga +} // namespace facebook diff --git a/yoga/internal/experiments.cpp b/yoga/internal/experiments.cpp new file mode 100644 index 00000000..4b67eee5 --- /dev/null +++ b/yoga/internal/experiments.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +#include "experiments.h" +#include "experiments-inl.h" + +namespace facebook { +namespace yoga { +namespace internal { + +namespace detail { + +std::bitset enabledExperiments = 0; + +} // namespace detail + +void enable(Experiment experiment) { + detail::enabledExperiments.set(static_cast(experiment)); +} + +void disable(Experiment experiment) { + detail::enabledExperiments.reset(static_cast(experiment)); +} + +bool toggle(Experiment experiment) { + auto bit = static_cast(experiment); + auto previousState = detail::enabledExperiments.test(bit); + detail::enabledExperiments.flip(bit); + return previousState; +} + +} // namespace internal +} // namespace yoga +} // namespace facebook diff --git a/yoga/internal/experiments.h b/yoga/internal/experiments.h new file mode 100644 index 00000000..7fd4cb37 --- /dev/null +++ b/yoga/internal/experiments.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +#pragma once + +#include + +namespace facebook { +namespace yoga { +namespace internal { + +enum struct Experiment : size_t { + kDoubleMeasureCallbacks, +}; + +void enable(Experiment); +void disable(Experiment); +bool toggle(Experiment); + +} // namespace internal +} // namespace yoga +} // namespace facebook