gem/tests/server_fixture.c
2026-08-30 18:24:55 -06:00

67 lines
2.4 KiB
C

#include "gem/server.h"
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
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<turn|>")) {
(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;
}