
    i<                       d Z ddlmZ ddlZddlmc mZ ddl	Z	e	j                  j                  dd       ddlZddlZddlZddlmZmZmZmZ ddlmZ ddlmZmZ d Zd5d	Zd
 Zd6dZd6dZd7dZd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-e.dk(  rddl/Z/defde fd e!fd!e"fd"e#fd#e$fd$e%fd%e&fd&e'fd'e(fd(e)fd)e*fd*e+fd+e,fd,e-fgZ0dZ1 e2e0      Z3e0D ]  \  Z4Z5	  e5         e6d-e4        e1d.z  Z1  e6d1e1 d2e3 d3       e1e3k(  r	 e6d4       y e	jt                  d.       yy# e7$ r)Z8 e6d/e4 d0e8         e/jr                          Y dZ8[8zdZ8[8ww xY w)8u  
Tests for Story 6.02 (Track B): RedisMasterState — Versioned OCC State Store

Black Box tests (BB): verify the public contract from the outside —
    get_snapshot return types, commit_patch success/conflict, initialize_state.
White Box tests (WB): verify internal mechanics — new_version increment,
    JSON storage format, WatchError → conflict, patch application, JSON decode.

Story: 6.02
File under test: core/coherence/redis_master_state.py

ALL tests use mocks — NO real Redis connection is made.
    )annotationsNz/mnt/e/genesis-system)	AsyncMock	MagicMockpatchPropertyMock)
WatchError)RedisMasterStateCommitResultc                H    t        j                         j                  |       S )z<Run a coroutine synchronously (pytest-asyncio not required).)asyncioget_event_looprun_until_complete)coros    6/mnt/e/genesis-system/tests/track_b/test_story_6_02.pyrunr   (   s    !!#66t<<    c                R    t        j                  | |dd      j                         S )z0Encode state the same way RedisMasterState does.versiondata),:)
separators)jsondumpsencoder   s     r   _encoder   1   s!    ::'48ZPWWYYr   c                    t               } t        d      | _        t        d      | _        t               }t               |_        t        d      |_        t               |_        t               |_        t               |_        t        dg      |_        t               }t        |      |_        t        d      |_	        t        |      | _
        || _        | S )z
    Return a mock redis client where get() returns None (fresh session).
    pipeline() returns an async context manager with watch/multi/execute support.
    Nreturn_valueTF)r   r   getsetwatchunwatchmultiexecute
__aenter__	__aexit__pipeline_pipe)
mock_redispipepipeline_cms      r   _make_redis_freshr.   6   s    
 J D1JN D1JN ;DDJd+DH;DLDJ{DH4&1DL +K&D9K%59K#=JJr   c                   t               }t        | |      }t        |      |_        t        d      |_        t               }t               |_        t        |      |_        t               |_        t               |_        t               |_        t        dg      |_        t               }t        |      |_	        t        d      |_
        t        |      |_        ||_        |S )zS
    Return a mock redis client that already has state (version, data) stored.
    r   NTFr   r   r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r   r   r+   encodedr,   r-   s         r   _make_redis_with_stater3   V   s     Jgt$GG4JND1JN;DDJg.DH;DLDJ{DH4&1DL+K&D9K%59K#=JJr   c                   t               }t        | |      }t        |      |_        t        d      |_        t               }t               |_        t        |      |_        t               |_        t               |_        t               |_        t        t                     |_	        t               }t        |      |_
        t        d      |_        t        |      |_        ||_        |S )zZ
    Return a mock redis client where execute() raises WatchError (concurrent write).
    r   T)side_effectF)r   r   r   r!   r"   r#   r$   r%   r   r&   r'   r(   r)   r*   r1   s         r   _make_redis_with_watch_errorr6   q   s     Jgt$GG4JND1JN;DDJg.DH;DLDJ{DH6DL+K&D9K%59K#=JJr   c                   t               }t        | |      }t        |      |_        t        d      |_        t               }t               |_        t        |      |_        t               |_        t               |_        t               |_        t        dg      |_        t               }t        |      |_	        t        d      |_
        t        |      |_        ||_        |S )zX
    Return a mock redis client where stored version differs from caller's version.
    r   TFr0   )stored_versionr   r+   r2   r,   r-   s         r   _make_redis_with_wrong_versionr9      s     Jnd+GG4JND1JN;DDJg.DH;DLDJ{DH4&1DL+K&D9K%59K#=JJr   c                     t               } t        |       }t        |j                  d            \  }}d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d	x}}i }||k(  }|st	        j
                  d|fd||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d	x}}y	)u4   BB1: Fresh session → get_snapshot returns (0, {}).z
