Skip to content

Commit 8c062f0

Browse files
[#95] CachedLazyAvroSchemaManager should not call getId when executing getSchema
1 parent 8ea1737 commit 8c062f0

File tree

4 files changed

+74
-6
lines changed

4 files changed

+74
-6
lines changed

core/src/main/scala/it/agilelab/darwin/manager/CachedLazyAvroSchemaManager.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class CachedLazyAvroSchemaManager(connector: Connector, endianness: ByteOrder)
1515
override def getSchema(id: Long): Option[Schema] = {
1616
cache.getSchema(id).orElse {
1717
val schema: Option[Schema] = connector.findSchema(id)
18-
schema.foreach(s => _cache.set(Some(cache.insert(Seq(getId(s) -> s)))))
18+
schema.foreach(s => _cache.set(Some(cache.insert(Seq(id -> s)))))
1919
schema
2020
}
2121
}

mock-application/src/test/scala/it/agilelab/darwin/app/mock/CachedEagerApplicationSuite.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,26 @@ abstract class CachedEagerApplicationSuite(val endianness: ByteOrder) extends An
8383
assert(manager.getSchema(newId).get == newSchema)
8484
}
8585

86+
it should "not call getId when retrieving a schema out of the cache" in {
87+
val oneFieldSchema = ReflectData.get().getSchema(classOf[OneField])
88+
var calls = 0
89+
val manager = new CachedEagerAvroSchemaManager(
90+
new Connector {
91+
override def createTable(): Unit = ()
92+
override def tableExists(): Boolean = true
93+
override def tableCreationHint(): String = ""
94+
override def fullLoad(): Seq[(Long, Schema)] = Seq.empty
95+
override def insert(schemas: Seq[(Long, Schema)]): Unit = ()
96+
override def findSchema(id: Long): Option[Schema] = Some(oneFieldSchema)
97+
},
98+
endianness
99+
) {
100+
override def getId(schema: Schema): Long = {
101+
calls += 1
102+
super.getId(schema)
103+
}
104+
}
105+
manager.getSchema(3L) shouldNot be(null) // scalastyle:ignore
106+
calls shouldBe 0
107+
}
86108
}

mock-application/src/test/scala/it/agilelab/darwin/app/mock/CachedLazyApplicationSuite.scala

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package it.agilelab.darwin.app.mock
22

3-
import java.lang.reflect.Modifier
4-
import java.nio.ByteOrder
5-
63
import com.typesafe.config.{ Config, ConfigFactory }
74
import it.agilelab.darwin.annotations.AvroSerde
85
import it.agilelab.darwin.app.mock.classes.{ MyClass, MyNestedClass, NewClass, OneField }
6+
import it.agilelab.darwin.common.compat._
97
import it.agilelab.darwin.common.{ Connector, ConnectorFactory, SchemaReader }
108
import it.agilelab.darwin.manager.{ AvroSchemaManager, CachedLazyAvroSchemaManager }
11-
import org.apache.avro.{ Schema, SchemaNormalization }
129
import org.apache.avro.reflect.ReflectData
10+
import org.apache.avro.{ Schema, SchemaNormalization }
1311
import org.reflections.Reflections
14-
import it.agilelab.darwin.common.compat._
1512
import org.scalatest.flatspec.AnyFlatSpec
1613
import org.scalatest.matchers.should.Matchers
1714

15+
import java.lang.reflect.Modifier
16+
import java.nio.ByteOrder
17+
1818
class BigEndianCachedLazyApplicationSuite extends CachedLazyApplicationSuite(ByteOrder.BIG_ENDIAN)
1919

2020
class LittleEndianCachedLazyApplicationSuite extends CachedLazyApplicationSuite(ByteOrder.LITTLE_ENDIAN)
@@ -80,4 +80,27 @@ abstract class CachedLazyApplicationSuite(val endianness: ByteOrder) extends Any
8080
assert(manager.getSchema(newId).isDefined)
8181
assert(manager.getSchema(newId).get == newSchema)
8282
}
83+
84+
it should "not call getId when retrieving a schema out of the cache" in {
85+
val oneFieldSchema = ReflectData.get().getSchema(classOf[OneField])
86+
var calls = 0
87+
val manager = new CachedLazyAvroSchemaManager(
88+
new Connector {
89+
override def createTable(): Unit = ()
90+
override def tableExists(): Boolean = true
91+
override def tableCreationHint(): String = ""
92+
override def fullLoad(): Seq[(Long, Schema)] = Seq.empty
93+
override def insert(schemas: Seq[(Long, Schema)]): Unit = ()
94+
override def findSchema(id: Long): Option[Schema] = Some(oneFieldSchema)
95+
},
96+
endianness
97+
) {
98+
override def getId(schema: Schema): Long = {
99+
calls += 1
100+
super.getId(schema)
101+
}
102+
}
103+
manager.getSchema(3L) shouldNot be(null) // scalastyle:ignore
104+
calls shouldBe 0
105+
}
83106
}

mock-application/src/test/scala/it/agilelab/darwin/app/mock/LazyApplicationSuite.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,27 @@ abstract class LazyApplicationSuite(endianness: ByteOrder) extends AnyFlatSpec w
7979
assert(manager.getSchema(newId).isDefined)
8080
assert(manager.getSchema(newId).get == newSchema)
8181
}
82+
83+
it should "not call getId when retrieving a schema out of the cache" in {
84+
val oneFieldSchema = ReflectData.get().getSchema(classOf[OneField])
85+
var calls = 0
86+
val manager = new LazyAvroSchemaManager(
87+
new Connector {
88+
override def createTable(): Unit = ()
89+
override def tableExists(): Boolean = true
90+
override def tableCreationHint(): String = ""
91+
override def fullLoad(): Seq[(Long, Schema)] = Seq.empty
92+
override def insert(schemas: Seq[(Long, Schema)]): Unit = ()
93+
override def findSchema(id: Long): Option[Schema] = Some(oneFieldSchema)
94+
},
95+
endianness
96+
) {
97+
override def getId(schema: Schema): Long = {
98+
calls += 1
99+
super.getId(schema)
100+
}
101+
}
102+
manager.getSchema(3L) shouldNot be(null) // scalastyle:ignore
103+
calls shouldBe 0
104+
}
82105
}

0 commit comments

Comments
 (0)