test: verify encoded schema cache lifecycle · github/github-mcp-server@2aa8fac · GitHub
Skip to content

Commit 2aa8fac

Browse files
test: verify encoded schema cache lifecycle
Document immutable shared schema definitions and verify bounded reuse across HTTP inventories and repeated server registration. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 86af658 commit 2aa8fac

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

‎pkg/http/handler_test.go‎

Lines changed: 36 additions & 0 deletions

‎pkg/inventory/encoded_schemas_test.go‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,57 @@ func TestEncodedSchemasConcurrentRegistration(t *testing.T) {
123123
assert.Equal(t, original, after, "source schema must remain unchanged")
124124
}
125125

126+
func TestEncodedSchemasRepeatedInventoryRegistration(t *testing.T) {
127+
t.Parallel()
128+
schema := &jsonschema.Schema{
129+
Type: "object",
130+
Properties: map[string]*jsonschema.Schema{"owner": {Type: "string"}},
131+
}
132+
definition := ServerTool{
133+
Tool: mcp.Tool{Name: "repeated", InputSchema: schema, OutputSchema: schema},
134+
HandlerFunc: func(any) mcp.ToolHandler {
135+
return func(context.Context, *mcp.CallToolRequest) (*mcp.CallToolResult, error) {
136+
return &mcp.CallToolResult{}, nil
137+
}
138+
},
139+
}
140+
original, err := json.Marshal(schema)
141+
require.NoError(t, err)
142+
var first []byte
143+
for range 20 {
144+
inv, err := NewBuilder().SetTools([]ServerTool{definition}).WithToolsets([]string{"all"}).Build()
145+
require.NoError(t, err)
146+
server := mcp.NewServer(&mcp.Implementation{Name: "repeated"}, nil)
147+
inv.ForMCPRequest(MCPMethodToolsList, "").RegisterTools(context.Background(), server, nil)
148+
st, ct := mcp.NewInMemoryTransports()
149+
ss, err := server.Connect(context.Background(), st, nil)
150+
require.NoError(t, err)
151+
cs, err := mcp.NewClient(&mcp.Implementation{Name: "test"}, nil).Connect(context.Background(), ct, nil)
152+
require.NoError(t, err)
153+
list, err := cs.ListTools(context.Background(), nil)
154+
_ = cs.Close()
155+
_ = ss.Close()
156+
require.NoError(t, err)
157+
data, err := json.Marshal(list)
158+
require.NoError(t, err)
159+
if first == nil {
160+
first = data
161+
}
162+
assert.Equal(t, first, data)
163+
}
164+
var entries int
165+
encodedSchemas.Range(func(key, _ any) bool {
166+
if key.(encodedSchemaKey).schema == schema {
167+
entries++
168+
}
169+
return true
170+
})
171+
assert.Equal(t, 2, entries, "new inventories and annotation clones must reuse the two source-schema keys")
172+
after, err := json.Marshal(schema)
173+
require.NoError(t, err)
174+
assert.Equal(t, original, after)
175+
}
176+
126177
func TestEncodedSchemasPreserveReplacementsAndErrors(t *testing.T) {
127178
t.Parallel()
128179
source := &jsonschema.Schema{Type: "object"}

‎pkg/inventory/registry.go‎

Lines changed: 3 additions & 0 deletions

0 commit comments

Comments
 (0)