pekko/akka-actor-tests/src/test/scala/akka/util/ByteStringInitializationSpec.scala

57 lines
1.8 KiB
Scala

/*
* Copyright (C) 2020 Lightbend Inc. <https://www.lightbend.com>
*/
package akka.util
import java.io.InputStream
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import scala.collection.mutable
import scala.collection.mutable.ArrayBuilder
class ByteStringInitializationSpec extends AnyWordSpec with Matchers {
"ByteString intialization" should {
"not get confused by initializing CompactByteString before ByteString" in {
// a classloader that creates a new universe of classes for everything beneath akka
// that prevents that this test interacts with any tests
val cleanCl = new ClassLoader(null) {
val outerCl = ByteStringInitializationSpec.this.getClass.getClassLoader
val buffer = new Array[Byte](1000000)
override def loadClass(name: String): Class[_] =
if (!name.startsWith("akka")) outerCl.loadClass(name)
else {
val classFile = name.replace(".", "/") + ".class"
val is = outerCl.getResourceAsStream(classFile)
val res = slurp(is, new mutable.ArrayBuilder.ofByte)
defineClass(name, res, 0, res.length)
}
def slurp(is: InputStream, res: ArrayBuilder[Byte]): Array[Byte] = {
val read = is.read(buffer)
if (read == 0) throw new IllegalStateException
else if (read > 0) slurp(is, res ++= buffer.take(read))
else res.result()
}
}
import scala.language.reflectiveCalls
type WithRun = { def run(): Unit }
cleanCl
.loadClass("akka.util.ByteStringInitTest")
.getDeclaredConstructor()
.newInstance()
.asInstanceOf[WithRun]
.run()
}
}
}
class ByteStringInitTest {
def run(): Unit = {
require(CompactByteString.empty ne null)
require(ByteString.empty ne null)
}
}