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:
David Aurelio
2019-07-19 10:33:47 -07:00
committed by Facebook Github Bot
parent c99fc9c4da
commit a53c14dc75
4 changed files with 141 additions and 0 deletions

48
tests/InternalTest.cpp Normal file
View 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();
}

View 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

View 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

View 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