in ratatool-scalacheck/src/main/scala/com/spotify/ratatool/scalacheck/AvroGenerator.scala [78:128]
def genericRecordOf(schema: Schema): Gen[GenericRecord] =
avroValueOf(schema)(GenericData.get()).asInstanceOf[Gen[GenericRecord]]
def genericRecordOf(schema: Schema, stringableGens: Map[Class[_], Gen[_]]): Gen[GenericRecord] =
avroValueOf(schema)(GenericData.get(), stringableGens).asInstanceOf[Gen[GenericRecord]]
/** Aliases for API consistency across formats */
def avroOf[A <: SpecificRecord: ClassTag]: Gen[A] =
specificRecordOf[A]
def avroOf[A <: SpecificRecord: ClassTag](stringableGens: Map[Class[_], Gen[_]]): Gen[A] =
specificRecordOf[A](stringableGens)
def avroOf(schema: Schema): Gen[GenericRecord] =
genericRecordOf(schema)
def avroOf(schema: Schema, stringableGens: Map[Class[_], Gen[_]]): Gen[GenericRecord] =
genericRecordOf(schema, stringableGens)
/**
* Arbitrary [0-39] range and directly creating Utf-8 chosen to mimic [[RandomData]]. Also avoids
* some ser/de issues with IndexOutOfBounds decoding with CoderUtils & Kryo
*/
private def boundedLengthGen: Gen[Int] = Gen.chooseNum(0, 39)
private val genString: Gen[String] = Gen.oneOf(
Gen.oneOf(" ", "", "foo"),
Arbitrary.arbString.arbitrary
)
private def genStringable(
javaClass: String
)(implicit stringableGens: Map[Class[_], Gen[_]]): Gen[Any] = {
val clazz = Class.forName(javaClass)
stringableGens.get(clazz) match {
case Some(gen) => gen
case None =>
val ctor = clazz.getDeclaredConstructor(classOf[String])
ctor.setAccessible(true)
genString.map { str =>
try {
ctor.newInstance(str)
} catch {
case e: Throwable =>
logger.error(
"Failed constructing instance of {} from random string. " +
"Consider providing a custom generator in stringableGens",
clazz.getName
)
throw e
}
}
}
}