o
    1Xxi!p                      @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlm Z m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z/m0Z0 d dl1m2Z2m3Z4 d dl5m6Z6 g dZ7e8ddZ9e9e7vre:de9 de7 dej;j<ddej=j>ej=j?ej=j@gd ej;j<dej;Addd ej;j<dej;Addd ej;j<dej;Adddd ej;Be9 d e"d!dfd"d#ZC			ddeej; deej; deej; d!eej; fd$d%ZDe8d&d'kZEd(ZFd!ejGfd)d*ZHdd+d,ZId!eJfd-d.ZK	/										/dd0eJd1eLd2eeM d3eeM d4eeM d5eeM d6eeM d7eeM d8eeM d9eeM d:eeM d;eeL d!dfd<d=ZNdd e!d>eJd!dfd?d@ZO	/	A											/dd1eLdBeMd3eeM dCeeM d4eeM d5eeM dDeeM d6eeM d7eeM d8eeM d9eeM d:eeM d;eeL d!ee%ddf fdEdFZPd!ee%ddf fdGdHZQd!ee%ddf fdIdJZRd!ee%ddf fdKdLZSd!ee%ddf fdMdNZTd!ee%ddf fdOdPZUd!ee%ddf fdQdRZVd!ee%ddf fdSdTZWd!ee%ddf fdUdVZXd!ee%ddf fdWdXZYd!ee%ddf fdYdZZZd!ee%ddf fd[d\Z[d!ee%ddf fd]d^Z\d!ee%ddf fd_d`Z]d!e
eg ee%ddf f  fdadbZ^d!e
eg ee%ddf f  fdcddZ_d!e
eg ee%ddf f  fdedfZ`d!e
eg ee%ddf f  fdgdhZad!e
eg ee%ddf f  fdidjZbd!e
eg ee%ddf f  fdkdlZcejddmeb dndoejed!ee!ddf fdpdqZfejddme` dndoejed!ee!ddf fdrdsZgejddme^ dndoejed!ee!ddf fdtduZhejddmec dndoejed!ee!ddf fdvdwZiejddme_ dndoejed!ee!ddf fdxdyZje6G dzd{ d{e4Zke6G d|d} d}e2Zlejdd~ddue%d!ee!ddf fdd ZmG dd dZnejdd~ddue%d!eenddf fddZoejdd~ddue%d!ee ddf fddZpejdd~ddwe%d!ee ddf fddZqejdd~ddqe%d!ee!ddf fddZrejdd~ddse%d!ee!ddf fddZsejdd~ddye%d!ee!ddf fddZtG dd deZude)dede	e, deJd!eee, ee+ f f
ddZvde)dede	e, deJd!eee, ee+ f f
ddZwd!e
eu fddZxejddmex dndoejed!eeuddf fddZydd ZzdS )    N)	Any	GeneratorIteratorListOptionalSequenceTupleCallablecast)UUID)ConnectError)Protocol)AsyncFastAPI)FastAPI)	ClientAPI	ServerAPIBaseAPI)SettingsSystem)embeddings_queue)Producer)SeqIdOperationRecord)ClientAdminClient)AsyncAdminClientAsyncClient)async_class_to_syncfastnormalslowPROPERTY_TESTING_PRESETr   z!Invalid property testing preset: z. Must be one of .baseiȯ  )deadlinesuppress_health_check2   )max_examplesr    d   r!   i  )r(   stateful_step_countapireturnc                 C   s   |    d S N)reset)r+    r/   U/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/chromadb/test/conftest.pyr.   L   s   r.   c                    sd   g d | ||d}| t}|dur* fdd|j D }tjtjjfi |S ttjtjjS )a%  Override Hypothesis settings for specific profiles.

    For example, to override max_examples only when the current profile is 'fast':

    override_hypothesis_profile(
        fast=hypothesis.settings(max_examples=50),
    )

    Settings will be merged with the default/active profile.
    )r%   r(   r*   r&   r   Nc                    s   i | ]\}}| v r||qS r/   r/   ).0keyvalueallowable_override_keysr/   r0   
