mirror of
https://github.com/openai/codex.git
synced 2026-04-26 15:45:02 +00:00
chore: unify log queries (#10152)
Unify log queries to only have SQLX code in the runtime and use it for both the log client and for tests
This commit is contained in:
@@ -10,12 +10,18 @@ use codex_protocol::protocol::SessionSource;
|
||||
use codex_protocol::protocol::UserMessageEvent;
|
||||
use codex_state::STATE_DB_FILENAME;
|
||||
use core_test_support::load_sse_fixture_with_id;
|
||||
use core_test_support::responses;
|
||||
use core_test_support::responses::ev_completed;
|
||||
use core_test_support::responses::ev_function_call;
|
||||
use core_test_support::responses::ev_response_created;
|
||||
use core_test_support::responses::mount_sse_sequence;
|
||||
use core_test_support::responses::start_mock_server;
|
||||
use core_test_support::test_codex::test_codex;
|
||||
use pretty_assertions::assert_eq;
|
||||
use serde_json::json;
|
||||
use std::fs;
|
||||
use tokio::time::Duration;
|
||||
use tracing_subscriber::prelude::*;
|
||||
use uuid::Uuid;
|
||||
|
||||
fn sse_completed(id: &str) -> String {
|
||||
@@ -197,3 +203,77 @@ async fn user_messages_persist_in_state_db() -> Result<()> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn tool_call_logs_include_thread_id() -> Result<()> {
|
||||
let server = start_mock_server().await;
|
||||
let call_id = "call-1";
|
||||
let args = json!({
|
||||
"command": "echo hello",
|
||||
"timeout_ms": 1_000,
|
||||
"login": false,
|
||||
});
|
||||
let args_json = serde_json::to_string(&args)?;
|
||||
mount_sse_sequence(
|
||||
&server,
|
||||
vec![
|
||||
responses::sse(vec![
|
||||
ev_response_created("resp-1"),
|
||||
ev_function_call(call_id, "shell_command", &args_json),
|
||||
ev_completed("resp-1"),
|
||||
]),
|
||||
responses::sse(vec![ev_completed("resp-2")]),
|
||||
],
|
||||
)
|
||||
.await;
|
||||
|
||||
let mut builder = test_codex().with_config(|config| {
|
||||
config.features.enable(Feature::Sqlite);
|
||||
});
|
||||
let test = builder.build(&server).await?;
|
||||
let db = test.codex.state_db().expect("state db enabled");
|
||||
let expected_thread_id = test.session_configured.session_id.to_string();
|
||||
|
||||
let subscriber = tracing_subscriber::registry().with(codex_state::log_db::start(db.clone()));
|
||||
let dispatch = tracing::Dispatch::new(subscriber);
|
||||
let _guard = tracing::dispatcher::set_default(&dispatch);
|
||||
|
||||
test.submit_turn("run a shell command").await?;
|
||||
{
|
||||
let span = tracing::info_span!("test_log_span", thread_id = %expected_thread_id);
|
||||
let _entered = span.enter();
|
||||
tracing::info!("ToolCall: shell_command {{\"command\":\"echo hello\"}}");
|
||||
}
|
||||
|
||||
let mut found = None;
|
||||
for _ in 0..80 {
|
||||
let query = codex_state::LogQuery {
|
||||
descending: true,
|
||||
limit: Some(20),
|
||||
..Default::default()
|
||||
};
|
||||
let rows = db.query_logs(&query).await?;
|
||||
if let Some(row) = rows.into_iter().find(|row| {
|
||||
row.message
|
||||
.as_deref()
|
||||
.is_some_and(|m| m.starts_with("ToolCall:"))
|
||||
}) {
|
||||
let thread_id = row.thread_id;
|
||||
let message = row.message;
|
||||
found = Some((thread_id, message));
|
||||
break;
|
||||
}
|
||||
tokio::time::sleep(Duration::from_millis(25)).await;
|
||||
}
|
||||
|
||||
let (thread_id, message) = found.expect("expected ToolCall log row");
|
||||
assert_eq!(thread_id, Some(expected_thread_id));
|
||||
assert!(
|
||||
message
|
||||
.as_deref()
|
||||
.is_some_and(|text| text.starts_with("ToolCall:")),
|
||||
"expected ToolCall message, got {message:?}"
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user