-
Notifications
You must be signed in to change notification settings - Fork 123
/
GenericAvroCodecsSpecification.scala
135 lines (120 loc) · 6.33 KB
/
GenericAvroCodecsSpecification.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.twitter.bijection.avro
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import com.twitter.bijection.{Injection, BaseProperties}
import org.apache.avro.Schema
import avro.FiscalRecord
import org.apache.avro.generic.{GenericData, GenericRecord}
/**
* @author
* Muhammad Ashraf
* @since 7/6/13
*/
class GenericAvroCodecsSpecification extends AnyWordSpec with Matchers with BaseProperties {
val testSchema = new Schema.Parser().parse("""{
"type":"record",
"name":"FiscalRecord",
"namespace":"avro",
"fields":[
{
"name":"calendarDate",
"type":"string"
},
{
"name":"fiscalWeek",
"type":[
"int",
"null"
]
},
{
"name":"fiscalYear",
"type":[
"int",
"null"
]
}
]
}""")
"Generic Avro codec" should {
"Round trip generic record using Generic Injection" in {
implicit val genericInjection = GenericAvroCodecs[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Round trip generic record using Generic Injection with Bzip2 compression" in {
implicit val genericInjection =
GenericAvroCodecs.withBzip2Compression[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Round trip generic record using Generic Injection with Deflate compression (default compression level)" in {
implicit val genericInjection =
GenericAvroCodecs.withDeflateCompression[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Round trip generic record using Generic Injection with Deflate compression (custom compression level)" in {
implicit val genericInjection =
GenericAvroCodecs.withDeflateCompression[GenericRecord](testSchema, 9)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Cannot create Generic Injection with Deflate compression if compression level is set too low" in {
an[IllegalArgumentException] should be thrownBy GenericAvroCodecs
.withDeflateCompression[FiscalRecord](testSchema, 0)
}
"Cannot create Generic Injection with Deflate compression if compression level is set too high" in {
an[IllegalArgumentException] should be thrownBy GenericAvroCodecs
.withDeflateCompression[FiscalRecord](testSchema, 10)
}
"Round trip generic record using Generic Injection with Snappy compression" in {
implicit val genericInjection =
GenericAvroCodecs.withSnappyCompression[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Round trip generic record using Binary Injection" in {
implicit val genericBinaryInjection = GenericAvroCodecs.toBinary[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val bytes = Injection[GenericRecord, Array[Byte]](testRecord)
val attempt = Injection.invert[GenericRecord, Array[Byte]](bytes)
assert(attempt.get == testRecord)
}
"Round trip generic record using Json Injection" in {
implicit val genericJsonInjection = GenericAvroCodecs.toJson[GenericRecord](testSchema)
val testRecord = buildGenericAvroRecord(("2012-01-01", 1, 12))
val jsonString = Injection[GenericRecord, String](testRecord)
val attempt = Injection.invert[GenericRecord, String](jsonString)
assert(attempt.get == testRecord)
}
}
def buildGenericAvroRecord(i: (String, Int, Int)): GenericRecord = {
val fiscalRecord = new GenericData.Record(testSchema)
fiscalRecord.put("calendarDate", i._1)
fiscalRecord.put("fiscalWeek", i._2)
fiscalRecord.put("fiscalYear", i._3)
fiscalRecord
}
}