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
This commit is contained in:
committed by
Facebook Github Bot
parent
c99fc9c4da
commit
a53c14dc75
48
tests/InternalTest.cpp
Normal file
48
tests/InternalTest.cpp
Normal file
@@ -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 <gtest/gtest.h>
|
||||
#include <yoga/internal/experiments-inl.h>
|
||||
|
||||
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();
|
||||
}
|
31
yoga/internal/experiments-inl.h
Normal file
31
yoga/internal/experiments-inl.h
Normal file
@@ -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 <bitset>
|
||||
|
||||
namespace facebook {
|
||||
namespace yoga {
|
||||
namespace internal {
|
||||
|
||||
namespace detail {
|
||||
extern std::bitset<sizeof(int)> enabledExperiments;
|
||||
} // namespace detail
|
||||
|
||||
inline bool isEnabled(Experiment experiment) {
|
||||
return detail::enabledExperiments.test(static_cast<size_t>(experiment));
|
||||
}
|
||||
|
||||
inline void disableAllExperiments() {
|
||||
detail::enabledExperiments = 0;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace yoga
|
||||
} // namespace facebook
|
37
yoga/internal/experiments.cpp
Normal file
37
yoga/internal/experiments.cpp
Normal file
@@ -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<sizeof(int)> enabledExperiments = 0;
|
||||
|
||||
} // namespace detail
|
||||
|
||||
void enable(Experiment experiment) {
|
||||
detail::enabledExperiments.set(static_cast<size_t>(experiment));
|
||||
}
|
||||
|
||||
void disable(Experiment experiment) {
|
||||
detail::enabledExperiments.reset(static_cast<size_t>(experiment));
|
||||
}
|
||||
|
||||
bool toggle(Experiment experiment) {
|
||||
auto bit = static_cast<size_t>(experiment);
|
||||
auto previousState = detail::enabledExperiments.test(bit);
|
||||
detail::enabledExperiments.flip(bit);
|
||||
return previousState;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace yoga
|
||||
} // namespace facebook
|
25
yoga/internal/experiments.h
Normal file
25
yoga/internal/experiments.h
Normal file
@@ -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 <cstddef>
|
||||
|
||||
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
|
Reference in New Issue
Block a user