Files
dat-thang/tests/test_cable.c
T
divorce b735900f2e 0.0.002
ddat interop with dat js
cable interop with cabal js
ddat's frontend = dat-thang
cable fe = cable-thang
dillo support based on cel's dillo-dat
bootstrap node
xplatform support

Signed-off-by: divo <418@cryspace.space>
2026-10-19 00:17:02 -04:00

101 lines
5.5 KiB
C

#define _POSIX_C_SOURCE 200809L
#include "cable.h"
#include "sleep_crypto.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sodium.h>
int main(void)
{
uint8_t key[32], parsed[32], plain[900], sealed[1000], opened[900];
char address[160],identity_dir[]="/tmp/cable-test-XXXXXX",identity_path[256];size_t n,sealed_n,opened_n;enum cable_address_scheme scheme;
sleep_keypair_t alice,bob;cable_chat_message_t message,decoded;
assert(sleep_crypto_init()==0);
memset(key,0xa5,sizeof(key));
assert(cable_address_format(key,CABLE_ADDRESS_CABLE,address,sizeof(address))==0);
assert(!strncmp(address,"cable://",8));
assert(cable_address_parse(address,parsed,&scheme)==0&&scheme==CABLE_ADDRESS_CABLE);
assert(!memcmp(key,parsed,32));
assert(cable_address_parse("hyper://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",parsed,&scheme)==0);
assert(scheme==CABLE_ADDRESS_HYPER);
assert(cable_address_parse("dat://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",parsed,&scheme)<0);
{
cable_room_address_t room,parsed_room;
char room_text[160];
memset(&room,0,sizeof(room));memset(room.key,0x11,32);memset(room.admin_key,0x22,32);room.has_admin=1;
assert(cable_room_address_format(&room,CABLE_ADDRESS_CABAL,room_text,sizeof(room_text))==0);
assert(strstr(room_text,"?admin=")!=NULL);
assert(cable_room_address_parse(room_text,&parsed_room)==0);
assert(parsed_room.has_admin&&memcmp(room.key,parsed_room.key,32)==0&&memcmp(room.admin_key,parsed_room.admin_key,32)==0);
}
assert(mkdtemp(identity_dir)!=NULL);
assert(snprintf(identity_path,sizeof(identity_path),"%s/user-feed.key",identity_dir)>0);
{
sleep_keypair_t first,second;struct stat info;
assert(cable_user_identity_load_or_create(identity_path,&first)==0);
assert(stat(identity_path,&info)==0&&(info.st_mode&077)==0);
assert(cable_user_address_format(first.pubkey,CABLE_ADDRESS_CABLE,address,sizeof(address))==0);
assert(cable_user_identity_load_or_create(identity_path,&second)==0);
assert(memcmp(first.pubkey,second.pubkey,32)==0&&memcmp(first.seckey,second.seckey,64)==0);
sodium_memzero(&first,sizeof(first));sodium_memzero(&second,sizeof(second));
}
assert(unlink(identity_path)==0);assert(rmdir(identity_dir)==0);
{
uint8_t room_a[32]={1},room_b[32]={2};char home[]="/tmp/cable-home-XXXXXX";
char path_a[512],path_b[512],dir_a[512],dir_b[512],feed_dir[520],rooms[512],base[512];
sleep_keypair_t a1,a2,b;
sleep_feed_t feed;
uint8_t user_key[32],*block=NULL;
size_t block_length=0;
assert(mkdtemp(home)!=NULL);
assert(cable_user_identity_path(home,room_a,path_a,sizeof(path_a))==0);
assert(cable_user_identity_path(home,room_b,path_b,sizeof(path_b))==0);
assert(strcmp(path_a,path_b)!=0);
assert(cable_user_identity_load_or_create(path_a,&a1)==0);
assert(cable_user_identity_load_or_create(path_a,&a2)==0);
assert(cable_user_identity_load_or_create(path_b,&b)==0);
assert(memcmp(a1.pubkey,a2.pubkey,32)==0&&memcmp(a1.pubkey,b.pubkey,32)!=0);
assert(cable_user_feed_publish(home,room_a,"about","cable-test-user",NULL,NULL,user_key)==0);
assert(!memcmp(user_key,a1.pubkey,sizeof(user_key)));
assert(cable_user_feed_publish(home,room_a,"chat/text",NULL,"test-channel",
"Cabal-shaped message",user_key)==0);
assert(cable_user_feed_open(home,room_a,&a2,&feed)==0);
assert(sleep_feed_length(&feed)==2);
assert(sleep_feed_read(&feed,1,&block,&block_length)==0);
assert(strstr((const char *)block,"\"type\":\"chat/text\"")!=NULL);
assert(strstr((const char *)block,"Cabal-shaped message")!=NULL);
free(block);block=NULL;sleep_feed_close(&feed);
strcpy(dir_a,path_a);*strrchr(dir_a,'/')='\0';strcpy(dir_b,path_b);*strrchr(dir_b,'/')='\0';
snprintf(feed_dir,sizeof(feed_dir),"%s/0",dir_a);
{
static const char *aliases[]={"feed.tree","feed.signatures","feed.bitfield","feed.data","feed.key","secret_key","localname"};
static const char *storage[]={"tree","signatures","bitfield","data","key"};
char file[600];size_t i;
for(i=0;i<sizeof(aliases)/sizeof(aliases[0]);i++){snprintf(file,sizeof(file),"%s/%s",feed_dir,aliases[i]);assert(unlink(file)==0);}
for(i=0;i<sizeof(storage)/sizeof(storage[0]);i++){snprintf(file,sizeof(file),"%s/%s",feed_dir,storage[i]);assert(unlink(file)==0);}
}
assert(rmdir(feed_dir)==0);
assert(unlink(path_a)==0&&unlink(path_b)==0);assert(rmdir(dir_a)==0&&rmdir(dir_b)==0);
snprintf(rooms,sizeof(rooms),"%s/.cable/rooms",home);assert(rmdir(rooms)==0);
snprintf(base,sizeof(base),"%s/.cable",home);assert(rmdir(base)==0);assert(rmdir(home)==0);
sodium_memzero(&a1,sizeof(a1));sodium_memzero(&a2,sizeof(a2));sodium_memzero(&b,sizeof(b));
}
memset(&message,0,sizeof(message));message.timestamp_ms=123456789;strcpy(message.text,"hello cable");message.text_length=strlen(message.text);
assert(cable_chat_message_encode(&message,plain,sizeof(plain),&n)==0);
assert(cable_chat_message_decode(&decoded,plain,n)==0);
assert(decoded.timestamp_ms==message.timestamp_ms&&!strcmp(decoded.text,message.text));
assert(sleep_gen_keypair(&alice)==0&&sleep_gen_keypair(&bob)==0);
assert(cable_chat_seal(bob.pubkey,plain,n,sealed,sizeof(sealed),&sealed_n)==0);
assert(cable_chat_open(&bob,sealed,sealed_n,opened,sizeof(opened),&opened_n)==0);
assert(opened_n==n&&!memcmp(opened,plain,n));
assert(cable_chat_open(&alice,sealed,sealed_n,opened,sizeof(opened),&opened_n)<0&&errno==EACCES);
sealed[0]^=0x80;
assert(cable_chat_open(&bob,sealed,sealed_n,opened,sizeof(opened),&opened_n)<0);
return 0;
}