@@ -2,6 +2,8 @@ package dao
22
33import (
44 "context"
5+ "fmt"
6+ "github.com/gomodule/redigo/redis"
57 "github.com/itering/subscan/model"
68 "github.com/itering/subscan/util"
79 "github.com/shopspring/decimal"
@@ -40,3 +42,79 @@ func TestDao_ExtrinsicsAsJson(t *testing.T) {
4042 extrinsics := testDao .GetExtrinsicsByHash (ctx , "0x368f61800f8645f67d59baf0602b236ff47952097dcaef3aa026b50ddc8dcea0" )
4143 assert .Equal (t , `[{"name":"dest","type":"Address","value":"563d11af91b3a166d07110bb49e84094f38364ef39c43a26066ca123a8b9532b"},{"name":"value","type":"Compact\u003cBalance\u003e","value":"1000000000000000000"}]` , util .ToString (testDao .ExtrinsicsAsJson (extrinsics ).Params ))
4244}
45+
46+ func TestDao_GetExtrinsicCountUsesHistoricalCacheButLatestDB (t * testing.T ) {
47+ ctx := context .TODO ()
48+ seedLatestExtrinsicFixtures (t )
49+
50+ err := testDao .SaveFillAlreadyBlockNum (ctx , int (model .SplitTableBlockNum + 1 ))
51+ assert .NoError (t , err )
52+
53+ conn , _ := testDao .redis .Redis ().GetContext (ctx )
54+ defer conn .Close ()
55+
56+ historyAllKey := testDao .extrinsicCountCacheKey (0 )
57+ historySignedKey := testDao .extrinsicCountCacheKey (0 , model .Where ("is_signed = ?" , true ))
58+ latestAllKey := testDao .extrinsicCountCacheKey (1 )
59+ latestSignedKey := testDao .extrinsicCountCacheKey (1 , model .Where ("is_signed = ?" , true ))
60+
61+ _ , err = conn .Do ("SET" , historyAllKey , 100 )
62+ assert .NoError (t , err )
63+ _ , err = conn .Do ("SET" , historySignedKey , 7 )
64+ assert .NoError (t , err )
65+ _ , err = conn .Do ("SET" , latestAllKey , 200 )
66+ assert .NoError (t , err )
67+ _ , err = conn .Do ("SET" , latestSignedKey , 300 )
68+ assert .NoError (t , err )
69+
70+ assert .EqualValues (t , 101 , testDao .GetExtrinsicCount (ctx ))
71+ assert .EqualValues (t , 8 , testDao .GetExtrinsicCount (ctx , model .Where ("is_signed = ?" , true )))
72+ }
73+
74+ func TestDao_GetExtrinsicCountBackfillsHistoricalCacheWithJitteredTTL (t * testing.T ) {
75+ ctx := context .TODO ()
76+ seedLatestExtrinsicFixtures (t )
77+
78+ err := testDao .SaveFillAlreadyBlockNum (ctx , int (model .SplitTableBlockNum + 1 ))
79+ assert .NoError (t , err )
80+
81+ conn , _ := testDao .redis .Redis ().GetContext (ctx )
82+ defer conn .Close ()
83+
84+ historyAllKey := testDao .extrinsicCountCacheKey (0 )
85+ _ , err = conn .Do ("DEL" , historyAllKey )
86+ assert .NoError (t , err )
87+
88+ assert .EqualValues (t , 3 , testDao .GetExtrinsicCount (ctx ))
89+
90+ cachedCount , err := redis .Int64 (conn .Do ("GET" , historyAllKey ))
91+ assert .NoError (t , err )
92+ assert .EqualValues (t , 2 , cachedCount )
93+
94+ ttl , err := redis .Int (conn .Do ("TTL" , historyAllKey ))
95+ assert .NoError (t , err )
96+ assert .GreaterOrEqual (t , ttl , extrinsicCountCacheTTL - 1 )
97+ assert .LessOrEqual (t , ttl , extrinsicCountCacheTTL + extrinsicCountCacheTTLJitter )
98+ }
99+
100+ func seedLatestExtrinsicFixtures (t * testing.T ) {
101+ t .Helper ()
102+
103+ testDao .AddIndex (model .SplitTableBlockNum )
104+
105+ ctx := context .TODO ()
106+ txn := testDao .DbBegin ()
107+ err := testDao .CreateExtrinsic (ctx , txn , []model.ChainExtrinsic {{
108+ ID : model .SplitTableBlockNum * model .IdGenerateCoefficient + 1 ,
109+ ExtrinsicIndex : fmt .Sprintf ("%d-1" , model .SplitTableBlockNum + 1 ),
110+ BlockNum : model .SplitTableBlockNum + 1 ,
111+ BlockTimestamp : 1594791901 ,
112+ CallModuleFunction : "remark" ,
113+ CallModule : "system" ,
114+ Success : true ,
115+ ExtrinsicHash : "0xsplit-table-extrinsic" ,
116+ IsSigned : true ,
117+ }}, 1 )
118+ assert .NoError (t , err )
119+ assert .NoError (t , txn .Commit ().Error )
120+ }
0 commit comments