Skip to content

Commit fe466d6

Browse files
committed
add tests
1 parent 52acb94 commit fe466d6

File tree

5 files changed

+29
-5
lines changed

5 files changed

+29
-5
lines changed

avro4s-core/src/main/scala/com/sksamuel/avro4s/AvroInputStream.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.io.{ByteArrayInputStream, File, InputStream}
44
import java.nio.ByteBuffer
55
import java.nio.file.{Files, Path, Paths}
66

7+
import com.sksamuel.avro4s.avroutils.ByteBufferHelper
78
import org.apache.avro.Schema
89

910
import scala.util.Try
@@ -55,7 +56,8 @@ class AvroInputStreamBuilder[T: Decoder](format: AvroFormat) {
5556
def from(file: File): AvroInputStreamBuilderWithSource[T] = from(file.toPath)
5657
def from(in: InputStream): AvroInputStreamBuilderWithSource[T] = new AvroInputStreamBuilderWithSource(format, in)
5758
def from(bytes: Array[Byte]): AvroInputStreamBuilderWithSource[T] = from(new ByteArrayInputStream(bytes))
58-
def from(buffer: ByteBuffer): AvroInputStreamBuilderWithSource[T] = from(new ByteArrayInputStream(buffer.array))
59+
def from(buffer: ByteBuffer): AvroInputStreamBuilderWithSource[T] = from(
60+
new ByteArrayInputStream(ByteBufferHelper.asArray(buffer)))
5961
}
6062

6163

avro4s-core/src/main/scala/com/sksamuel/avro4s/decoders/bytes.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sksamuel.avro4s.decoders
22

3+
import com.sksamuel.avro4s.avroutils.ByteBufferHelper
34
import com.sksamuel.avro4s.{Avro4sDecodingException, Decoder}
45
import org.apache.avro.Schema
56

@@ -18,7 +19,7 @@ trait ByteDecoders:
1819
object ArrayByteDecoder extends Decoder[Array[Byte]] :
1920
override def decode(schema: Schema): Any => Array[Byte] = { value =>
2021
value match {
21-
case buffer: ByteBuffer => buffer.array
22+
case buffer: ByteBuffer => ByteBufferHelper.asArray(buffer)
2223
case array: Array[Byte] => array
2324
case fixed: org.apache.avro.generic.GenericFixed => fixed.bytes
2425
case _ => throw new Avro4sDecodingException(s"ArrayByteDecoder cannot decode '$value'", value)

avro4s-core/src/main/scala/com/sksamuel/avro4s/encoders/strings.scala

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.sksamuel.avro4s.encoders
22

3-
import com.sksamuel.avro4s.{Avro4sConfigurationException, Avro4sEncodingException, Encoder, FieldMapper}
4-
import org.apache.avro.Conversions.UUIDConversion
5-
import org.apache.avro.{Conversions, LogicalTypes, Schema}
3+
import com.sksamuel.avro4s.avroutils.ByteBufferHelper
4+
import com.sksamuel.avro4s.{Avro4sConfigurationException, Avro4sEncodingException, Encoder}
5+
import org.apache.avro.Schema
66
import org.apache.avro.generic.GenericData
77
import org.apache.avro.util.Utf8
88

@@ -50,3 +50,8 @@ object FixedStringEncoder extends Encoder[String] :
5050
if (bytes.length > schema.getFixedSize)
5151
throw new Avro4sEncodingException(s"Cannot write string with ${bytes.length} bytes to fixed type of size ${schema.getFixedSize}")
5252
GenericData.get.createFixed(null, ByteBuffer.allocate(schema.getFixedSize).put(bytes).array, schema).asInstanceOf[GenericData.Fixed]
53+
val bytes = string.getBytes(StandardCharsets.UTF_8)
54+
if (bytes.length > schema.getFixedSize)
55+
throw new Avro4sEncodingException(s"Cannot write string with ${bytes.length} bytes to fixed type of size ${schema.getFixedSize}")
56+
GenericData.get.createFixed(null,
57+
ByteBufferHelper.asArray(ByteBuffer.allocate(schema.getFixedSize).put(bytes)), schema).asInstanceOf[GenericData.Fixed]

avro4s-core/src/test/scala/com/sksamuel/avro4s/record/decoder/ByteArrayDecoderTest.scala

+7
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ class ByteArrayDecoderTest extends AnyFunSuite with Matchers {
4444
Decoder[VectorTest].decode(schema).apply(record).z shouldBe Vector[Byte](1, 4, 9)
4545
}
4646

47+
test("decode read-only ByteBuffer to Vector[Byte]") {
48+
val schema = AvroSchema[VectorTest]
49+
val record = new GenericData.Record(schema)
50+
record.put("z", ByteBuffer.wrap(Array[Byte](1, 4, 9)).asReadOnlyBuffer())
51+
Decoder[VectorTest].decode(schema).apply(record).z shouldBe Vector[Byte](1, 4, 9)
52+
}
53+
4754
test("decode Array[Byte] to List[Byte]") {
4855
val schema = AvroSchema[ListTest]
4956
val record = new GenericData.Record(schema)

avro4s-core/src/test/scala/com/sksamuel/avro4s/record/encoder/ByteArrayEncoderTest.scala

+9
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ class ByteArrayEncoderTest extends AnyFunSuite with Matchers {
9090
fixed.bytes().length shouldBe 7
9191
}
9292

93+
test("encode byte buffers as FIXED (ReadOnlyBuffer)") {
94+
val schema = SchemaBuilder.fixed("foo").size(7)
95+
val fixed = Encoder[ByteBuffer]
96+
.encode(schema)
97+
.apply(ByteBuffer.wrap("hello".getBytes).asReadOnlyBuffer())
98+
.asInstanceOf[GenericFixed]
99+
fixed.bytes().toList shouldBe Seq(104, 101, 108, 108, 111, 0, 0)
100+
fixed.bytes().length shouldBe 7
101+
}
93102

94103
test("encode top level byte arrays") {
95104
val encoder = Encoder[Array[Byte]]

0 commit comments

Comments
 (0)