view connectors/tests/core_store_test.c @ 281:c57149ad216e default tip

Copilot-Session: f68442b1-fa8f-46a0-9689-81710613bbd4
author MrJuneJune <me@mrjunejune.com>
date Tue, 18 Aug 2026 22:18:15 -0700
parents b3b547563ec7
children
line wrap: on
line source

#include "connectors/connector.h"

#include <assert.h>
#include <stdio.h>
#include <string.h>

static Connector_Master_Key key_with(uint8 value, uint32 version)
{
  Connector_Master_Key key = {.version = version};
  memset(key.key, value, sizeof(key.key));
  return key;
}

static Connector_Account account_for(
    const char *user, const char *account_id, const char *subject)
{
  Connector_Account account;
  memset(&account, 0, sizeof(account));
  strcpy(account.account_id, account_id);
  strcpy(account.user_id, user);
  strcpy(account.provider, "google");
  strcpy(account.provider_subject, subject);
  strcpy(account.email, "[email protected]");
  strcpy(account.access_token, "access-secret");
  strcpy(account.refresh_token, "refresh-secret");
  strcpy(account.scopes, "scope");
  account.expires_at = 123456;
  return account;
}

static void test_crypto(void)
{
  Connector_Master_Key key = key_with(7, 3);
  char encrypted[4096], decrypted[128];
  assert(Connector_Encrypt(&key, "highly-secret", encrypted, sizeof(encrypted)));
  assert(strcmp(encrypted, "highly-secret") != 0);
  assert(Connector_Decrypt(&key, encrypted, decrypted, sizeof(decrypted)));
  assert(!strcmp(decrypted, "highly-secret"));

  Connector_Master_Key wrong = key_with(8, 3);
  assert(!Connector_Decrypt(&wrong, encrypted, decrypted, sizeof(decrypted)));
  Connector_Master_Key wrong_version = key;
  wrong_version.version = 4;
  assert(!Connector_Decrypt(
      &wrong_version, encrypted, decrypted, sizeof(decrypted)));
  encrypted[strlen(encrypted) - 1] =
      encrypted[strlen(encrypted) - 1] == 'A' ? 'B' : 'A';
  assert(!Connector_Decrypt(&key, encrypted, decrypted, sizeof(decrypted)));
}