sess-freshr   ==z%(py0)s == %(py3)sr   py0py3assert %(py5)spy5Nr   )r.   r	   r   get_snapshot
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r+   rmsr   r   @py_assert2@py_assert1@py_format4@py_format6s           r   6test_bb1_get_snapshot_fresh_session_returns_zero_emptyrQ      s    "$J
:
&C((67MGT7a<7a77a42:42442r   c                 b   t               } t        |       }ddddg}t        |j                  dd|            }t	        |t
              }|sdd	t        j                         v st        j                  t              rt        j                  t              nd	d
t        j                         v st        j                  |      rt        j                  |      nd
dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }t        t        j                  |            d}|j                  }d}||u }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|j                   }d}||u }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)ue   BB2: commit_patch with correct version → CommitResult(success=True, new_version=1, conflict=False).addz/statusactiveoppathvaluesess-abcr   r   r   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultr
   r?   py1py2py4NTisz/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sr?   r`   rB   assert %(py7)spy7   r;   z3%(py2)s
{%(py2)s = %(py0)s.new_version
} == %(py5)sFz0%(py2)s
{%(py2)s = %(py0)s.conflict
} is %(py5)s)r.   r	   r   commit_patchr\   r
   rF   rG   rD   rH   rI   rJ   rK   successrE   new_versionconflict)
r+   rL   	patch_opsr]   @py_assert3@py_format5rN   @py_assert4rP   @py_format8s
             r   5test_bb2_commit_patch_correct_version_returns_successrt      s   "$J
:
&Cy8DEI!!*ay!IJFfl++++++++:+++:++++++f+++f++++++l+++l++++++++++>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!""""""""""""6"""6"""""""""""""??#e#?e####?e######6###6###?###e#######r   c                 V   t               } t        |       }t        |j                  dddd            }t	        |t
              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      d	z  }t        t        j                  |            d
}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}|j                   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}x}}y
)uT   BB3: initialize_state → CommitResult(success=True, new_version=1, conflict=False).zsess-newgenesisT)agentreadyr[   r\   r]   r
   r^   Nrb   rd   re   rf   rg   rh   r;   ri   Frj   )r.   r	   r   initialize_stater\   r
   rF   rG   rD   rH   rI   rJ   rK   rl   rE   rm   rn   )	r+   rL   r]   rp   rq   rN   rr   rP   rs   s	            r   *test_bb3_initialize_state_sets_version_onerz      s   "$J
:
&C%%jIPT2UVWFfl++++++++:+++:++++++f+++f++++++l+++l++++++++++>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!""""""""""""6"""6"""""""""""""??#e#?e####?e######6###6###?###e#######r   c                    t        dddi      } t        |       }t        |j                  ddg             }|j                  }d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d	|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uT   BB4: commit_patch with wrong version → CommitResult(success=False, conflict=True).   xrh   )r8   r   rY      rZ   Frb   rd   r]   re   rf   rg   NTrj   )r9   r	   r   rk   rl   rD   rE   rF   rG   rH   rI   rJ   rK   rn   r+   rL   r]   rN   rr   rp   rP   rs   s           r   4test_bb4_commit_patch_wrong_version_returns_conflictr      s    0qQxPJ
:
&C!!*ar!BCF>>"U">U"""">U""""""6"""6""">"""U"""""""??"d"?d""""?d""""""6"""6"""?"""d"""""""r   c                 b   ddd} t        d|       }t        |      }t        |j                  d            \  }}d}||k(  }|st	        j
                  d|fd||f      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |      d
z  }dd|iz  }t        t	        j                  |            dx}}|| k(  }|st	        j
                  d|fd|| f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |       rt	        j                  |       nddz  }	dd|	iz  }
t        t	        j                  |
            d}y)zFBB5: get_snapshot on existing session returns correct (version, data).rv      )rw   tasks   r   zsess-existingr;   r=   r   r>   rA   rB   N)z%(py0)s == %(py2)sr   existing_datar?   r`   assert %(py4)sra   )r3   r	   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )r   r+   rL   r   r   rM   rN   rO   rP   @py_format3rq   s              r   =test_bb5_get_snapshot_existing_state_returns_version_and_datar      s    '!4M'FJ