<dictcomp>p   s
    z/override_hypothesis_profile.<locals>.<dictcomp>)getCURRENT_PRESET__dict__items
hypothesissettingsdefaultr
   )r   r    r!   override_profilesoverriding_profileoverridden_settingsr/   r4   r0   override_hypothesis_profileP   s   

rA   CHROMA_CLUSTER_TEST_ONLY1x   c                   C   s   t jjtddS )Nz5Requires Kubernetes to be running with a valid config)reason)pytestmarkskipifNOT_CLUSTER_ONLYr/   r/   r/   r0   skip_if_not_cluster   s   rJ   c                  C   st   t jt jt jtd} td|   t j| s#td|  t	
dddddd	d
dddddddd| g d S )Nzopenssl.cnfzConfig path: zConfig file not found at opensslreqz-x509z-newkeyzrsa:4096z-keyoutzserverkey.pemz-outzservercert.pemz-days365z-nodesz-subjz/CN=localhostz-config)ospathjoindirnameabspath__file__printexistsFileNotFoundError
subprocessrun)config_pathr/   r/   r0    generate_self_signed_certificate   s2   rZ   c                  C   s\   t  t jt j} | d | t jt jd |  d W  d    S 1 s'w   Y  d S )N) r      )socketAF_INETSOCK_STREAMbind
setsockopt
SOL_SOCKETSO_REUSEADDRgetsockname)sr/   r/   r0   find_free_port   s
   

$rf   Fportis_persistentpersist_directorychroma_server_authn_provider$chroma_server_authn_credentials_filechroma_server_authn_credentials"chroma_auth_token_transport_headerchroma_server_authz_providerchroma_server_authz_config_filechroma_server_ssl_certfilechroma_server_ssl_keyfile;chroma_overwrite_singleton_tenant_database_access_from_authc                 C   s   |r|rt ddddd||d|||||||d}nt ddddddd|||||||d}tjj|}tj| d| d	d
|
|	d dS )zRun a Chroma server locallychromadb.api.segment.SegmentAPI chromadb.db.impl.sqlite.SqliteDB7chromadb.segment.impl.manager.local.LocalSegmentManagerT)chroma_api_implchroma_sysdb_implchroma_producer_implchroma_consumer_implchroma_segment_manager_implrh   ri   allow_resetrj   rk   rl   rm   rn   ro   rr   F)rv   rw   rx   ry   rz   rh   r{   rj   rk   rl   rm   rn   ro   rr   z0.0.0.0error   )hostrg   	log_leveltimeout_keep_alivessl_keyfilessl_certfileN)r   chromadbserverfastapir   uvicornrX   app)rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   r<   r   r/   r/   r0   _run_server   sX   
r   attemptsc              
   C   sZ   z|    W d S  ty, } z|dkr|td t| |d  W Y d }~d S d }~ww )N      r\   )	heartbeatr   timesleep_await_server)r+   r   er/   r/   r0   r      s   
r   chromadb.api.fastapi.FastAPIrv   chroma_client_auth_providerchroma_client_auth_credentialsc                 #   s    t  tddd|||||	|f}dtdttddf f fdd}| rot }| |j|||||	|f}||E dH  z|	  W dS  t
tfyn } ztjdkran|W Y d}~dS d}~ww ||E dH  dS )	zmFixture generator that launches a server in a separate process, and yields a
    fastapi client connect to itspawnFNargsr,   c                 3   s    j t| dd}|  t ddrdndd
}t|}|t}|  tt|t	r4|nt
| |V  |  |  |  d S )NT)targetr   daemon	localhostF)
rv   chroma_server_hostchroma_server_http_portr{   r   r   rm   chroma_server_ssl_verifychroma_server_ssl_enabledrr   )Processr   startr   r   instancer   r   
isinstancer   r   stopkillrP   )r   procr<   systemr+   rv   rm   r   r   rr   rp   ctxrg   r/   r0   rX   #  s.   

