feat: load packet logs from directory source
This commit is contained in:
@@ -66,6 +66,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"sort"
|
||||
"strings"
|
||||
@@ -192,8 +193,9 @@ func main() {
|
||||
}
|
||||
defaultContactCount := verifySearchContacts(ctx, session, "sender", "tools/call isphere_search_contacts default", 0)
|
||||
defaultGroupCount := verifySearchGroups(ctx, session, "project", "tools/call isphere_search_groups default", 0)
|
||||
defaultFileCount := verifyReceiveFiles(ctx, session, "report", "tools/call isphere_receive_files default", 0)
|
||||
defaultFileCount := verifyReceiveFiles(ctx, session, "report", "tools/call isphere_receive_files default", 0, "", "")
|
||||
configuredReceiveCount, configuredContactCount, configuredGroupCount, configuredFileCount := verifyConfiguredReceiveSource(ctx)
|
||||
configuredDirReceiveCount, configuredDirContactCount, configuredDirGroupCount, configuredDirFileCount := verifyConfiguredDirectorySource(ctx)
|
||||
|
||||
result := map[string]any{
|
||||
"ok": true,
|
||||
@@ -210,7 +212,12 @@ func main() {
|
||||
"configured_contact_count": configuredContactCount,
|
||||
"configured_group_count": configuredGroupCount,
|
||||
"configured_file_count": configuredFileCount,
|
||||
"configured_dir_receive_message_count": configuredDirReceiveCount,
|
||||
"configured_dir_contact_count": configuredDirContactCount,
|
||||
"configured_dir_group_count": configuredDirGroupCount,
|
||||
"configured_dir_file_count": configuredDirFileCount,
|
||||
"packet_log_file_configured": os.Getenv("ISPHERE_PACKET_LOG_FILE") != "",
|
||||
"packet_log_dir_configured": os.Getenv("ISPHERE_PACKET_LOG_DIR") != "",
|
||||
"real_isphere_login_required": false,
|
||||
"python_runtime_required": false,
|
||||
"action_tools_present": false,
|
||||
@@ -319,7 +326,110 @@ func verifyConfiguredReceiveSource(ctx context.Context) (int, int, int, int) {
|
||||
}
|
||||
contactCount := verifySearchContacts(ctx, session, "sender", "fixture/call isphere_search_contacts", 1)
|
||||
groupCount := verifySearchGroups(ctx, session, "project", "fixture/call isphere_search_groups", 1)
|
||||
fileCount := verifyReceiveFiles(ctx, session, "report", "fixture/call isphere_receive_files", 1)
|
||||
fileCount := verifyReceiveFiles(ctx, session, "report", "fixture/call isphere_receive_files", 1, "msg-fixture-1:redacted-report.docx", "redacted-report.docx")
|
||||
return len(messagesValue), contactCount, groupCount, fileCount
|
||||
}
|
||||
|
||||
|
||||
func verifyConfiguredDirectorySource(ctx context.Context) (int, int, int, int) {
|
||||
plaintext := "--------------------------------------------------------------------------------------------------------------------------------------------\n" +
|
||||
"2026/7/7 15:30:07\n" +
|
||||
"<message id=\"msg-dir-fixture-1\" from=\"project-room@conference.imopenfire1-lanzhou/imp_pc_4.1.2.6842\" to=\"sender@imopenfire1-lanzhou\" type=\"groupchat\">\n" +
|
||||
" <body>redacted-dir-report.docx</body>\n" +
|
||||
" <received xmlns=\"urn:xmpp:receipts\" id=\"receipt-dir-fixture-1\" type=\"1\" stamp=\"\" />\n" +
|
||||
" <subject>FILE_TRANSFER_CANCEL</subject>\n" +
|
||||
" <isphere xmlns=\"isphere.im\" type=\"1001\" sendtime=\"1783423807000\" version=\"1\" />\n" +
|
||||
" <readed />\n" +
|
||||
"</message>"
|
||||
line, err := encryptPacketLogLineForHarness(plaintext)
|
||||
if err != nil {
|
||||
fail("dir_fixture/encrypt", err)
|
||||
}
|
||||
dir, err := os.MkdirTemp("", "isphere-packet-log-dir-*")
|
||||
if err != nil {
|
||||
fail("dir_fixture/create", err)
|
||||
}
|
||||
defer os.RemoveAll(dir)
|
||||
if err := os.WriteFile(filepath.Join(dir, "b-ignored.tmp"), []byte("ignored\n"), 0o600); err != nil {
|
||||
fail("dir_fixture/write_ignored", err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(dir, "a-packet-reader.log"), []byte("\n"+line+"\n"), 0o600); err != nil {
|
||||
fail("dir_fixture/write", err)
|
||||
}
|
||||
|
||||
oldFileValue, hadOldFileValue := os.LookupEnv("ISPHERE_PACKET_LOG_FILE")
|
||||
oldDirValue, hadOldDirValue := os.LookupEnv("ISPHERE_PACKET_LOG_DIR")
|
||||
_ = os.Unsetenv("ISPHERE_PACKET_LOG_FILE")
|
||||
if err := os.Setenv("ISPHERE_PACKET_LOG_DIR", dir); err != nil {
|
||||
fail("dir_fixture/env", err)
|
||||
}
|
||||
defer func() {
|
||||
if hadOldFileValue {
|
||||
_ = os.Setenv("ISPHERE_PACKET_LOG_FILE", oldFileValue)
|
||||
} else {
|
||||
_ = os.Unsetenv("ISPHERE_PACKET_LOG_FILE")
|
||||
}
|
||||
if hadOldDirValue {
|
||||
_ = os.Setenv("ISPHERE_PACKET_LOG_DIR", oldDirValue)
|
||||
} else {
|
||||
_ = os.Unsetenv("ISPHERE_PACKET_LOG_DIR")
|
||||
}
|
||||
}()
|
||||
|
||||
serverCtx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
serverTransport, clientTransport := mcp.NewInMemoryTransports()
|
||||
server, err := mcpserver.NewServerFromEnv()
|
||||
if err != nil {
|
||||
fail("dir_fixture/server_config", err)
|
||||
}
|
||||
serverErr := make(chan error, 1)
|
||||
go func() {
|
||||
serverErr <- server.Run(serverCtx, serverTransport)
|
||||
}()
|
||||
|
||||
client := mcp.NewClient(&mcp.Implementation{Name: "verify-go-mcp-dir-fixture", Version: "0.1.0"}, nil)
|
||||
session, err := client.Connect(serverCtx, clientTransport, nil)
|
||||
if err != nil {
|
||||
cancel()
|
||||
fail("dir_fixture/connect", err)
|
||||
}
|
||||
defer func() {
|
||||
_ = session.Close()
|
||||
cancel()
|
||||
select {
|
||||
case <-serverErr:
|
||||
case <-time.After(2 * time.Second):
|
||||
fail("dir_fixture/server_shutdown", fmt.Errorf("server did not stop"))
|
||||
}
|
||||
}()
|
||||
|
||||
callResult, err := session.CallTool(serverCtx, &mcp.CallToolParams{Name: "isphere_receive_messages", Arguments: map[string]any{"limit": 5}})
|
||||
if err != nil {
|
||||
fail("dir_fixture/call isphere_receive_messages", err)
|
||||
}
|
||||
if callResult.IsError {
|
||||
fail("dir_fixture/call isphere_receive_messages", fmt.Errorf("tool returned isError=true: %#v", callResult.Content))
|
||||
}
|
||||
var receivePayload map[string]any
|
||||
receiveEncoded, _ := json.Marshal(callResult.StructuredContent)
|
||||
if err := json.Unmarshal(receiveEncoded, &receivePayload); err != nil {
|
||||
fail("dir_fixture/decode", fmt.Errorf("decode structuredContent %s: %w", receiveEncoded, err))
|
||||
}
|
||||
messagesValue, ok := receivePayload["messages"].([]any)
|
||||
if !ok || len(messagesValue) != 1 {
|
||||
fail("dir_fixture/assert", fmt.Errorf("messages = %#v, want one", receivePayload["messages"]))
|
||||
}
|
||||
message, ok := messagesValue[0].(map[string]any)
|
||||
if !ok {
|
||||
fail("dir_fixture/assert", fmt.Errorf("message was not object: %#v", messagesValue[0]))
|
||||
}
|
||||
if message["id"] != "msg-dir-fixture-1" || message["text"] != "redacted-dir-report.docx" || message["subject"] != "FILE_TRANSFER_CANCEL" {
|
||||
fail("dir_fixture/assert", fmt.Errorf("unexpected message: %#v", message))
|
||||
}
|
||||
contactCount := verifySearchContacts(ctx, session, "sender", "dir_fixture/call isphere_search_contacts", 1)
|
||||
groupCount := verifySearchGroups(ctx, session, "project", "dir_fixture/call isphere_search_groups", 1)
|
||||
fileCount := verifyReceiveFiles(ctx, session, "dir-report", "dir_fixture/call isphere_receive_files", 1, "msg-dir-fixture-1:redacted-dir-report.docx", "redacted-dir-report.docx")
|
||||
return len(messagesValue), contactCount, groupCount, fileCount
|
||||
}
|
||||
|
||||
@@ -395,7 +505,7 @@ func verifySearchGroups(ctx context.Context, session *mcp.ClientSession, query s
|
||||
}
|
||||
|
||||
|
||||
func verifyReceiveFiles(ctx context.Context, session *mcp.ClientSession, nameContains string, step string, wantCount int) int {
|
||||
func verifyReceiveFiles(ctx context.Context, session *mcp.ClientSession, nameContains string, step string, wantCount int, wantFileID string, wantFileName string) int {
|
||||
callResult, err := session.CallTool(ctx, &mcp.CallToolParams{Name: "isphere_receive_files", Arguments: map[string]any{"mode": "list", "name_contains": nameContains, "limit": 5}})
|
||||
if err != nil {
|
||||
fail(step, err)
|
||||
@@ -423,7 +533,7 @@ func verifyReceiveFiles(ctx context.Context, session *mcp.ClientSession, nameCon
|
||||
if !ok {
|
||||
fail(step, fmt.Errorf("file was not object: %#v", filesValue[0]))
|
||||
}
|
||||
if file["file_id"] != "msg-fixture-1:redacted-report.docx" || file["file_name"] != "redacted-report.docx" || file["source"] != "local_readonly" {
|
||||
if file["file_id"] != wantFileID || file["file_name"] != wantFileName || file["source"] != "local_readonly" {
|
||||
fail(step, fmt.Errorf("unexpected file: %#v", file))
|
||||
}
|
||||
if file["download_ref"] != nil || file["saved_path"] != nil || file["sha256"] != nil {
|
||||
@@ -490,6 +600,10 @@ func fail(step string, err error) {
|
||||
Assert-True ($script:harnessJson.configured_contact_count -eq 1) "SDK harness configured_contact_count mismatch: $($script:harnessJson.configured_contact_count)"
|
||||
Assert-True ($script:harnessJson.configured_group_count -eq 1) "SDK harness configured_group_count mismatch: $($script:harnessJson.configured_group_count)"
|
||||
Assert-True ($script:harnessJson.configured_file_count -eq 1) "SDK harness configured_file_count mismatch: $($script:harnessJson.configured_file_count)"
|
||||
Assert-True ($script:harnessJson.configured_dir_receive_message_count -eq 1) "SDK harness configured_dir_receive_message_count mismatch: $($script:harnessJson.configured_dir_receive_message_count)"
|
||||
Assert-True ($script:harnessJson.configured_dir_contact_count -eq 1) "SDK harness configured_dir_contact_count mismatch: $($script:harnessJson.configured_dir_contact_count)"
|
||||
Assert-True ($script:harnessJson.configured_dir_group_count -eq 1) "SDK harness configured_dir_group_count mismatch: $($script:harnessJson.configured_dir_group_count)"
|
||||
Assert-True ($script:harnessJson.configured_dir_file_count -eq 1) "SDK harness configured_dir_file_count mismatch: $($script:harnessJson.configured_dir_file_count)"
|
||||
|
||||
[ordered]@{
|
||||
ok = $true
|
||||
@@ -506,7 +620,12 @@ func fail(step string, err error) {
|
||||
configured_contact_count = $script:harnessJson.configured_contact_count
|
||||
configured_group_count = $script:harnessJson.configured_group_count
|
||||
configured_file_count = $script:harnessJson.configured_file_count
|
||||
configured_dir_receive_message_count = $script:harnessJson.configured_dir_receive_message_count
|
||||
configured_dir_contact_count = $script:harnessJson.configured_dir_contact_count
|
||||
configured_dir_group_count = $script:harnessJson.configured_dir_group_count
|
||||
configured_dir_file_count = $script:harnessJson.configured_dir_file_count
|
||||
packet_log_file_configured = $script:harnessJson.packet_log_file_configured
|
||||
packet_log_dir_configured = $script:harnessJson.packet_log_dir_configured
|
||||
python_runtime_required = $false
|
||||
real_isphere_login_required = $false
|
||||
action_tools_present = $false
|
||||
|
||||
Reference in New Issue
Block a user