:
&C((9:MGT7a<7a77a=    4=      4   4      =   =       r   c                 @   t        dddi      } t        d      | _        t        |       }t	        |j                  ddd	i            }|j                  }d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                   }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u]   BB6: initialize_state when key already exists → CommitResult(success=False, conflict=True).rh   existingTr   Nr   zsess-existsnewr   Frb   rd   r]   re   rf   rg   rj   r   r;   ri   )r3   r   r"   r	   r   ry   rl   rD   rE   rF   rG   rH   rI   rJ   rK   rn   rm   r   s           r   5test_bb6_initialize_state_key_exists_returns_conflictr      s   'T8JKJD1JN
:
&C%%meV_EFF>>"U">U"""">U""""""6"""6""">"""U"""""""??"d"?d""""?d""""""6"""6"""?"""d"""""""""""""""""""6"""6"""""""""""""r   c                    t        dddi      } t        |       }t        |j                  ddg             }|j                  }d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z8WB1: new_version = version + 1 exactly (not +2, not +0).r   count*   r   zsess-wb1rZ      r;   ri   r]   re   rf   rg   N)r3   r	   r   rk   rm   rD   rE   rF   rG   rH   rI   rJ   rK   r   s           r   0test_wb1_new_version_is_version_plus_one_exactlyr      s     ("FJ
:
&C!!*ar!BCF""""""""""""6"""6"""""""""""""r   c                 h   t               } t        |       }ddddg}t        |j                  dd|             | j                  }|j
                  j                  }d}||u}|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}|d   d   }	t!        j"                  |	      }
d}||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }t        j                  d|
       dz   d|iz  }t        t        j                  |            dx}}d}||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }t        j                  d|
       dz   d|iz  }t        t        j                  |            dx}}|
d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|
d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z9WB2: State stored as JSON with 'version' and 'data' keys.rS   z/keyvalrU   zsess-wb2r   rZ   N)is not)z%(py0)s is not %(py3)sset_call_argsr>   zpipe.set was not called
>assert %(py5)srB   rh   r   )in)z%(py1)s in %(py3)sparsedr_   r@   z('version' key missing from stored JSON: r   z%'data' key missing from stored JSON: r;   z%(py1)s == %(py4)sr_   ra   zassert %(py6)spy6key)r.   r	   r   rk   r*   r"   	call_argsrD   rE   rF   rG   rH   rI   _format_assertmsgrJ   rK   r   loads)r+   rL   ro   r,   r   rM   rN   rO   rP   stored_jsonr   @py_assert0rp   rq   @py_format7s                  r   8test_wb2_state_stored_as_json_with_version_and_data_keysr      sX   "$J
:
&Cv>?IQi@A DHH&&M $?=$???=??????=???=??????&???????"1%KZZ$FS9SSS9SSS9SSSSSSSSSSSSS"J6( SSSSSSSM6VMMM6VMMM6MMMMMMVMMMVMMMMDVHMMMMMMM)!!!!!!!!!!!!!!!!!!!&>% )E) E)))) E))) )))E)))))))r   c                    t        dddi      } t        |       }t        |j                  ddg             }|j                  }d}||u }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)ub   WB3: WatchError raised by Redis pipeline.execute() → CommitResult(success=False, conflict=True).   kvr   zsess-wb3rZ   Frb   rd   r]   re   rf   rg   NTrj   r   r;   ri   )r6   r	   r   rk   rl   rD   rE   rF   rG   rH   rI   rJ   rK   rn   rm   r   s           r   3test_wb3_watch_error_from_pipeline_returns_conflictr     s   -asCjIJ
:
&C!!*ar!BCF>>"U">U"""">U""""""6"""6""">"""U"""""""??"d"?d""""?d""""""6"""6"""?"""d"""""""""""""""""""6"""6"""""""""""""r   c                 0   dddd} t        d|       }t        |      }dddd	d
ddd	dddg}t        |j                  dd|             |j                  }|j
                  j                  d   d   }t        j                  |      }|d   }|d   }d}	||	k(  }
