diff --git a/design/testcases/mongodb_protocol_testcases.md b/design/testcases/mongodb_protocol_testcases.md new file mode 100644 index 0000000..795d38b --- /dev/null +++ b/design/testcases/mongodb_protocol_testcases.md @@ -0,0 +1,119 @@ +# MongoDB协议操作码测试用例 + +## 共用前置条件 +1. 服务器已启动并监听本地端口 +2. 测试数据库和集合已初始化 +3. MockStorage已配置适当的响应行为 + +## OP_UPDATE测试用例 + +### TC001-UPDATE-001: 基本文档更新 +**描述**: 验证基本的$set更新操作 +**前置条件**: +- 数据库testdb存在 +- 集合testcoll存在 +- 文档{name:"test"}存在 +**步骤**: +1. 构造包含OP_UPDATE操作的BSON请求 +2. 发送更新操作包含$set修改器 +3. 检查存储层UpdateFunc是否被正确调用 +4. 验证响应格式是否符合MongoDB协议 +**预期结果**: +- UpdateFunc被调用且参数正确 +- 返回成功状态码 +- 更新后的文档字段值正确 + +### TC001-UPDATE-002: 多文档更新 +**描述**: 验证多文档更新选项 +**前置条件**: +- 存在多个匹配查询条件的文档 +**步骤**: +1. 构造包含UBF_MULTI_UPDATE标志的更新请求 +2. 发送请求并检查存储层处理 +3. 验证所有匹配文档是否都被更新 +**预期结果**: +- 所有匹配文档都被正确更新 +- 返回正确的更新计数 + +### TC001-UPDATE-003: 无效BSON格式处理 +**描述**: 验证对无效BSON格式的错误处理 +**步骤**: +1. 构造包含损坏BSON数据的更新请求 +2. 发送请求 +3. 检查服务器是否正常处理错误 +**预期结果**: +- 返回格式错误响应 +- 服务器不崩溃 + +## OP_DELETE测试用例 + +### TC001-DELETE-001: 单文档删除 +**描述**: 验证单个文档删除 +**前置条件**: +- 存在指定待删除文档 +**步骤**: +1. 构造OP_DELETE请求 +2. 发送请求并检查存储层DeleteFunc调用 +3. 验证文档是否被删除 +**预期结果**: +- DeleteFunc被正确调用 +- 文档被成功删除 +- 返回删除计数1 + +### TC001-DELETE-002: 多文档删除 +**描述**: 验证批量删除操作 +**前置条件**: +- 存在多个匹配删除条件的文档 +**步骤**: +1. 构造包含批量删除标志的请求 +2. 发送请求 +3. 验证所有匹配文档是否被删除 +**预期结果**: +- 所有匹配文档被删除 +- 返回正确的删除计数 + +## OP_COMMAND测试用例 + +### TC001-COMMAND-001: isMaster命令执行 +**描述**: 验证isMaster命令处理 +**步骤**: +1. 构造OP_COMMAND请求,命令为isMaster +2. 发送请求 +3. 检查响应是否包含必要的实例信息 +**预期结果**: +- 返回包含ismaster:true的响应 +- 包含版本号、最大BSON大小等元数据 + +### TC001-COMMAND-002: createCollection命令 +**描述**: 验证集合创建命令 +**前置条件**: +- 目标集合不存在 +**步骤**: +1. 构造createCollection命令请求 +2. 发送请求 +3. 检查存储层CreateCollFunc调用 +**预期结果**: +- CreateCollFunc被正确调用 +- 返回成功状态码 + +## OP_GET_MORE测试用例 + +### TC001-GETMORE-001: 基本分页获取 +**描述**: 验证游标分页功能 +**前置条件**: +- 存在大量文档需要分批获取 +**步骤**: +1. 构造初始查询请求获取游标ID +2. 使用OP_GET_MORE请求获取后续数据 +3. 验证返回数据是否完整 +**预期结果**: +- 正确返回第一批数据 +- 后续请求通过游标获取剩余数据 + +### TC001-GETMORE-002: 游标超时清理 +**描述**: 验证游标超时机制 +**步骤**: +1. 创建游标后延迟一段时间 +2. 尝试使用过期游标获取数据 +**预期结果**: +- 返回游标不存在或已超时错误 \ No newline at end of file