88
99package org .opensearch .common .cache .stats ;
1010
11- import org .opensearch .common .io .stream .BytesStreamOutput ;
12- import org .opensearch .core .common .bytes .BytesReference ;
13- import org .opensearch .core .common .io .stream .BytesStreamInput ;
1411import org .opensearch .test .OpenSearchTestCase ;
1512
16- import java .util .ArrayList ;
1713import java .util .List ;
1814import java .util .Map ;
1915
2016public class MultiDimensionCacheStatsTests extends OpenSearchTestCase {
21- public void testSerialization () throws Exception {
22- List <String > dimensionNames = List .of ("dim1" , "dim2" , "dim3" );
17+
18+ public void testGet () throws Exception {
19+ List <String > dimensionNames = List .of ("dim1" , "dim2" , "dim3" , "dim4" );
2320 StatsHolder statsHolder = new StatsHolder (dimensionNames );
2421 Map <String , List <String >> usedDimensionValues = StatsHolderTests .getUsedDimensionValues (statsHolder , 10 );
25- StatsHolderTests .populateStats (statsHolder , usedDimensionValues , 100 , 10 );
22+ Map < List < String >, CacheStatsCounter > expected = StatsHolderTests .populateStats (statsHolder , usedDimensionValues , 1000 , 10 );
2623 MultiDimensionCacheStats stats = (MultiDimensionCacheStats ) statsHolder .getCacheStats ();
2724
28- BytesStreamOutput os = new BytesStreamOutput ();
29- stats .writeTo (os );
30- BytesStreamInput is = new BytesStreamInput (BytesReference .toBytes (os .bytes ()));
31- MultiDimensionCacheStats deserialized = new MultiDimensionCacheStats (is );
25+ // test the value in the map is as expected for each distinct combination of values
26+ for (List <String > dimensionValues : expected .keySet ()) {
27+ CacheStatsCounter expectedCounter = expected .get (dimensionValues );
28+
29+ CacheStatsCounterSnapshot actualStatsHolder = StatsHolderTests .getNode (dimensionValues , statsHolder .getStatsRoot ())
30+ .getStatsSnapshot ();
31+ CacheStatsCounterSnapshot actualCacheStats = getNode (dimensionValues , stats .getStatsRoot ()).getStats ();
32+
33+ assertEquals (expectedCounter .snapshot (), actualStatsHolder );
34+ assertEquals (expectedCounter .snapshot (), actualCacheStats );
35+ }
3236
33- assertEquals (stats .dimensionNames , deserialized .dimensionNames );
34- List <List <String >> pathsInOriginal = new ArrayList <>();
35- getAllPathsInTree (stats .getStatsRoot (), new ArrayList <>(), pathsInOriginal );
36- for (List <String > path : pathsInOriginal ) {
37- MultiDimensionCacheStats .MDCSDimensionNode originalNode = getNode (path , stats .statsRoot );
38- MultiDimensionCacheStats .MDCSDimensionNode deserializedNode = getNode (path , deserialized .statsRoot );
39- assertNotNull (deserializedNode );
40- assertEquals (originalNode .getDimensionValue (), deserializedNode .getDimensionValue ());
41- assertEquals (originalNode .getStats (), deserializedNode .getStats ());
37+ // test gets for total (this also checks sum-of-children logic)
38+ CacheStatsCounter expectedTotal = new CacheStatsCounter ();
39+ for (List <String > dims : expected .keySet ()) {
40+ expectedTotal .add (expected .get (dims ));
4241 }
42+ assertEquals (expectedTotal .snapshot (), stats .getTotalStats ());
43+
44+ assertEquals (expectedTotal .getHits (), stats .getTotalHits ());
45+ assertEquals (expectedTotal .getMisses (), stats .getTotalMisses ());
46+ assertEquals (expectedTotal .getEvictions (), stats .getTotalEvictions ());
47+ assertEquals (expectedTotal .getSizeInBytes (), stats .getTotalSizeInBytes ());
48+ assertEquals (expectedTotal .getEntries (), stats .getTotalEntries ());
49+
50+ assertSumOfChildrenStats (stats .getStatsRoot ());
4351 }
4452
4553 public void testEmptyDimsList () throws Exception {
@@ -54,22 +62,6 @@ public void testEmptyDimsList() throws Exception {
5462 assertEquals (stats .getTotalStats (), statsRoot .getStats ());
5563 }
5664
57- private void getAllPathsInTree (
58- MultiDimensionCacheStats .MDCSDimensionNode currentNode ,
59- List <String > pathToCurrentNode ,
60- List <List <String >> allPaths
61- ) {
62- allPaths .add (pathToCurrentNode );
63- if (currentNode .getChildren () != null && !currentNode .getChildren ().isEmpty ()) {
64- // not a leaf node
65- for (MultiDimensionCacheStats .MDCSDimensionNode child : currentNode .getChildren ().values ()) {
66- List <String > pathToChild = new ArrayList <>(pathToCurrentNode );
67- pathToChild .add (child .getDimensionValue ());
68- getAllPathsInTree (child , pathToChild , allPaths );
69- }
70- }
71- }
72-
7365 private MultiDimensionCacheStats .MDCSDimensionNode getNode (
7466 List <String > dimensionValues ,
7567 MultiDimensionCacheStats .MDCSDimensionNode root
@@ -83,4 +75,17 @@ private MultiDimensionCacheStats.MDCSDimensionNode getNode(
8375 }
8476 return current ;
8577 }
78+
79+ private void assertSumOfChildrenStats (MultiDimensionCacheStats .MDCSDimensionNode current ) {
80+ if (!current .children .isEmpty ()) {
81+ CacheStatsCounter expectedTotal = new CacheStatsCounter ();
82+ for (MultiDimensionCacheStats .MDCSDimensionNode child : current .children .values ()) {
83+ expectedTotal .add (child .getStats ());
84+ }
85+ assertEquals (expectedTotal .snapshot (), current .getStats ());
86+ for (MultiDimensionCacheStats .MDCSDimensionNode child : current .children .values ()) {
87+ assertSumOfChildrenStats (child );
88+ }
89+ }
90+ }
8691}
0 commit comments