|
st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}
}	|d   }d}	||	k(  }
|
st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}
}	d}||v}
|
st        j                  d|
fd ||f      t        j                  |      dt        j                          v st        j"                  |      rt        j                  |      ndd!z  }t        j                  d"|       d#z   d$|iz  }t        t        j                  |            dx}}
|d%   }d}	||	k(  }
|
st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }t        j                  d&|       dz   d|iz  }t        t        j                  |            dx}x}
}	y)'zOWB4: Patch operations (add, replace, remove) correctly transform the data dict.rh   r   r~   )abcr   rS   z/dr   rU   replacez/ac   removez/c)rV   rW   zsess-wb4rZ   r   r   dr;   r   r   z'add' op failed: z
>assert %(py6)sr   Nr   z'replace' op failed: r   )not in)z%(py1)s not in %(py3)sr   z'remove' op failed: r   rB   r   zuntouched key 'b' was changed: )r3   r	   r   rk   r*   r"   r   r   r   rD   rE   rI   r   rJ   rK   rF   rG   rH   )initial_datar+   rL   ro   r,   r   r   r   r   rp   rM   rq   r   rO   rP   s                  r   /test_wb4_patch_operations_correctly_modify_datar     s-   +L'EJ
:
&C $!4$"5$'I
 Qi@A D(($$Q'*KZZ$F&>D9669>66696669666666/v666666669::9?:::9:::9::::::3D6::::::::93d?9993d9993999999d999d999924&99999999DD9>DDD9DDD9DDDDDD=dVDDDDDDDDr   c                 ~   ddddd} t        j                  |       j                         }t               }t	        |      |_        t        |      }t        |j                  d            \  }}d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }dd|iz  }	t        t        j                   |	            dx}}ddd}||k(  }|st        j                  d|fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                   |	            dx}}y)zBWB5: get_snapshot correctly deserializes the JSON blob from Redis.   betar   )alphar   r   r   zsess-wb5r;   r=   r   r>   rA   rB   Nr   )r   r   r   r   r   r!   r	   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )
payloadr2   r+   rL   r   r   rM   rN   rO   rP   s
             r   1test_wb5_get_snapshot_deserializes_json_correctlyr   2  s   &DEGjj!((*GJG4JN
:
&C((45MGT7b=7b77b#b11411111411111114111411111111111r   c                    ddl m}  | t        u }|st        j                  d|fd| t        f      dt	        j
                         v st        j                  |       rt        j                  |       nddt	        j
                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
}y
)z?Package level: RedisMasterState importable from core.coherence.r   )r	   rb   z%(py0)s is %(py2)sRMSr	   r   r   ra   N)
core.coherencer	   rD   rE   rF   rG   rH   rI   rJ   rK   )r   rN   r   rq   s       r   'test_package_exports_redis_master_stater   F  sq    6"""""3"""""""3"""3""""""""""""""""""r   c                    ddl m}  | t        u }|st        j                  d|fd| t        f      dt	        j
                         v st        j                  |       rt        j                  |       nddt	        j
                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
}y
)z;Package level: CommitResult importable from core.coherence.r   )r
   rb   r   CRr
   r   r   ra   N)
r   r
   rD   rE   rF   rG   rH   rI   rJ   rK   )r   rN   r   rq   s       r   "test_package_exports_commit_resultr   L  sm    1222r   c                    t        ddd      } | j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}| j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}| j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)zACommitResult has expected fields: success, new_version, conflict.Tr|   F)rl   rm   rn   rb   rd   rre   rf   rg   Nr;   ri   rj   )r
   rl   rD   rE   rF   rG   rH   rI   rJ   rK   rm   rn   )r   rN   rr   rp   rP   rs   s         r   #test_commit_result_dataclass_fieldsr   R  sW   Tq5AA9999119==A=A=A11=A::::11:r   c                    t         j                  } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            dx} x}}y)	z-KEY_PREFIX is set to 'genesis:state:master:'.zgenesis:state:master:r;   )z2%(py2)s
{%(py2)s = %(py0)s.KEY_PREFIX
} == %(py5)sr	   re   rf   rg   N)
r	   
KEY_PREFIXrD   rE   rF   rG   rH   rI   rJ   rK   )rN   rr   rp   rP   rs   s        r   test_key_prefix_constantr   Z  sz    &&A*AA&*AAAAA&*AAAAAAAAAAAAA&AAA*AAAAAAAAr   __main__u3   BB1: Fresh session → get_snapshot returns (0, {})u-   BB2: commit_patch correct version → successu+   BB3: initialize_state → version=1 successu,   BB4: commit_patch wrong version → conflictu3   BB5: get_snapshot existing state → correct valuesu-   BB6: initialize_state key exists → conflictz&WB1: new_version = version + 1 exactlyz0WB2: State stored as JSON with version+data keysu!   WB3: WatchError → conflict=Truez+WB4: Patch operations modify data correctlyz-WB5: get_snapshot deserializes JSON correctlyz4PKG: RedisMasterState importable from core.coherencez0PKG: CommitResult importable from core.coherencezCommitResult dataclass fieldszKEY_PREFIX constant checkz	  [PASS] rh   z	  [FAIL] z: 
/z tests passedz(ALL TESTS PASSED -- Story 6.02 (Track B))r   intr   dictreturnbytes)r   r   r   r   )r8   r   r   r   );__doc__
__future__r   builtinsrF   _pytest.assertion.rewrite	assertionrewriterD   sysrW   insertr   pytestr   unittest.mockr   r   r   r   redis.exceptionsr   !core.coherence.redis_master_stater	   r
   r   r   r.   r3   r6   r9   rQ   rt   rz   r   r   r   r   r   r   r   r   r   r   r   r   __name__	tracebacktestspassedlentotalnamefnprint	Exceptionexc	print_excexit r   r   <module>r      s   #   
 * +    C C ' M=Z
@68@	$$#!	#"#*(#E22(#B z 
?@vw	8:op	68bc	79mn	>@}~	8:op	13cd	;=uv	,.ab	68gh	8:kl	?Ahi	;=_`	(*MN	$&>?E$ FJE "b	"DIdV$%aKF	" 
Bvhawm
,-89I 8  	"IdV2cU+,I!!	"s   *D44E"9EE"