#include "gem/server.h" #include #include #include #include #include #include #include #include struct fixture { int generated; }; static int generate(void *opaque, const struct gem_chat_request *request, gem_stream_emit_fn emit, void *user, size_t *input_tokens, size_t *output_tokens, const char **finish_reason, char *error, size_t error_size) { struct fixture *fixture = opaque; if (!strstr(request->prompt, "<|turn>user\nhello")) { (void)snprintf(error, error_size, "unexpected fixture prompt"); return -1; } static const char answer[] = "native hax ok"; struct gem_stream_event event = { .kind = GEM_STREAM_TEXT, .text = answer, .text_size = sizeof(answer) - 1, }; if (emit(&event, user) != 0) return -1; *input_tokens = 4; *output_tokens = 3; *finish_reason = "stop"; fixture->generated = 1; return 0; } int main(void) { int listener = socket(AF_INET, SOCK_STREAM, 0); if (listener < 0) return 1; struct sockaddr_in address = {.sin_family = AF_INET}; if (inet_pton(AF_INET, "127.0.0.1", &address.sin_addr) != 1 || bind(listener, (struct sockaddr *)&address, sizeof(address)) != 0 || listen(listener, 8) != 0) { close(listener); return 1; } socklen_t address_size = sizeof(address); if (getsockname(listener, (struct sockaddr *)&address, &address_size) != 0) { close(listener); return 1; } printf("%u\n", (unsigned)ntohs(address.sin_port)); fflush(stdout); struct fixture fixture = {0}; struct gem_server_config config = { .model_id = "gem-test", .context_length = 32768, .default_max_tokens = 32, .sampler = {.temperature = 0, .top_k = 1, .top_p = 1, .repeat_penalty = 1, .repeat_last_n = 64, .seed = 1}, .backend = &fixture, .generate = generate, }; for (unsigned request = 0; request < 8 && !fixture.generated; ++request) { int client; do { client = accept(listener, NULL, NULL); } while (client < 0 && errno == EINTR); if (client < 0) { close(listener); return 1; } char error[256]; (void)gem_server_handle_connection(client, &config, error, sizeof(error)); close(client); } close(listener); return fixture.generated ? 0 : 1; }