<s> import math <EOL> from kaylee . testsuite import load_tests <EOL> from kaylee . testsuite . helper import SubclassTestsBase <EOL> from kaylee . storage import TemporalStorage , PermanentStorage <EOL> from kaylee . contrib . storages import ( MemoryTemporalStorage , <EOL> MemoryPermanentStorage ) <EOL> from copy import deepcopy <EOL> from kaylee . node import NodeID <EOL> def _tgen ( i , prefix = '<STR_LIT:t>' ) : <EOL> return "<STR_LIT>" . format ( prefix , i ) <EOL> def _rgen ( i , prefix = '<STR_LIT:r>' ) : <EOL> return "<STR_LIT>" . format ( prefix , i ) <EOL> class TemporalStorageTestsBase ( SubclassTestsBase ) : <EOL> def setUp ( self ) : <EOL> super ( TemporalStorageTestsBase , self ) . setUp ( ) <EOL> def test_init ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> self . assertIsInstance ( ts , TemporalStorage ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> def test_add ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> node_id = NodeID ( ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> self . assertEqual ( ts [ '<STR_LIT>' ] , { node_id : '<STR_LIT>' } ) <EOL> ts = self . cls_instance ( ) <EOL> node_id = NodeID ( ) <EOL> self . _fill_storage ( ts , self . MANY , node_id = node_id ) <EOL> for i in range ( <NUM_LIT:0> , self . MANY ) : <EOL> tid = _tgen ( i ) <EOL> for nid , res in ts [ tid ] . items ( ) : <EOL> self . assertEqual ( nid , node_id ) <EOL> self . assertEqual ( res , _rgen ( i ) ) <EOL> def test_add_complex_result ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> test_res = { <EOL> '<STR_LIT>' : [ <NUM_LIT:1> , <NUM_LIT:2> , <NUM_LIT:3> ] , <EOL> '<STR_LIT>' : { ( <NUM_LIT:3> , <NUM_LIT:4> ) : ( <NUM_LIT:5> , <NUM_LIT:6> ) , '<STR_LIT:c>' : <NUM_LIT:10> } , <EOL> <NUM_LIT:1> : <NUM_LIT:100> , <EOL> <NUM_LIT:2> : { <EOL> <NUM_LIT:3> : '<STR_LIT:abc>' , <EOL> '<STR_LIT>' : [ <NUM_LIT:5> , <NUM_LIT:6> , <NUM_LIT:7> ] * <NUM_LIT:100> , <EOL> <NUM_LIT:0> : '<STR_LIT:c>' * <NUM_LIT> <EOL> } <EOL> } <EOL> ts . add ( '<STR_LIT:1>' , NodeID ( ) , deepcopy ( test_res ) ) <EOL> added_res = list ( ts [ '<STR_LIT:1>' ] . values ( ) ) [ <NUM_LIT:0> ] <EOL> self . assertEqual ( test_res , added_res ) <EOL> def test_overwrite ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> node_id = NodeID ( ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> self . assertEqual ( ts [ '<STR_LIT>' ] , { node_id : '<STR_LIT>' } ) <EOL> ts = self . cls_instance ( ) <EOL> rgen = '<STR_LIT>' . format <EOL> self . _fill_storage ( ts , self . SOME , node_id = node_id ) <EOL> self . _fill_storage ( ts , self . SOME , rgen_func = rgen , node_id = node_id ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> tid = _tgen ( i ) <EOL> for nid , res in ts [ tid ] . items ( ) : <EOL> self . assertEqual ( nid , node_id ) <EOL> self . assertEqual ( res , rgen ( i ) ) <EOL> def test_remove_and_del ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> node_id = NodeID ( ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> ts . remove ( '<STR_LIT>' ) <EOL> self . assertRaises ( KeyError , ts . __getitem__ , '<STR_LIT>' ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> self . assertRaises ( KeyError , ts . remove , '<STR_LIT>' , NodeID ( ) ) <EOL> self . assertRaises ( KeyError , ts . remove , '<STR_LIT>' ) <EOL> ts . remove ( '<STR_LIT>' , node_id ) <EOL> self . assertEqual ( list ( ts [ '<STR_LIT>' ] ) , [ ] ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:1> ) <EOL> ts . remove ( '<STR_LIT>' ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> self . assertRaises ( KeyError , ts . __getitem__ , '<STR_LIT>' ) <EOL> ts . add ( '<STR_LIT>' , node_id , '<STR_LIT>' ) <EOL> del ts [ '<STR_LIT>' ] <EOL> self . assertRaises ( KeyError , ts . __getitem__ , '<STR_LIT>' ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = node_id ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> tid_res = ts [ _tgen ( i ) ] <EOL> del ts [ _tgen ( i ) ] <EOL> self . assertRaises ( KeyError , ts . __getitem__ , list ( tid_res ) [ <NUM_LIT:0> ] ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> def test_clear ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> ts . clear ( ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> ts . clear ( ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = NodeID ( ) ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> ts . clear ( ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = NodeID ( ) ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> ts . remove ( _tgen ( i ) ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> ts . clear ( ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> def test_contains_and_in ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> tid = _tgen ( i ) <EOL> self . assertTrue ( ts . contains ( tid ) ) <EOL> self . assertIn ( tid , ts ) <EOL> self . assertFalse ( ts . contains ( '<STR_LIT>' ) ) <EOL> self . assertNotIn ( '<STR_LIT>' , ts ) <EOL> ts = self . cls_instance ( ) <EOL> node_id = NodeID ( ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = node_id ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> tid = _tgen ( i ) <EOL> self . assertTrue ( ts . contains ( tid , node_id ) ) <EOL> self . assertFalse ( ts . contains ( tid , NodeID ( ) ) ) <EOL> self . assertFalse ( ts . contains ( _tgen ( i + self . SOME ) , node_id ) ) <EOL> self . assertIn ( tid , ts ) <EOL> ts . clear ( ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> tid = _tgen ( i ) <EOL> self . assertFalse ( ts . contains ( tid ) ) <EOL> self . assertFalse ( ts . contains ( tid , node_id ) ) <EOL> self . assertNotIn ( tid , ts ) <EOL> def test_count_and_total_count ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> self . assertEqual ( ts . count , self . SOME ) <EOL> self . assertEqual ( ts . total_count , self . SOME ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . assertEqual ( len ( ts ) , self . SOME ) <EOL> self . assertEqual ( ts . count , self . SOME ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:3> * self . SOME ) <EOL> ts . remove ( '<STR_LIT>' ) <EOL> self . assertEqual ( len ( ts ) , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . count , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:3> * self . SOME - <NUM_LIT:3> ) <EOL> nid = NodeID ( ) <EOL> ts . add ( '<STR_LIT>' , nid , '<STR_LIT>' ) <EOL> self . assertEqual ( len ( ts ) , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . count , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:3> * self . SOME - <NUM_LIT:2> ) <EOL> ts . remove ( '<STR_LIT>' , nid ) <EOL> self . assertEqual ( len ( ts ) , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . count , self . SOME - <NUM_LIT:1> ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:3> * self . SOME - <NUM_LIT:3> ) <EOL> ts . add ( '<STR_LIT>' , NodeID ( ) , '<STR_LIT>' ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> ts . remove ( _tgen ( i ) ) <EOL> self . assertEqual ( len ( ts ) , <NUM_LIT:0> ) <EOL> self . assertEqual ( ts . count , <NUM_LIT:0> ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:0> ) <EOL> self . _fill_storage ( ts , self . MANY ) <EOL> self . _fill_storage ( ts , self . MANY ) <EOL> self . assertEqual ( len ( ts ) , self . MANY ) <EOL> self . assertEqual ( ts . count , self . MANY ) <EOL> self . assertEqual ( ts . total_count , <NUM_LIT:2> * self . MANY ) <EOL> nodes = set ( n for n , r in ts . values ( ) ) <EOL> self . assertEqual ( len ( nodes ) , <NUM_LIT:2> * self . MANY ) <EOL> def test_keys_and_iter ( self ) : <EOL> def _basic_ki_test ( ts , count ) : <EOL> test_task_ids = set ( _tgen ( i ) for i in range ( <NUM_LIT:0> , count ) ) <EOL> iter_task_ids = set ( tid for tid in iter ( ts ) ) <EOL> keys_task_ids = set ( tid for tid in ts . keys ( ) ) <EOL> self . assertEqual ( test_task_ids , iter_task_ids ) <EOL> self . assertEqual ( test_task_ids , keys_task_ids ) <EOL> self . assertEqual ( len ( iter_task_ids ) , len ( list ( iter ( ts ) ) ) ) <EOL> self . assertEqual ( len ( keys_task_ids ) , len ( list ( ts . keys ( ) ) ) ) <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> _basic_ki_test ( ts , self . SOME ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> _basic_ki_test ( ts , self . SOME ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> ts . remove ( _tgen ( i ) ) <EOL> _basic_ki_test ( ts , <NUM_LIT:0> ) <EOL> ts . clear ( ) <EOL> node_id = NodeID ( ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = node_id ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> ts . remove ( _tgen ( i ) , node_id ) <EOL> _basic_ki_test ( ts , self . SOME ) <EOL> def test_values ( self ) : <EOL> ts = self . cls_instance ( ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> self . assertEqual ( len ( list ( ts . values ( ) ) ) , self . SOME ) <EOL> test_results_set = set ( _rgen ( i ) for i in range ( <NUM_LIT:0> , self . SOME ) ) <EOL> for nr in ts . values ( ) : <EOL> self . assertIn ( nr [ <NUM_LIT:1> ] , test_results_set ) <EOL> self . assertEqual ( NodeID ( nr [ <NUM_LIT:0> ] ) . binary , nr [ <NUM_LIT:0> ] ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> for nr in ts . values ( ) : <EOL> self . assertIn ( nr [ <NUM_LIT:1> ] , test_results_set ) <EOL> self . assertEqual ( NodeID ( nr [ <NUM_LIT:0> ] ) . binary , nr [ <NUM_LIT:0> ] ) <EOL> self . assertEqual ( len ( list ( ts . values ( ) ) ) , <NUM_LIT:2> * self . SOME ) <EOL> ts . clear ( ) <EOL> self . assertEqual ( len ( list ( ts . values ( ) ) ) , <NUM_LIT:0> ) <EOL> node_id = NodeID ( ) <EOL> self . _fill_storage ( ts , self . SOME , node_id = node_id ) <EOL> for nr in ts . values ( ) : <EOL> self . assertIn ( nr [ <NUM_LIT:1> ] , test_results_set ) <EOL> self . assertEqual ( NodeID ( nr [ <NUM_LIT:0> ] ) . binary , node_id . binary ) <EOL> HALF_SOME = self . SOME // <NUM_LIT:2> <EOL> for i in range ( <NUM_LIT:0> , HALF_SOME ) : <EOL> ts . remove ( _tgen ( i ) ) <EOL> for nr in ts . values ( ) : <EOL> res = nr [ <NUM_LIT:1> ] <EOL> res_id = res . split ( '<STR_LIT:r>' ) [ <NUM_LIT:1> ] <EOL> self . assertGreaterEqual ( int ( res_id ) , HALF_SOME ) <EOL> self . _fill_storage ( ts , self . SOME ) <EOL> expected_count = self . SOME + math . ceil ( self . SOME / <NUM_LIT> ) <EOL> self . assertEqual ( len ( list ( ts . values ( ) ) ) , expected_count ) <EOL> @ staticmethod <EOL> def _fill_storage ( ts , count , tgen_func = _tgen , rgen_func = _rgen , <EOL> node_id = None ) : <EOL> if node_id is None : <EOL> _nodeid = NodeID <EOL> else : <EOL> _nodeid = lambda : node_id <EOL> for i in range ( <NUM_LIT:0> , count ) : <EOL> ts . add ( tgen_func ( i ) , _nodeid ( ) , rgen_func ( i ) ) <EOL> class PermanentStorageTestsBase ( SubclassTestsBase ) : <EOL> def setUp ( self ) : <EOL> super ( PermanentStorageTestsBase , self ) . setUp ( ) <EOL> def test_init ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . assertIsInstance ( ps , PermanentStorage ) <EOL> self . assertEqual ( len ( ps ) , <NUM_LIT:0> ) <EOL> def test_add ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> ps . add ( '<STR_LIT:1>' , '<STR_LIT>' ) <EOL> self . assertEqual ( ps [ '<STR_LIT:1>' ] , [ '<STR_LIT>' ] ) <EOL> self . assertEqual ( len ( ps ) , <NUM_LIT:1> ) <EOL> self . assertEqual ( list ( iter ( ps ) ) , [ '<STR_LIT:1>' ] ) <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . MANY ) <EOL> self . assertEqual ( len ( ps ) , self . MANY ) <EOL> for i in range ( <NUM_LIT:0> , self . MANY ) : <EOL> task_id = _tgen ( i ) <EOL> result = [ _rgen ( i ) ] <EOL> self . assertEqual ( ps [ task_id ] , result ) <EOL> def test_add_same_task_results ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> task_id = _tgen ( i ) <EOL> result = [ _rgen ( i ) ] * <NUM_LIT:3> <EOL> self . assertEqual ( ps [ task_id ] , result ) <EOL> def test_add_complex_result ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> res = { <EOL> '<STR_LIT>' : [ <NUM_LIT:1> , <NUM_LIT:2> , <NUM_LIT:3> ] , <EOL> '<STR_LIT>' : { ( <NUM_LIT:3> , <NUM_LIT:4> ) : ( <NUM_LIT:5> , <NUM_LIT:6> ) , '<STR_LIT:c>' : <NUM_LIT:10> } , <EOL> <NUM_LIT:1> : <NUM_LIT:100> , <EOL> <NUM_LIT:2> : { <EOL> <NUM_LIT:3> : '<STR_LIT:abc>' , <EOL> '<STR_LIT>' : [ <NUM_LIT:5> , <NUM_LIT:6> , <NUM_LIT:7> ] * <NUM_LIT:100> , <EOL> <NUM_LIT:0> : '<STR_LIT:c>' * <NUM_LIT> <EOL> } <EOL> } <EOL> ps . add ( '<STR_LIT:1>' , deepcopy ( res ) ) <EOL> self . assertEqual ( ps [ '<STR_LIT:1>' ] , [ res , ] ) <EOL> ps . add ( '<STR_LIT:1>' , deepcopy ( res ) ) <EOL> self . assertEqual ( ps [ '<STR_LIT:1>' ] , [ res , res ] ) <EOL> for i in range ( <NUM_LIT:0> , self . SOME ) : <EOL> ps . add ( _tgen ( i ) , deepcopy ( res ) ) <EOL> self . assertEqual ( ps [ _tgen ( i ) ] , [ res ] ) <EOL> def test_keys_iter ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> test_keys_set = set ( _tgen ( i ) for i in range ( <NUM_LIT:0> , self . SOME ) ) <EOL> ps_iter_keys_set = set ( iter ( ps ) ) <EOL> self . assertEqual ( len ( list ( iter ( ps ) ) ) , self . SOME ) <EOL> self . assertEqual ( test_keys_set , ps_iter_keys_set ) <EOL> self . assertEqual ( list ( iter ( ps ) ) , list ( ps . keys ( ) ) ) <EOL> def test_values_iter ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> test_values_list = [ [ _rgen ( i ) ] for i in range ( <NUM_LIT:0> , self . SOME ) ] <EOL> self . assertEqual ( sorted ( test_values_list ) , sorted ( list ( ps . values ( ) ) ) ) <EOL> def test_count_and_total_count ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> self . assertEqual ( ps . count , len ( ps ) ) <EOL> self . assertEqual ( ps . count , self . SOME ) <EOL> self . assertEqual ( ps . total_count , self . SOME ) <EOL> ps . add ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> self . assertEqual ( ps . count , self . SOME ) <EOL> self . assertEqual ( ps . total_count , self . SOME * <NUM_LIT:2> + <NUM_LIT:1> ) <EOL> def test_contains ( self ) : <EOL> ps = self . cls_instance ( ) <EOL> self . _fill_storage ( ps , self . SOME ) <EOL> self . assertTrue ( ps . contains ( '<STR_LIT>' ) ) <EOL> self . assertTrue ( ps . contains ( "<STR_LIT>" . format ( self . SOME - <NUM_LIT:1> ) ) ) <EOL> self . assertIn ( '<STR_LIT>' , ps ) <EOL> self . assertIn ( "<STR_LIT>" . format ( self . SOME - <NUM_LIT:1> ) , ps ) <EOL> self . assertIn ( "<STR_LIT>" . format ( self . SOME // <NUM_LIT:2> ) , ps ) <EOL> self . assertFalse ( ps . contains ( '<STR_LIT>' ) ) <EOL> self . assertNotIn ( '<STR_LIT>' , ps ) <EOL> self . assertTrue ( ps . contains ( '<STR_LIT>' , '<STR_LIT>' ) ) <EOL> self . assertTrue ( ps . contains ( "<STR_LIT>" . format ( self . SOME - <NUM_LIT:1> ) , <EOL> "<STR_LIT>" . format ( self . SOME - <NUM_LIT:1> ) ) ) <EOL> self . assertFalse ( ps . contains ( '<STR_LIT>' , '<STR_LIT>' ) ) <EOL> ps . add ( '<STR_LIT>' , '<STR_LIT:abc>' ) <EOL> self . assertTrue ( ps . contains ( '<STR_LIT>' , '<STR_LIT:abc>' ) ) <EOL> self . assertTrue ( ps . contains ( '<STR_LIT>' , '<STR_LIT>' ) ) <EOL> for i in range ( <NUM_LIT:0> , self . MANY ) : <EOL> res = "<STR_LIT>" . format ( '<STR_LIT:n>' , i ) <EOL> ps . add ( '<STR_LIT>' , res ) <EOL> self . assertTrue ( ps . contains ( '<STR_LIT>' , res ) ) <EOL> @ staticmethod <EOL> def _fill_storage ( ps , count , tgen_func = _tgen , rgen_func = _rgen ) : <EOL> for i in range ( <NUM_LIT:0> , count ) : <EOL> ps . add ( tgen_func ( i ) , rgen_func ( i ) ) <EOL> class MemoryPermanentStorageTests ( PermanentStorageTestsBase ) : <EOL> def test_is_abstract ( self ) : <EOL> self . assertRaises ( TypeError , PermanentStorage ) <EOL> def cls_instance ( self ) : <EOL> return MemoryPermanentStorage ( ) <EOL> class MemoryTemporalStorageTests ( TemporalStorageTestsBase ) : <EOL> def test_is_abstract ( self ) : <EOL> self . assertRaises ( TypeError , TemporalStorage ) <EOL> def cls_instance ( self ) : <EOL> return MemoryTemporalStorage ( ) <EOL> kaylee_suite = load_tests ( [ <EOL> MemoryTemporalStorageTests , <EOL> MemoryPermanentStorageTests <EOL> ] ) </s>