z_fastapi_fixture.<locals>.runnt)rf   multiprocessingget_contextr   r   r   tempfileTemporaryDirectorynamecleanupPermissionErrorNotADirectoryErrorrN   )rh   rv   rj   r   rk   rl   r   rm   rn   ro   rp   rq   rr   r   rX   ri   r   r/   r   r0   _fastapi_fixture   sX   
.
r   c                   C   
   t ddS )NFrh   r   r/   r/   r/   r0   r   ^     
r   c                   C   s   t dddS )NF'chromadb.api.async_fastapi.AsyncFastAPI)rh   rv   r   r/   r/   r/   r0   async_fastapib  s   r   c                   C   r   )NTr   r   r/   r/   r/   r0   fastapi_persistenti  r   r   c                   C   s   t   tddddS )NFz./servercert.pemz./serverkey.pem)rh   rp   rq   )rZ   r   r/   r/   r/   r0   fastapi_sslm  s   r   c                  c   sF    t ddddd} t| }|t}t| |  |V  |  d S )Nr   i@  r   T)rv   r   r   r{   )r   r   r   r   r   r   r   )r<   r   r+   r/   r/   r0   basic_http_clientv  s   
r   c                  c   j    t jdddd"} | d |   tdd| jddd	D ]}|V  qW d    d S 1 s.w   Y  d S )
Nw	.htpasswdFsuffixdeleteCadmin:$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS
;chromadb.auth.basic_authn.BasicAuthenticationServerProvider1chromadb.auth.basic_authn.BasicAuthClientProvideradmin:adminrh   rj   rk   r   r   r   NamedTemporaryFilewritecloser   r   fitemr/   r/   r0   0fastapi_server_basic_auth_valid_cred_single_user  s   

"r   c                  c   s    dddd} t jdddd1}|  D ]\}}|| d	| d
 q|  tdd|jdddD ]}|V  q2W d    d S 1 sCw   Y  d S )Nz<$2y$10$kY9hn.Wlfcj7n1Cnjmy1kuIhEFIVBsfbNWLQ5ahoKmdc2HLA4oP6iz<$2y$10$CymQ63tic/DRj8dD82915eoM4ke3d6RaNKU4dj4IVJlHyea0yeGDSz<$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS)useruser2adminr   r   Fr   :
r   r   r   r   )r   r   r:   r   r   r   r   )credsr   r   credr   r/   r/   r0   3fastapi_server_basic_auth_valid_cred_multiple_users  s&   
"r   c                  c   r   )
Nr   r   Fr   r   r   r   zadmin:admin1r   r   r   r/   r/   r0   &fastapi_server_basic_auth_invalid_cred  s   

"r   c                  c   s    t jddddN} | d |   t jdddd$}|d |  tddd	d
| jd|jdD ]}|V  q2W d    n1 sBw   Y  W d    d S W d    d S 1 sZw   Y  d S )Nr   r   Fr   r   z.authzaL  
roles_mapping:
    admin:
        actions:
            [
                "system:reset",
                "tenant:create_tenant",
                "tenant:get_tenant",
                "db:create_database",
                "db:get_database",
                "db:list_collections",
                "db:create_collection",
                "db:get_or_create_collection",
                "collection:get_collection",
                "collection:delete_collection",
                "collection:update_collection",
                "collection:add",
                "collection:delete",
                "collection:get",
                "collection:query",
                "collection:peek",
                "collection:update",
                "collection:upsert",
                "collection:count",
            ]
users:
- id: admin
  role: admin
    r   r   r   z?chromadb.auth.simple_rbac_authz.SimpleRBACAuthorizationProvider)rh   r   r   rj   rk   rn   ro   r   )server_authn_fileserver_authz_filer   r/   r/   r0   %fastapi_server_basic_authn_rbac_authz  s@   
	"r   c               	   c   sl    t jdddd#} | d |   tddddd	| jd
D ]}|V  qW d    d S 1 s/w   Y  d S )Nr   z.authnFr   z
users:
  - id: admin
    tokens:
      - admin-token
  - id: singleton_user
    tenant: singleton_tenant
    databases:
      - singleton_database
    tokens:
      - singleton-token
