Skip to content

Commit

Permalink
provide alternate test-generators
Browse files Browse the repository at this point in the history
  • Loading branch information
stenolog committed Mar 5, 2024
1 parent d37d0f9 commit 9c4b5a8
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,37 @@ object ErgoCoreGenerators {
scorex.util.Random.randomBytes
}

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

/**
* Random KV generator: all random key/values
*/
def extensionKvGenImvValue(keySize: Int, valuesSize: Int): Gen[(Array[Byte], Array[Byte])] = for {
key <- genSecureBoundedBytes(keySize, keySize)
value <- genSecureBoundedBytes(valuesSize, valuesSize)
} yield (key, value)

/**
* Special KV generator: does not generate key.head == 1, because improperly packed interlink
* would be generated, leading to failure.
*/
def extensionKvGenValidMKV(keySize: Int, valueSize: Int): Gen[(Array[Byte], Array[Byte])] = {
def keyGenHeadNotOne: Gen[Array[Byte]] = genSecureBoundedBytes(keySize, keySize).flatMap { key =>
if (key.headOption.contains(1.toByte)) keyGenHeadNotOne else Gen.const(key)
}

for {
key <- keyGenHeadNotOne
value <- genSecureBoundedBytes(valueSize, valueSize)
} yield (key, value)
}

lazy val extensionGen: Gen[Extension] = for {
headerId <- modifierIdGen
mandatoryElements <- Gen.mapOf(extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,7 @@ class ErgoStateContextSpec extends ErgoCorePropertyTest {
val imvKey = extensionKvGen(Extension.FieldKeySize - 1, Extension.FieldValueMaxSize).sample.get
sc.appendFullBlock(fbWithFields(imvKey +: oldFields)) shouldBe 'failure

// https://github.com/ergoplatform/ergo/issues/2114
// this fails sporadically, when `(imvValue._1.head == 0)`, because less value bytes will be generated
// by extensionKvGen(). Workaround is to just generate again while `(imvValue._1.head == 0)`
// TODO: document, and possibly rewrite/replace extensionKvGen after the above issues are clarified/solved
// https://github.com/ergoplatform/ergo/issues/2118

// validation of field value sizes
var imvValue = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
while (imvValue._1.head == 0) {
imvValue = extensionKvGen(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
}
val imvValue = extensionKvGenImvValue(Extension.FieldKeySize, Extension.FieldValueMaxSize + 1).sample.get
sc.appendFullBlock(fbWithFields(imvValue +: oldFields)) shouldBe 'failure

// validation of incorrect interlinks
Expand All @@ -85,16 +75,7 @@ class ErgoStateContextSpec extends ErgoCorePropertyTest {
).fields
sc.appendFullBlock(fbWithFields(invalidInterlinks ++ oldFields)) shouldBe 'failure

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

Expand Down

0 comments on commit 9c4b5a8

Please sign in to comment.