plp-test/Makefile
2025-04-22 18:03:59 +08:00

239 lines
7.1 KiB
Makefile

# 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"