Add feature flagging tests.
This commit is contained in:
parent
d02a863c28
commit
c759e6a9f3
|
@ -30,6 +30,7 @@ zcash_gtest_SOURCES += \
|
||||||
gtest/test_deprecation.cpp \
|
gtest/test_deprecation.cpp \
|
||||||
gtest/test_dynamicusage.cpp \
|
gtest/test_dynamicusage.cpp \
|
||||||
gtest/test_equihash.cpp \
|
gtest/test_equihash.cpp \
|
||||||
|
gtest/test_feature_flagging.cpp \
|
||||||
gtest/test_history.cpp \
|
gtest/test_history.cpp \
|
||||||
gtest/test_httprpc.cpp \
|
gtest/test_httprpc.cpp \
|
||||||
gtest/test_joinsplit.cpp \
|
gtest/test_joinsplit.cpp \
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "chainparams.h"
|
||||||
|
#include "consensus/params.h"
|
||||||
|
#include "utiltest.h"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
enum TestFeature : uint32_t {
|
||||||
|
TF_1,
|
||||||
|
TF_2,
|
||||||
|
TF_3,
|
||||||
|
TF_4,
|
||||||
|
TF_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestParams {
|
||||||
|
std::set<TestFeature> vRequiredFeatures;
|
||||||
|
|
||||||
|
bool NetworkUpgradeActive(int nHeight, Consensus::UpgradeIndex idx) const {
|
||||||
|
switch (idx) {
|
||||||
|
case Consensus::BASE_SPROUT:
|
||||||
|
return nHeight >= 0;
|
||||||
|
case Consensus::UPGRADE_OVERWINTER:
|
||||||
|
return nHeight >= 5;
|
||||||
|
case Consensus::UPGRADE_SAPLING:
|
||||||
|
return nHeight >= 10;
|
||||||
|
case Consensus::UPGRADE_BLOSSOM:
|
||||||
|
return nHeight >= 15;
|
||||||
|
case Consensus::UPGRADE_HEARTWOOD:
|
||||||
|
return nHeight >= 20;
|
||||||
|
case Consensus::UPGRADE_CANOPY:
|
||||||
|
return nHeight >= 25;
|
||||||
|
case Consensus::UPGRADE_ZFUTURE:
|
||||||
|
return nHeight >= 30;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FeatureRequired(const TestFeature feature) const {
|
||||||
|
return vRequiredFeatures.count(feature) > 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(FeatureFlagging, FeatureDependencies) {
|
||||||
|
TestParams params;
|
||||||
|
|
||||||
|
Consensus::FeatureSet<TestFeature, TestParams> features({
|
||||||
|
{
|
||||||
|
.dependsOn = {},
|
||||||
|
.activation = Consensus::BASE_SPROUT
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.dependsOn = {TF_1},
|
||||||
|
.activation = Consensus::UPGRADE_OVERWINTER
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.dependsOn = {},
|
||||||
|
.activation = Consensus::UPGRADE_BLOSSOM
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.dependsOn = {TF_2, TF_3},
|
||||||
|
.activation = Consensus::UPGRADE_HEARTWOOD
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 1, TF_1));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 1, TF_2));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 1, TF_3));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 1, TF_4));
|
||||||
|
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 5, TF_1));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 5, TF_2));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 5, TF_3));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 5, TF_4));
|
||||||
|
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 15, TF_1));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 15, TF_2));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 15, TF_3));
|
||||||
|
EXPECT_FALSE(features.FeatureActive(params, 15, TF_4));
|
||||||
|
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 20, TF_1));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 20, TF_2));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 20, TF_3));
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 20, TF_4));
|
||||||
|
|
||||||
|
// Force TF_4 to be active
|
||||||
|
params.vRequiredFeatures.insert(TF_4);
|
||||||
|
|
||||||
|
// Ensure that a feature cannot be forced to be active if
|
||||||
|
// all of its dependencies are not active
|
||||||
|
EXPECT_DEATH(features.FeatureActive(params, 5, TF_4), "");
|
||||||
|
// A feature can be activated before its activation height
|
||||||
|
// if all of its dependencies are active
|
||||||
|
EXPECT_TRUE(features.FeatureActive(params, 15, TF_4));
|
||||||
|
}
|
Loading…
Reference in New Issue