@@ -2,151 +2,68 @@ package com.apollographql.apollo.benchmark
2
2
3
3
import androidx.benchmark.junit4.BenchmarkRule
4
4
import androidx.benchmark.junit4.measureRepeated
5
- import com.apollographql.apollo.api.CustomScalarAdapters
6
5
import com.apollographql.apollo.api.Query
7
6
import com.apollographql.apollo.api.json.jsonReader
8
7
import com.apollographql.apollo.api.parseJsonResponse
9
- import com.apollographql.apollo.benchmark.Utils.checkOperationBased
10
- import com.apollographql.apollo.benchmark.Utils.checkResponseBased
8
+ import com.apollographql.apollo.benchmark.Utils.dbFile
9
+ import com.apollographql.apollo.benchmark.Utils.dbName
11
10
import com.apollographql.apollo.benchmark.Utils.operationBasedQuery
12
11
import com.apollographql.apollo.benchmark.Utils.registerCacheSize
13
12
import com.apollographql.apollo.benchmark.Utils.resource
14
13
import com.apollographql.apollo.benchmark.Utils.responseBasedQuery
15
14
import com.apollographql.apollo.benchmark.test.R
16
- import com.apollographql.cache.normalized.api.CacheHeaders
17
- import com.apollographql.cache.normalized.api.DefaultRecordMerger
18
- import com.apollographql.cache.normalized.api.FieldPolicyCacheResolver
15
+ import com.apollographql.cache.normalized.ApolloStore
19
16
import com.apollographql.cache.normalized.memory.MemoryCacheFactory
20
- import com.apollographql.cache.normalized.api.TypePolicyCacheKeyGenerator
21
- import com.apollographql.cache.normalized.api.normalize
22
- import com.apollographql.cache.normalized.api.readDataFromCache
23
17
import com.apollographql.cache.normalized.sql.SqlNormalizedCacheFactory
24
18
import kotlinx.coroutines.runBlocking
25
- import org.junit.Assert
26
19
import org.junit.Rule
27
20
import org.junit.Test
28
- import java.util.concurrent.Executors
29
21
30
22
class CacheIncubatingTests {
31
23
@get:Rule
32
24
val benchmarkRule = BenchmarkRule ()
33
25
34
26
@Test
35
27
fun cacheOperationMemory () {
36
- readFromCache(" cacheOperationMemory" , operationBasedQuery, sql = false , ::checkOperationBased)
28
+ readFromCache(" cacheOperationMemory" , operationBasedQuery, sql = false , Utils ::checkOperationBased)
37
29
}
38
30
39
31
@Test
40
32
fun cacheOperationSql () {
41
- readFromCache(" cacheOperationSql" , operationBasedQuery, sql = true , ::checkOperationBased)
33
+ readFromCache(" cacheOperationSql" , operationBasedQuery, sql = true , Utils ::checkOperationBased)
42
34
}
43
35
44
36
@Test
45
37
fun cacheResponseMemory () {
46
- readFromCache(" cacheResponseMemory" , responseBasedQuery, sql = false , ::checkResponseBased)
38
+ readFromCache(" cacheResponseMemory" , responseBasedQuery, sql = false , Utils ::checkResponseBased)
47
39
}
48
40
49
41
@Test
50
42
fun cacheResponseSql () {
51
- readFromCache(" cacheResponseSql" , responseBasedQuery, sql = true , ::checkResponseBased)
43
+ readFromCache(" cacheResponseSql" , responseBasedQuery, sql = true , Utils ::checkResponseBased)
52
44
}
53
45
54
- @Test
55
- fun concurrentCacheOperationMemory () {
56
- concurrentReadWriteFromCache(operationBasedQuery, sql = false )
57
- }
58
-
59
- @Test
60
- fun concurrentCacheOperationSql () {
61
- concurrentReadWriteFromCache(operationBasedQuery, sql = true )
62
- }
63
-
64
- @Test
65
- fun concurrentCacheResponseMemory () {
66
- concurrentReadWriteFromCache(responseBasedQuery, sql = false )
67
- }
68
-
69
- @Test
70
- fun concurrentCacheResponseSql () {
71
- concurrentReadWriteFromCache(responseBasedQuery, sql = true )
72
- }
73
-
74
-
75
46
private fun <D : Query .Data > readFromCache (testName : String , query : Query <D >, sql : Boolean , check : (D ) -> Unit ) {
76
- val cache = if (sql) {
77
- Utils .dbFile.delete()
78
- SqlNormalizedCacheFactory (name = Utils .dbName).create()
79
- } else {
80
- MemoryCacheFactory ().create()
81
- }
82
- val data = query.parseJsonResponse(resource(R .raw.calendar_response).jsonReader()).data!!
83
-
84
- val records = query.normalize(
85
- data,
86
- CustomScalarAdapters .Empty ,
87
- TypePolicyCacheKeyGenerator ,
47
+ val store = ApolloStore (
48
+ if (sql) {
49
+ dbFile.delete()
50
+ SqlNormalizedCacheFactory (name = dbName)
51
+ } else {
52
+ MemoryCacheFactory ()
53
+ }
88
54
)
89
55
56
+ val data = query.parseJsonResponse(resource(R .raw.calendar_response).jsonReader()).data!!
90
57
runBlocking {
91
- cache.merge(records.values.toList(), CacheHeaders . NONE , DefaultRecordMerger )
58
+ store.writeOperation(query, data )
92
59
}
93
60
94
61
if (sql) {
95
- registerCacheSize(" CacheIncubatingTests" , testName, Utils . dbFile.length())
62
+ registerCacheSize(" CacheIncubatingTests" , testName, dbFile.length())
96
63
}
97
64
benchmarkRule.measureRepeated {
98
- val data2 = query.readDataFromCache(
99
- CustomScalarAdapters .Empty ,
100
- cache,
101
- FieldPolicyCacheResolver ,
102
- CacheHeaders .NONE
103
- )
65
+ val data2 = store.readOperation(query).data!!
104
66
check(data2)
105
67
}
106
68
}
107
-
108
- private fun <D : Query .Data > concurrentReadWriteFromCache (query : Query <D >, sql : Boolean ) {
109
- val cache = if (sql) {
110
- Utils .dbFile.delete()
111
- SqlNormalizedCacheFactory (name = Utils .dbName).create()
112
- } else {
113
- MemoryCacheFactory ().create()
114
- }
115
- val data = query.parseJsonResponse(resource(R .raw.calendar_response_simple).jsonReader()).data!!
116
-
117
- val records = query.normalize(
118
- data,
119
- CustomScalarAdapters .Empty ,
120
- TypePolicyCacheKeyGenerator ,
121
- )
122
-
123
- val threadPool = Executors .newFixedThreadPool(CONCURRENCY )
124
- benchmarkRule.measureRepeated {
125
- val futures = (1 .. CONCURRENCY ).map {
126
- threadPool.submit {
127
- // Let each thread execute a few writes/reads
128
- repeat(WORK_LOAD ) {
129
- cache.merge(records.values.toList(), CacheHeaders .NONE , DefaultRecordMerger )
130
-
131
- val data2 = query.readDataFromCache(
132
- CustomScalarAdapters .Empty ,
133
- cache,
134
- FieldPolicyCacheResolver ,
135
- CacheHeaders .NONE
136
- )
137
-
138
- Assert .assertEquals(data, data2)
139
- }
140
- }
141
- }
142
- // Wait for all threads to finish
143
- futures.forEach { it.get() }
144
- }
145
- }
146
-
147
-
148
- companion object {
149
- private const val CONCURRENCY = 15
150
- private const val WORK_LOAD = 15
151
- }
152
69
}
0 commit comments