# Open-CAS 断电 PLP SSD 数据完整性测试 Makefile # 项目设置 PROJECT_NAME := plp-test SERVER_BIN := bin/server CLIENT_BIN := bin/client CONFIG_FILE := config.yaml LOG_DIR := logs BIN_DIR := bin # Go设置 GO := go GO_BUILD := $(GO) build -v GO_TEST := $(GO) test -v GO_CLEAN := $(GO) clean GO_LINT := golint GO_FMT := $(GO) fmt GO_VET := $(GO) vet GO_MOD := $(GO) mod # Delve调试器 DLV := dlv # 测试参数 TEST_TYPE ?= sequential DATA_SIZE ?= 100 BLOCK_SIZE ?= 4 CONCURRENT ?= false # 版本信息 VERSION := 1.0.0 BUILD_TIME := $(shell date +%FT%T%z) # 构建标志 DEBUG_FLAGS := -gcflags="all=-N -l" # 其他参数 LOG_LEVEL ?= info SERVER_PORT ?= 8080 # 默认目标 .PHONY: all all: check_deps build # 创建必要的目录 $(BIN_DIR) $(LOG_DIR): mkdir -p $@ # 编译目标 .PHONY: build build_server build_client build_debug build: check_deps $(BIN_DIR) build_server build_client build_server: $(BIN_DIR) $(GO_BUILD) -o $(SERVER_BIN) ./cmd/server build_client: $(BIN_DIR) $(GO_BUILD) -o $(CLIENT_BIN) ./cmd/client build_server_linux_amd64: GOOS=linux GOARCH=amd64 $(GO_BUILD) -o $(SERVER_BIN) ./cmd/server build_client_linux_amd64: GOOS=linux GOARCH=amd64 $(GO_BUILD) -o $(CLIENT_BIN) ./cmd/client # 编译调试版本 build_debug: check_deps $(BIN_DIR) $(GO_BUILD) $(DEBUG_FLAGS) -o $(SERVER_BIN) ./cmd/server $(GO_BUILD) $(DEBUG_FLAGS) -o $(CLIENT_BIN) ./cmd/client # 测试目标 .PHONY: test test_sequential test_random test_mixed test_concurrent test_power_loss test_stability test_all test: build ./scripts/run_test.sh $(TEST_TYPE) $(DATA_SIZE) $(BLOCK_SIZE) $(CONCURRENT) test_sequential: TEST_TYPE=sequential test_sequential: test test_random: TEST_TYPE=random test_random: test test_mixed: TEST_TYPE=mixed test_mixed: test test_concurrent: TEST_TYPE=concurrent test_concurrent: test test_power_loss: TEST_TYPE=power_loss test_power_loss: test test_stability: TEST_TYPE=stability test_stability: test test_all: TEST_TYPE=all test_all: test # 单独启动服务器和客户端 .PHONY: run_server run_client run_server: build_server $(SERVER_BIN) -config $(CONFIG_FILE) -log-level $(LOG_LEVEL) run_client: build_client $(CLIENT_BIN) -config $(CONFIG_FILE) -test $(TEST_TYPE) -data-size $(DATA_SIZE) -block-size $(BLOCK_SIZE) # 调试目标 .PHONY: debug_server debug_client debug_server: build_debug $(DLV) --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec $(SERVER_BIN) -- -config $(CONFIG_FILE) -log-level debug debug_client: build_debug $(DLV) --listen=:2346 --headless=true --api-version=2 --accept-multiclient exec $(CLIENT_BIN) -- -config $(CONFIG_FILE) -test $(TEST_TYPE) -data-size $(DATA_SIZE) -block-size $(BLOCK_SIZE) # 运行单元测试 .PHONY: unit_test unit_test_coverage unit_test: $(GO_TEST) ./... unit_test_coverage: $(GO_TEST) -coverprofile=coverage.out ./... $(GO) tool cover -html=coverage.out -o coverage.html # 代码质量检查 .PHONY: fmt lint vet check_code_quality fmt: $(GO_FMT) ./... lint: $(GO_LINT) ./... vet: $(GO_VET) ./... # 组合所有代码质量检查 check_code_quality: fmt vet @echo "代码质量检查完成" # 依赖管理 .PHONY: check_deps deps_update check_dlv check_deps: @command -v casadm >/dev/null 2>&1 || (echo "错误: Open-CAS (casadm) 未安装,请先安装 Open-CAS" && exit 1) @$(GO_MOD) verify || (echo "错误: Go 模块验证失败" && exit 1) check_dlv: @command -v dlv >/dev/null 2>&1 || (echo "警告: Delve 调试器未安装,部分调试功能将不可用。可以通过 'go install github.com/go-delve/delve/cmd/dlv@latest' 安装" && exit 1) deps_update: $(GO_MOD) tidy # 环境检查 .PHONY: check_env check_env: @nvme_device=$$(grep -oP 'devices_nvme: "\K[^"]+' $(CONFIG_FILE)); \ hdd_device=$$(grep -oP 'devices_hdd: "\K[^"]+' $(CONFIG_FILE)); \ [ -b "$$nvme_device" ] || (echo "错误: NVMe设备 $$nvme_device 不存在或不是块设备" && exit 1); \ [ -b "$$hdd_device" ] || (echo "错误: HDD设备 $$hdd_device 不存在或不是块设备" && exit 1); \ echo "环境检查通过:设备 $$nvme_device 和 $$hdd_device 存在" # 性能测试 .PHONY: bench_test bench_test: $(GO_TEST) -bench=. -benchmem ./... # 清理 .PHONY: clean clean_logs clean_all help clean: rm -rf $(BIN_DIR) $(GO_CLEAN) ./... rm -f coverage.out coverage.html clean_logs: rm -rf $(LOG_DIR)/* clean_all: clean clean_logs @if casadm -L 2>/dev/null | grep -q "Cache Instance"; then \ echo "警告: 存在活动的缓存实例,尝试强制停止..."; \ cache_id=$$(grep -oP 'cache_instance_id: "\K[^"]+' $(CONFIG_FILE)); \ casadm -T -i $$cache_id -f 2>/dev/null || true; \ fi # 帮助信息 help: @echo "用法: make [目标]" @echo "" @echo "编译目标:" @echo " all 编译所有组件 (默认)" @echo " build 编译所有组件" @echo " build_server 只编译服务器" @echo " build_client 只编译客户端" @echo " build_debug 编译调试版本 (包含调试符号)" @echo "" @echo "运行目标:" @echo " run_server 只运行服务器" @echo " run_client 只运行客户端" @echo "" @echo "测试目标:" @echo " test 运行测试(默认顺序写入测试)" @echo " test_sequential 运行顺序写入测试" @echo " test_random 运行随机写入测试" @echo " test_mixed 运行混合读写测试" @echo " test_concurrent 运行高并发写入测试" @echo " test_power_loss 运行断电恢复测试" @echo " test_stability 运行长期稳定性测试" @echo " test_all 运行所有测试" @echo " unit_test 运行单元测试" @echo " unit_test_coverage 生成单元测试覆盖率报告" @echo " bench_test 运行性能测试" @echo "" @echo "调试目标:" @echo " debug_server 使用Delve调试服务器 (需安装dlv)" @echo " debug_client 使用Delve调试客户端 (需安装dlv)" @echo "" @echo "代码质量目标:" @echo " fmt 格式化代码" @echo " lint 运行 lint 代码质量检查" @echo " vet 运行 Go vet 代码检查" @echo " check_code_quality 运行所有代码质量检查" @echo "" @echo "依赖管理目标:" @echo " check_deps 检查依赖项" @echo " check_dlv 检查Delve调试器是否安装" @echo " deps_update 更新依赖项" @echo " check_env 检查测试环境" @echo "" @echo "清理目标:" @echo " clean 清理编译产物" @echo " clean_logs 清理日志" @echo " clean_all 清理所有产物和缓存实例" @echo "" @echo "参数:" @echo " TEST_TYPE=type 测试类型 (sequential, random, mixed, concurrent, power_loss, stability, all)" @echo " DATA_SIZE=size 测试数据大小 (MB)" @echo " BLOCK_SIZE=size 数据块大小 (KB)" @echo " CONCURRENT=bool 是否并发运行测试 (true/false)" @echo " LOG_LEVEL=level 日志级别 (debug, info, warn, error)" @echo " SERVER_PORT=port 服务器端口 (默认:8080)" @echo "" @echo "示例:" @echo " make test TEST_TYPE=power_loss DATA_SIZE=200 BLOCK_SIZE=8" @echo " make test_all CONCURRENT=true" @echo " make debug_server"