Tz1chromadb.auth.token_authn.TokenAuthClientProviderzadmin-tokenz;chromadb.auth.token_authn.TokenAuthenticationServerProvider)rh   rr   r   r   rj   rk   r   r   r/   r/   r0   2fastapi_fixture_admin_and_singleton_tenant_db_user  s"   
"r   c                  c   s.    t dd} t| }|  |V  |  dS )zFixture generator for returning a client configured via environmenet
    variables, intended for externally configured integration tests
    T)r{   Nr   r   r   r   r<   r   r/   r/   r0   integration  s   
r   c               	   c   s:    t dddddddd} t| }|  |V  |  dS )z>Fixture generator for segment-based API using in-memory Sqliters   rt   ru   FT)rv   rw   rx   ry   rz   rh   r{   Nr   r   r/   r/   r0   sqlite!  s   	r   c               
   c   s    t  } tddddddd| jd}t|}|  |V  |  z|   W dS  tt	fyE } zt
jdkr8n|W Y d}~dS d}~ww )z?Fixture generator for segment-based API using persistent Sqliters   rt   ru   T)rv   rw   rx   ry   rz   r{   rh   ri   r   N)r   r   r   r   r   r   r   r   r   r   rN   )	save_pathr<   r   r   r/   r/   r0   sqlite_persistent2  s2   

r   c                  C   sF   t ttttg} dtjv r| t dtjv rtg} dtjv r!t	g} | S )NCHROMA_INTEGRATION_TESTCHROMA_INTEGRATION_TEST_ONLYrB   )
r   r   r   r   r   rN   environappendr   r   fixturesr/   r/   r0   system_fixturesQ  s   



r   c                  C   s   t tg} | S r-   )r   r   r   r/   r/   r0   system_fixtures_auth\  s   r   c                  C   
   t g} | S r-   )r   r   r/   r/   r0    system_fixtures_authn_rbac_authzd     r   c                  C   r   r-   )r   r   r/   r/   r0   1system_fixtures_root_and_singleton_tenant_db_userk  r   r   c                  C   r   r-   )r   r   r/   r/   r0   system_fixtures_wrong_authr     r   c                  C   r   r-   )r   r   r/   r/   r0   system_fixtures_sslw  r   r   module)scopeparamsrequestc                 c       |   E d H  d S r-   paramr   r/   r/   r0   system_wrong_auth|     r   c                 c   r   r-   r   r   r/   r/   r0   system_authn_rbac_authz  r   r   c                 c   r   r-   r   r   r/   r/   r0   r        r   c                 c   r   r-   r   r   r/   r/   r0   
system_ssl  r   r   c                 c   r   r-   r   r   r/   r/   r0   system_auth  r   r   c                   @      e Zd ZdS )AsyncClientCreatorSyncN__name__
__module____qualname__r/   r/   r/   r0   r         r   c                   @   r   )AsyncAdminClientSyncNr   r/   r/   r/   r0   r    r  r  function)r   c                 c   s:    |    | t}t|trt|}|V  d S |V  d S r-   )reset_stater   r   r   r   r   )r   r+   transformedr/   r/   r0   r+     s   



c                   @   sr   e Zd ZU dZeed< g Zee ed< defddZ	de
de
d	efd
dZde
de
d	efddZd	efddZdS )ClientFactorieszThis allows consuming tests to be parameterized by async/sync versions of the client and papers over the async implementation.
    If you don't need to manually construct clients, use the `client` fixture instead.
    _system_created_clientsr   c                 C   s
   || _ d S r-   )r	  )selfr   r/   r/   r0   __init__  r   zClientFactories.__init__r   kwargsr,   c                 O   sl   | dd u r| jj|d< | jjjdkr'tttj|i |}| j	| |S t|i |}| j	| |S )Nr<   r   )