static void test_store(void)
{
  Connector_Master_Key key = key_with(17, 1);
  Connector_Store store;
  assert(Connector_Store_Open(&store, ":memory:", &key));

  Connector_OAuth_Start state = {0};
  strcpy(state.state, "state-1");
  strcpy(state.code_verifier, "verifier-1");
  assert(Connector_Store_Create_State(&store, "user-a", &state, 100));
  char verifier[128];
  assert(!Connector_Store_Consume_State(
      &store, "user-a", "state-1", 101, verifier, sizeof(verifier)));
  strcpy(state.state, "state-2");
  assert(Connector_Store_Create_State(&store, "user-a", &state, 200));
  assert(!Connector_Store_Consume_State(
      &store, "user-b", "state-2", 150, verifier, sizeof(verifier)));
  assert(Connector_Store_Consume_State(
      &store, "user-a", "state-2", 150, verifier, sizeof(verifier)));
  assert(!strcmp(verifier, "verifier-1"));
  assert(!Connector_Store_Consume_State(
      &store, "user-a", "state-2", 150, verifier, sizeof(verifier)));

  Connector_Account account = account_for("user-a", "google:one", "one");
  assert(Connector_Store_Save_Account(&store, &account));
  Connector_Account second = account_for("user-a", "google:two", "two");
  strcpy(second.email, "[email protected]");
  assert(Connector_Store_Save_Account(&store, &second));
  Connector_Account loaded;
  assert(Connector_Store_Get_Account(
      &store, "user-a", "google:one", &loaded));
  assert(!strcmp(loaded.access_token, "access-secret"));
  assert(!Connector_Store_Get_Account(
      &store, "user-b", "google:one", &loaded));
  assert(!Connector_Store_Delete_Account(
      &store, "user-b", "google:one"));
  assert(Connector_Store_Get_Account(
      &store, "user-a", "google:two", &loaded));
  assert(!strcmp(loaded.email, "[email protected]"));
  Dowa_Arena *list_arena = Dowa_Arena_Create(64 * 1024);
  Connector_Account_Summary *accounts = NULL;
  assert(Connector_Store_List_Accounts(
      &store, "user-a", &accounts, list_arena));
  assert(Dowa_Array_Length(accounts) == 2);
  assert(!strcmp(accounts[0].account_id, "google:one"));
  assert(!strcmp(accounts[1].account_id, "google:two"));
  Dowa_Arena_Free(list_arena);
  Dowa_Arena *query_arena = Dowa_Arena_Create(4096);
  Deita_Result_Set *ciphertext = Deita_Query_Execute(
      store.connection,
      "SELECT access_token_enc FROM connector_accounts "
      "WHERE account_id='google:one'",
      query_arena);
  assert(ciphertext && Deita_Result_Set_Next(ciphertext));
  assert(!strstr(Deita_Result_Set_Get_Text(ciphertext, 0), "access-secret"));
  Deita_Result_Set_Free(ciphertext);
  Dowa_Arena_Free(query_arena);

  assert(Connector_Store_Get_Policy(
      &store, "user-a", "gmail.send") == CONNECTOR_CONFIRM_ALWAYS);
  assert(Connector_Store_Get_Policy(
      &store, "user-a", "drive.overwrite") == CONNECTOR_CONFIRM_ALWAYS);
  assert(Connector_Store_Get_Policy(
      &store, "user-a", "drive.create") == CONNECTOR_CONFIRM_NEVER);
  assert(Connector_Store_Set_Policy(
      &store, "user-a", "gmail.send", CONNECTOR_CONFIRM_NEVER));
  assert(Connector_Store_Get_Policy(
      &store, "user-a", "gmail.send") == CONNECTOR_CONFIRM_NEVER);

  assert(Connector_Store_Create_Confirmation(
      &store, "user-a", "digest-a", "confirm-a", 300));
  assert(!Connector_Store_Consume_Confirmation(
      &store, "user-b", "digest-a", "confirm-a", 250));
  assert(!Connector_Store_Consume_Confirmation(
      &store, "user-a", "digest-b", "confirm-a", 250));
  assert(Connector_Store_Consume_Confirmation(
      &store, "user-a", "digest-a", "confirm-a", 250));
  assert(!Connector_Store_Consume_Confirmation(
      &store, "user-a", "digest-a", "confirm-a", 250));
  assert(Connector_Store_Create_Confirmation(
      &store, "user-a", "digest-c", "confirm-c", 300));
  assert(!Connector_Store_Consume_Confirmation(
      &store, "user-a", "digest-c", "confirm-c", 301));

  assert(Connector_Store_Put_Idempotent(
      &store, "user-a", "idem-1", "digest-1", 201, "{\"id\":\"x\"}"));
  int32 status = 0;
  char body[128];
  assert(Connector_Store_Get_Idempotent(
      &store, "user-a", "idem-1", "digest-1", &status, body, sizeof(body)));
  assert(status == 201 && !strcmp(body, "{\"id\":\"x\"}"));
  assert(!Connector_Store_Get_Idempotent(
      &store, "user-a", "idem-1", "digest-other",
      &status, body, sizeof(body)));
  assert(!Connector_Store_Get_Idempotent(
      &store, "user-b", "idem-1", "digest-1", &status, body, sizeof(body)));
  assert(Connector_Store_Idempotency_Conflict(
      &store, "user-a", "idem-1", "digest-other"));
  assert(!Connector_Store_Idempotency_Conflict(
      &store, "user-b", "idem-1", "digest-other"));
  assert(Connector_Store_Audit(
      &store, "user-a", "google:one", "gmail.send", "digest-1", 200));

  Connector_Store_Close(&store);
}

static void test_digest(void)
{
  Connector_Provider_Request request = {
    .method = "POST",
    .path = "/gmail/v1/users/me/messages/send",
    .content_type = "application/json",
    .body = "{\"raw\":\"abc\"}",
    .body_length = 13
  };
  char first[65], second[65], changed[65];
  assert(Connector_Request_Digest(
      "user-a", "google:one", CONNECTOR_OP_GMAIL_SEND, &request, first));
  assert(Connector_Request_Digest(
      "user-a", "google:one", CONNECTOR_OP_GMAIL_SEND, &request, second));
  request.body = "{\"raw\":\"xyz\"}";
  assert(Connector_Request_Digest(
      "user-a", "google:one", CONNECTOR_OP_GMAIL_SEND, &request, changed));
  assert(!strcmp(first, second));
  assert(strcmp(first, changed));
}

int main(void)
{
  test_crypto();
  test_store();
  test_digest();
  printf("core_store_test: ok\n");
  return 0;
}