o
    gw                      @   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 d dl7Z7e78e9Z:g dZ;e<ddZ=e=e;vre>de= de; dej?j@ddejAjBejAjCejAjDgd ej?j@dej?Eddd ej?j@dej?Eddd ej?j@dej?Edddd ej?Fe= d e"d!dfd"d#ZG			ddeej? deej? deej? d!eej? fd$d%ZHe<d&d'kZId(ZJd!ejKfd)d*ZLdd+d,ZMd!eNfd-d.ZO	/										/dd0eNd1ePd2eeQ d3eeQ d4eeQ d5eeQ d6eeQ d7eeQ d8eeQ d9eeQ d:eeQ d;eeP d!dfd<d=ZRdd e!d>eNd!dfd?d@ZS	/	A											/dd1ePdBeQd3eeQ dCeeQ d4eeQ d5eeQ dDeeQ d6eeQ d7eeQ d8eeQ d9eeQ d:eeQ d;eeP d!ee%ddf fdEdFZTd!ee%ddf fdGdHZUd!ee%ddf fdIdJZVd!ee%ddf fdKdLZWd!ee%ddf fdMdNZXd!ee%ddf fdOdPZYd!ee%ddf fdQdRZZd!ee%ddf fdSdTZ[d!ee%ddf fdUdVZ\d!ee%ddf fdWdXZ]d!ee%ddf fdYdZZ^d!ee%ddf fd[d\Z_d!ee%ddf fd]d^Z`ejad!ee%ddf fd_d`Zbd!ee%ddf fdadbZcejad!ee%ddf fdcddZdd!e
eg ee%ddf f  fdedfZed!e
eg ee%ddf f  fdgdhZfd!e
eg ee%ddf f  fdidjZgd!e
eg ee%ddf f  fdkdlZhd!e
eg ee%ddf f  fdmdnZid!e
eg ee%ddf f  fdodpZjd!e
eg ee%ddf f  fdqdrZkejadsej dtduejld!ee!ddf fdvdwZmejadseh dtduejld!ee!ddf fdxdyZnejadsef dtduejld!ee!ddf fdzd{Zoejadsee dtduejld!ee!ddf fd|d}Zpejadsek dtduejld!ee!ddf fd~dZqejadseg dtduejld!ee!ddf fddZre6G dd de4Zse6G dd de2Ztejaddd}e%d!ee!ddf fdd ZuG dd dZvejaddd}e%d!eevddf fddZwejaddd}e%d!ee ddf fddZxejaddd{e%d!ee ddf fddZyejaddde%d!ee ddf fddZzejadddwe%d!ee!ddf fddZ{ejadddye%d!ee!ddf fddZ|ejaddde%d!ee!ddf fddZ}G dd deZ~de)dede	e, deNd!eee, ee+ f f
ddZde)dede	e, deNd!eee, ee+ f f
ddZd!e
e~ fddZejadse dtduejld!ee~ddf fddZdd Zde d!ePfddZejadddd Zd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/   M/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/test/conftest.pyr.   O   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>s   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_profileS   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   a     
r   c                   C   s   t dddS )NF'chromadb.api.async_fastapi.AsyncFastAPI)rh   rv   r   r/   r/   r/   r0   async_fastapie  s   r   c                   C   r   )NTr   r   r/   r/   r/   r0   fastapi_persistentl  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_sslp  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_clienty  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_fixture$  s   	r   c                   c       t  E d H  d S r-   )r   r/   r/   r/   r0   sqlite5     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_persistent_fixture:  s2   

r   c                   c   r   r-   )r   r/   r/   r/   r0   sqlite_persistentY  r   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_fixtures^  s   



r   c                  C   s   dd t  D } | S )Nc                 S   s    g | ]}|t kr|tkr|qS r/   )r   r   )r1   fixturer/   r/   r0   
<listcomp>p  s
    z/system_http_server_fixtures.<locals>.<listcomp>)r   r   r/   r/   r0   system_http_server_fixtureso  s   r   c                  C   s   t tg} | S r-   )r   r   r   r/   r/   r0   system_fixtures_authx  s   r   c                  C   
   t g} | S r-   )r   r   r/   r/   r0    system_fixtures_authn_rbac_authz     r   c                  C   r   r-   )r   r   r/   r/   r0   1system_fixtures_root_and_singleton_tenant_db_user  r   r   c                  C   r   r-   )r   r   r/   r/   r0   system_fixtures_wrong_auth     r   c                  C   r   r-   )r   r   r/   r/   r0   system_fixtures_ssl  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   system_http_server  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   T    |    | 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   r%  r  r&  )r  r  r/   r/   r0   http_client  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_cred5     

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_authG  s
   

r0  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  r2  r3  r4  r5  r/   r/   r0   __call__S  s   zProducerFn.__call__N)r  r	  r
  r   r   r   r   intr   r   r   r6  r/   r/   r/   r0   r1  R  s    r1  r2  r3  r4  r5  c           	      C   sF   g }g }t |D ]}t|}| ||}|| || q||fS r-   )rangenextsubmit_embeddingr   )	r2  r3  r4  r5  submitted_embeddingsseq_ids_r   seq_idr/   r/   r0   produce_n_single]  s   
r?  c                 C   s<   g }g }t |D ]}t|}|| q| ||}||fS r-   )r8  r9  r   submit_embeddings)r2  r3  r4  r5  r;  r<  r=  r   r/   r/   r0   produce_n_batchm  s   rA  c                   C   s   t tgS r-   )r?  rA  r/   r/   r/   r0   produce_fn_fixtures|  s   rB  c                 c   s    | j V  d S r-   r   r   r/   r/   r0   produce_fns  s   rC  c                 C   s
   dt _d S )NT)r   _called_from_test)configr/   r/   r0   pytest_configure  r   rF  c                 C   s   |   jdu S )ziReturns True if the client is in-process (a SQLite client), False if it's out-of-process (a HTTP client).N)get_settingsr   )r  r/   r/   r0   is_client_in_process  s   rH  T)autousec                 c   s4    | j j}td|  dV  td|  dS )z2Automatically logs the start and end of each test.zStarting test: NzFinished test: )noder   loggerdebug)r   	test_namer/   r/   r0   	log_tests  s
   rN  )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   logging	getLoggerr  rK  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   r7  rf   boolstrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   FixtureRequestr   r   r  r   r  r  r  r  r+   r  r$  r  r(  r)  r,  r.  r0  r1  r?  rA  rB  rC  rF  rH  rN  r/   r/   r/   r0   <module>   s   ,



+
		

>	

k	
9
$$$	

$$   

/