r7   r	  r<   rv   r
   ClientCreatorr   creater
  r   )r  r   r  clientr/   r/   r0   create_client  s   zClientFactories.create_clientc                 O   s0   | j jjdkrttt|i |S t|i |S Nr   )r	  r<   rv   r
   r   r  )r  r   r  r/   r/   r0   create_admin_client  s
   z#ClientFactories.create_admin_clientc                 C   s,   | j jjdkrttt| j S t| j S r  )r	  r<   rv   r
   r   r  from_system)r  r/   r/   r0   create_admin_client_from_system  s
   z/ClientFactories.create_admin_client_from_systemN)r   r  r  __doc__r   __annotations__r
  r   r   r  r   r  r  r   r  r  r/   r/   r/   r0   r    s   
 	r  c                 c   sP    |    t| }|V  t|jdkr&|j }|  ~t|jdksd S d S )Nr   )r  r  lenr
  popclear_system_cache)r   	factoriesr  r/   r/   r0   client_factories  s   
r  c                 c   sT    |    | jjdkrttt| }|V  |  d S t	| }|V  |  d S r  )
r  r<   rv   r
   r   r   from_system_asyncr  r  r  )r   r  r/   r/   r0   r    s   
r  c                 c   s&    |    t| }|V  |  d S r-   )r  r  r  r  )r   r  r/   r/   r0   
client_ssl  s
   
r  c                 c       |    | t}|V  d S r-   r  r   r   )r   r+   r/   r/   r0   api_wrong_cred     

r!  c                 c   r  r-   r   )r   r+   r/   r/   r0   api_with_authn_rbac_authz
  r"  r#  c                 c   s"    | }|   |t}|V  d S r-   r   )r   _sysr+   r/   r/   r0   api_with_server_auth  s
   

r%  c                   @   s>   e Zd Zdededee dedee	e e	e
 f f
ddZdS )	
ProducerFnproducercollection_id
embeddingsnr,   c                 C   s   d S r-   r/   )r  r'  r(  r)  r*  r/   r/   r0   __call__  s   zProducerFn.__call__N)r   r  r  r   r   r   r   intr   r   r   r+  r/   r/   r/   r0   r&    s    r&  r'  r(  r)  r*  c           	      C   sF   g }g }t |D ]}t|}| ||}|| || q||fS r-   )rangenextsubmit_embeddingr   )	r'  r(  r)  r*  submitted_embeddingsseq_ids_r   seq_idr/   r/   r0   produce_n_single)  s   
r4  c                 C   s<   g }g }t |D ]}t|}|| q| ||}||fS r-   )r-  r.  r   submit_embeddings)r'  r(  r)  r*  r0  r1  r2  r   r/   r/   r0   produce_n_batch9  s   r6  c                   C   s   t tgS r-   )r4  r6  r/   r/   r/   r0   produce_fn_fixturesH  s   r7  c                 c   s    | j V  d S r-   r   r   r/   r/   r0   produce_fnsL  s   r8  c                 C   s
   dt _d S )NT)r   _called_from_test)configr/   r/   r0   pytest_configureS  r   r;  )NNN)r,   N)FNNNNNNNNNF)r   )Fr   NNNNNNNNNNF){r   rN   r]   rW   r   r   typingr   r   r   r   r   r   r   r	   r
   uuidr   r;   rF   r   httpxr   typing_extensionsr   chromadb.api.async_fastapir   chromadb.api.fastapir   chromadb.server.fastapir   chromadb.apir   r   r   chromadb.configr   r   chromadb.db.mixinsr   chromadb.ingestr   chromadb.typesr   r   chromadb.api.clientr   r  r   chromadb.api.async_clientr   r   AsyncClientCreatorchromadb.utils.async_to_syncr   VALID_PRESETSgetenvr8   
ValueErrorr<   register_profileHealthCheckdata_too_largelarge_base_examplefunction_scoped_fixtureget_profileload_profiler.   rA   rI   COMPACTION_SLEEPMarkDecoratorrJ   rZ   r,  rf   boolstrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   fixtureFixtureRequestr   r   r   r   r   r   r  r+   r  r  r  r  r!  r#  r%  r&  r4  r6  r7  r8  r;  r/   r/   r/   r0   <module>   s   ,


+
		

>	

k	
9
$$

$$   

/







