Skip to content

Commit 74322cb

Browse files
committed
squash
1 parent 63e01bf commit 74322cb

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

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

+2-21
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,7 @@ class ErgoStateContextSpec extends HistoryTestHelpers {
6363
val imvKey = extensionKvGen(Extension.FieldKeySize - 1, Extension.FieldValueMaxSize).sample.get
6464
sc.appendFullBlock(fbWithFields(imvKey +: oldFields)) shouldBe 'failure
6565

66-
// https://github.com/ergoplatform/ergo/issues/2114
67-
// this fails sporadically, when `(imvValue._1.head == 0)`, because less value bytes will be generated
68-
// by extensionKvGen(). Workaround is to just generate again while `(imvValue._1.head == 0)`
69-
// TODO: document, and possibly rewrite/replace extensionKvGen after the above issues are clarified/solved
70-
// https://github.com/ergoplatform/ergo/issues/2118
71-
72-
// validation of field value sizes
73-
var imvValue = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
74-
while (imvValue._1.head == 0) {
75-
imvValue = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
76-
}
66+
val imvValue = extensionKvGenImvValue(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
7767
sc.appendFullBlock(fbWithFields(imvValue +: oldFields)) shouldBe 'failure
7868

7969
// validation of incorrect interlinks
@@ -82,16 +72,7 @@ class ErgoStateContextSpec extends HistoryTestHelpers {
8272
).fields
8373
sc.appendFullBlock(fbWithFields(invalidInterlinks ++ oldFields)) shouldBe 'failure
8474

85-
// https://github.com/ergoplatform/ergo/issues/2114
86-
// if validMKV._1.head is 1, appendFullBlock within "valid application of correct extension" will fail,
87-
// because with "key.head == 1", improperly packed interlink would be generated.
88-
// As a workaround, just generate new values until (validMKV._1.head != 1)
89-
// TODO: investigate and provide a full fix (followup issue)
90-
// https://github.com/ergoplatform/ergo/issues/2117
91-
var validMKV = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize).sample.get
92-
while (validMKV._1.head == 1) {
93-
validMKV = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize).sample.get
94-
}
75+
val validMKV = extensionKvGenValidMKV(Extension.FieldKeySize, Extension.FieldValueMaxSize).sample.get
9576
// validation of key duplicates in fields
9677
sc.appendFullBlock(fbWithFields(Seq(validMKV, validMKV) ++ oldFields)) shouldBe 'failure
9778

src/test/scala/org/ergoplatform/utils/generators/ErgoGenerators.scala

+30
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,41 @@ trait ErgoGenerators extends CoreGenerators with ChainGenerator with Generators
9292
scorex.util.Random.randomBytes
9393
}
9494

95+
/**
96+
* Main KV generator: contains special handling for key.head == 0
97+
*/
9598
def extensionKvGen(keySize: Int, valuesSize: Int): Gen[(Array[Byte], Array[Byte])] = for {
9699
key <- genSecureBoundedBytes(keySize, keySize)
97100
value <- if (key.head == 0) genSecureBoundedBytes(4, 4) else genSecureBoundedBytes(valuesSize, valuesSize)
98101
} yield (key, value)
99102

103+
/**
104+
* Random KV generator: all random key/values
105+
*/
106+
def extensionKvGenImvValue(keySize: Int, valuesSize: Int): Gen[(Array[Byte], Array[Byte])] = for {
107+
key <- genSecureBoundedBytes(keySize, keySize)
108+
value <- genSecureBoundedBytes(valuesSize, valuesSize)
109+
} yield (key, value)
110+
111+
/**
112+
* Special KV generator: does not generate key.head == 1, because improperly packed interlink
113+
* would be generated, leading to failure.
114+
*/
115+
def extensionKvGenValidMKV(keySize: Int, valueSize: Int): Gen[(Array[Byte], Array[Byte])] = {
116+
def genSecureBoundedBytesWrapper(minSize: Int, maxSize: Int): Gen[Array[Byte]]= {
117+
genSecureBoundedBytes(minSize, maxSize)
118+
}
119+
120+
def keyGen: Gen[Array[Byte]] = genSecureBoundedBytesWrapper(keySize, keySize).flatMap { key =>
121+
if (key.headOption.contains(1.toByte)) keyGen else Gen.const(key)
122+
}
123+
124+
for {
125+
key <- keyGen
126+
value <- genSecureBoundedBytesWrapper(valueSize, valueSize)
127+
} yield (key, value)
128+
}
129+
100130
lazy val extensionGen: Gen[Extension] = for {
101131
headerId <- modifierIdGen
102132
mandatoryElements <- Gen.mapOf(extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize))

0 commit comments

Comments
 (0)