Skip to content

Commit bd9db19

Browse files
authored
Merge pull request #2116 from stenolog/i2114-repro
Fix ErgoStateContextSpec Sporadic Failures
2 parents 85336b7 + 46f7f98 commit bd9db19

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

ergo-core/src/test/scala/org/ergoplatform/utils/generators/ErgoCoreGenerators.scala

+26
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,37 @@ object ErgoCoreGenerators {
8888
scorex.util.Random.randomBytes
8989
}
9090

91+
/**
92+
* Main KV generator: contains special handling for key.head == 0
93+
*/
9194
def extensionKvGen(keySize: Int, valuesSize: Int): Gen[(Array[Byte], Array[Byte])] = for {
9295
key <- genSecureBoundedBytes(keySize, keySize)
9396
value <- if (key.head == 0) genSecureBoundedBytes(4, 4) else genSecureBoundedBytes(valuesSize, valuesSize)
9497
} yield (key, value)
9598

99+
/**
100+
* Random KV generator: all random key/values
101+
*/
102+
def extensionKvGenImvValue(keySize: Int, valuesSize: Int): Gen[(Array[Byte], Array[Byte])] = for {
103+
key <- genSecureBoundedBytes(keySize, keySize)
104+
value <- genSecureBoundedBytes(valuesSize, valuesSize)
105+
} yield (key, value)
106+
107+
/**
108+
* Special KV generator: does not generate key.head == 1, because improperly packed interlink
109+
* would be generated, leading to failure.
110+
*/
111+
def extensionKvGenValidMKV(keySize: Int, valueSize: Int): Gen[(Array[Byte], Array[Byte])] = {
112+
def keyGenHeadNotOne: Gen[Array[Byte]] = genSecureBoundedBytes(keySize, keySize).flatMap { key =>
113+
if (key.headOption.contains(1.toByte)) keyGenHeadNotOne else Gen.const(key)
114+
}
115+
116+
for {
117+
key <- keyGenHeadNotOne
118+
value <- genSecureBoundedBytes(valueSize, valueSize)
119+
} yield (key, value)
120+
}
121+
96122
lazy val extensionGen: Gen[Extension] = for {
97123
headerId <- modifierIdGen
98124
mandatoryElements <- Gen.mapOf(extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize))

src/test/scala/org/ergoplatform/nodeView/state/ErgoStateContextSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ErgoStateContextSpec extends ErgoCorePropertyTest {
6767
sc.appendFullBlock(fbWithFields(imvKey +: oldFields)) shouldBe 'failure
6868

6969
// validation of field value sizes
70-
val imvValue = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
70+
val imvValue = extensionKvGenImvValue(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
7171
sc.appendFullBlock(fbWithFields(imvValue +: oldFields)) shouldBe 'failure
7272

7373
// validation of incorrect interlinks
@@ -76,8 +76,8 @@ class ErgoStateContextSpec extends ErgoCorePropertyTest {
7676
).fields
7777
sc.appendFullBlock(fbWithFields(invalidInterlinks ++ oldFields)) shouldBe 'failure
7878

79+
val validMKV = extensionKvGenValidMKV(Extension.FieldKeySize, Extension.FieldValueMaxSize).sample.get
7980
// validation of key duplicates in fields
80-
val validMKV = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize).sample.get
8181
sc.appendFullBlock(fbWithFields(Seq(validMKV, validMKV) ++ oldFields)) shouldBe 'failure
8282

8383
// valid application of correct extension

0 commit comments

Comments
 (0)