aboutsummaryrefslogtreecommitdiff
path: root/test/s3/versioning/Makefile
blob: ccf5e2092c9d4a74d9616dbdbdb9d67aae13f211 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
# S3 API Test Makefile
# This Makefile provides comprehensive targets for running S3 versioning tests

.PHONY: help build-weed setup-server start-server stop-server test-versioning test-versioning-quick test-versioning-comprehensive test-all clean logs check-deps

# Configuration
WEED_BINARY := ../../../weed/weed_binary
S3_PORT := 8333
MASTER_PORT := 9333
VOLUME_PORT := 8080
FILER_PORT := 8888
TEST_TIMEOUT := 10m
TEST_PATTERN := TestVersioning

# Default target
help:
	@echo "S3 API Test Makefile"
	@echo ""
	@echo "Available targets:"
	@echo "  help                    - Show this help message"
	@echo "  build-weed             - Build the SeaweedFS binary"
	@echo "  check-deps             - Check dependencies and build binary if needed"
	@echo "  start-server           - Start SeaweedFS server for testing"
	@echo "  start-server-simple    - Start server without process cleanup (for CI)"
	@echo "  stop-server            - Stop SeaweedFS server"
	@echo "  test-versioning        - Run all versioning tests"
	@echo "  test-versioning-quick  - Run core versioning tests only"
	@echo "  test-versioning-simple - Run tests without server management"
	@echo "  test-versioning-comprehensive - Run comprehensive versioning tests"
	@echo "  test-all               - Run all S3 API tests"
	@echo "  test-with-server       - Start server, run tests, stop server"
	@echo "  logs                   - Show server logs"
	@echo "  clean                  - Clean up test artifacts and stop server"
	@echo "  health-check           - Check if server is accessible"
	@echo ""
	@echo "Configuration:"
	@echo "  S3_PORT=${S3_PORT}"
	@echo "  TEST_TIMEOUT=${TEST_TIMEOUT}"

# Check dependencies
# Build the SeaweedFS binary
build-weed:
	@echo "Building SeaweedFS binary..."
	@cd ../../../weed && go build -o weed_binary .
	@chmod +x $(WEED_BINARY)
	@echo "✅ SeaweedFS binary built at $(WEED_BINARY)"

check-deps: build-weed
	@echo "Checking dependencies..."
	@echo "🔍 DEBUG: Checking Go installation..."
	@command -v go >/dev/null 2>&1 || (echo "Go is required but not installed" && exit 1)
	@echo "🔍 DEBUG: Go version: $$(go version)"
	@echo "🔍 DEBUG: Checking binary at $(WEED_BINARY)..."
	@test -f $(WEED_BINARY) || (echo "SeaweedFS binary not found at $(WEED_BINARY)" && exit 1)
	@echo "🔍 DEBUG: Binary size: $$(ls -lh $(WEED_BINARY) | awk '{print $$5}')"
	@echo "🔍 DEBUG: Binary permissions: $$(ls -la $(WEED_BINARY) | awk '{print $$1}')"
	@echo "🔍 DEBUG: Checking Go module dependencies..."
	@go list -m github.com/aws/aws-sdk-go-v2 >/dev/null 2>&1 || (echo "AWS SDK Go v2 not found. Run 'go mod tidy'." && exit 1)
	@go list -m github.com/stretchr/testify >/dev/null 2>&1 || (echo "Testify not found. Run 'go mod tidy'." && exit 1)
	@echo "✅ All dependencies are available"

# Start SeaweedFS server for testing
start-server: check-deps
	@echo "Starting SeaweedFS server..."
	@echo "🔍 DEBUG: Current working directory: $$(pwd)"
	@echo "🔍 DEBUG: Checking for existing weed processes..."
	@ps aux | grep weed | grep -v grep || echo "No existing weed processes found"
	@echo "🔍 DEBUG: Cleaning up any existing PID file..."
	@rm -f weed-server.pid
	@echo "🔍 DEBUG: Checking for port conflicts..."
	@if netstat -tlnp 2>/dev/null | grep $(S3_PORT) >/dev/null; then \
		echo "⚠️  Port $(S3_PORT) is already in use, trying to find the process..."; \
		netstat -tlnp 2>/dev/null | grep $(S3_PORT) || true; \
	else \
		echo "✅ Port $(S3_PORT) is available"; \
	fi
	@echo "🔍 DEBUG: Checking binary at $(WEED_BINARY)"
	@ls -la $(WEED_BINARY) || (echo "❌ Binary not found!" && exit 1)
	@echo "🔍 DEBUG: Checking config file at ../../../docker/compose/s3.json"
	@ls -la ../../../docker/compose/s3.json || echo "⚠️  Config file not found, continuing without it"
	@echo "🔍 DEBUG: Creating volume directory..."
	@mkdir -p ./test-volume-data
	@echo "🔍 DEBUG: Launching SeaweedFS server in background..."
	@echo "🔍 DEBUG: Command: $(WEED_BINARY) server -debug -s3 -s3.port=$(S3_PORT) -s3.allowEmptyFolder=false -s3.allowDeleteBucketNotEmpty=true -s3.config=../../../docker/compose/s3.json -filer -filer.maxMB=64 -master.volumeSizeLimitMB=50 -volume.max=100 -dir=./test-volume-data -volume.preStopSeconds=1 -metricsPort=9324"
	@$(WEED_BINARY) server \
		-debug \
		-s3 \
		-s3.port=$(S3_PORT) \
		-s3.allowEmptyFolder=false \
		-s3.allowDeleteBucketNotEmpty=true \
		-s3.config=../../../docker/compose/s3.json \
		-filer \
		-filer.maxMB=64 \
		-master.volumeSizeLimitMB=50 \
		-volume.max=100 \
		-dir=./test-volume-data \
		-volume.preStopSeconds=1 \
		-metricsPort=9324 \
		> weed-test.log 2>&1 & echo $$! > weed-server.pid
	@echo "🔍 DEBUG: Server PID: $$(cat weed-server.pid 2>/dev/null || echo 'PID file not found')"
	@echo "🔍 DEBUG: Checking if PID is still running..."
	@sleep 2
	@if [ -f weed-server.pid ]; then \
		SERVER_PID=$$(cat weed-server.pid); \
		ps -p $$SERVER_PID || echo "⚠️  Server PID $$SERVER_PID not found after 2 seconds"; \
	else \
		echo "⚠️  PID file not found"; \
	fi
	@echo "🔍 DEBUG: Waiting for server to start (up to 90 seconds)..."
	@for i in $$(seq 1 90); do \
		echo "🔍 DEBUG: Attempt $$i/90 - checking port $(S3_PORT)"; \
		if curl -s http://localhost:$(S3_PORT) >/dev/null 2>&1; then \
			echo "✅ SeaweedFS server started successfully on port $(S3_PORT) after $$i seconds"; \
			exit 0; \
		fi; \
		if [ $$i -eq 5 ]; then \
			echo "🔍 DEBUG: After 5 seconds, checking process and logs..."; \
			ps aux | grep weed | grep -v grep || echo "No weed processes found"; \
			if [ -f weed-test.log ]; then \
				echo "=== First server logs ==="; \
				head -20 weed-test.log; \
			fi; \
		fi; \
		if [ $$i -eq 15 ]; then \
			echo "🔍 DEBUG: After 15 seconds, checking port bindings..."; \
			netstat -tlnp 2>/dev/null | grep $(S3_PORT) || echo "Port $(S3_PORT) not bound"; \
			netstat -tlnp 2>/dev/null | grep 9333 || echo "Port 9333 not bound"; \
			netstat -tlnp 2>/dev/null | grep 8080 || echo "Port 8080 not bound"; \
		fi; \
		if [ $$i -eq 30 ]; then \
			echo "⚠️  Server taking longer than expected (30s), checking logs..."; \
			if [ -f weed-test.log ]; then \
				echo "=== Recent server logs ==="; \
				tail -20 weed-test.log; \
			fi; \
		fi; \
		sleep 1; \
	done; \
	echo "❌ Server failed to start within 90 seconds"; \
	echo "🔍 DEBUG: Final process check:"; \
	ps aux | grep weed | grep -v grep || echo "No weed processes found"; \
	echo "🔍 DEBUG: Final port check:"; \
	netstat -tlnp 2>/dev/null | grep -E "(8333|9333|8080)" || echo "No ports bound"; \
	echo "=== Full server logs ==="; \
	if [ -f weed-test.log ]; then \
		cat weed-test.log; \
	else \
		echo "No log file found"; \
	fi; \
	exit 1

# Stop SeaweedFS server
stop-server:
	@echo "Stopping SeaweedFS server..."
	@if [ -f weed-server.pid ]; then \
		SERVER_PID=$$(cat weed-server.pid); \
		echo "Killing server PID $$SERVER_PID"; \
		if ps -p $$SERVER_PID >/dev/null 2>&1; then \
			kill -TERM $$SERVER_PID 2>/dev/null || true; \
			sleep 2; \
			if ps -p $$SERVER_PID >/dev/null 2>&1; then \
				echo "Process still running, sending KILL signal..."; \
				kill -KILL $$SERVER_PID 2>/dev/null || true; \
				sleep 1; \
			fi; \
		else \
			echo "Process $$SERVER_PID not found (already stopped)"; \
		fi; \
		rm -f weed-server.pid; \
	else \
		echo "No PID file found, checking for running processes..."; \
		echo "⚠️  Skipping automatic process cleanup to avoid CI issues"; \
		echo "Note: Any remaining weed processes should be cleaned up by the CI environment"; \
	fi
	@echo "✅ SeaweedFS server stopped"

# Show server logs
logs:
	@if test -f weed-test.log; then \
		echo "=== SeaweedFS Server Logs ==="; \
		tail -f weed-test.log; \
	else \
		echo "No log file found. Server may not be running."; \
	fi

# Core versioning tests (equivalent to Python s3tests)
test-versioning-quick: check-deps
	@echo "Running core S3 versioning tests..."
	@go test -v -timeout=$(TEST_TIMEOUT) -run "TestBucketListReturnDataVersioning|TestVersioningBasicWorkflow|TestVersioningDeleteMarkers" .
	@echo "✅ Core versioning tests completed"

# All versioning tests
test-versioning: check-deps
	@echo "Running all S3 versioning tests..."
	@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" .
	@echo "✅ All versioning tests completed"

# Comprehensive versioning tests (including edge cases)
test-versioning-comprehensive: check-deps
	@echo "Running comprehensive S3 versioning tests..."
	@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -count=1
	@echo "✅ Comprehensive versioning tests completed"

# All S3 API tests
test-all: check-deps
	@echo "Running all S3 API tests..."
	@go test -v -timeout=$(TEST_TIMEOUT) ./...
	@echo "✅ All S3 API tests completed"

# Run tests with automatic server management
test-with-server: start-server
	@echo "🔍 DEBUG: Server started successfully, now running versioning tests..."
	@echo "🔍 DEBUG: Test pattern: $(TEST_PATTERN)"
	@echo "🔍 DEBUG: Test timeout: $(TEST_TIMEOUT)"
	@echo "Running versioning tests with managed server..."
	@trap "$(MAKE) stop-server" EXIT; \
	$(MAKE) test-versioning || (echo "❌ Tests failed, showing server logs:" && echo "=== Last 50 lines of server logs ===" && tail -50 weed-test.log && echo "=== End of server logs ===" && exit 1)
	@$(MAKE) stop-server
	@echo "✅ Tests completed and server stopped"

# Test with different configurations
test-versioning-with-configs: check-deps
	@echo "Testing with different S3 configurations..."
	@echo "Testing with empty folder allowed..."
	@$(WEED_BINARY) server -s3 -s3.port=$(S3_PORT) -s3.allowEmptyFolder=true -filer -master.volumeSizeLimitMB=100 -volume.max=100 > weed-test-config1.log 2>&1 & echo $$! > weed-config1.pid
	@sleep 5
	@go test -v -timeout=5m -run "TestVersioningBasicWorkflow" . || true
	@if [ -f weed-config1.pid ]; then kill -TERM $$(cat weed-config1.pid) 2>/dev/null || true; rm -f weed-config1.pid; fi
	@sleep 2
	@echo "Testing with delete bucket not empty disabled..."
	@$(WEED_BINARY) server -s3 -s3.port=$(S3_PORT) -s3.allowDeleteBucketNotEmpty=false -filer -master.volumeSizeLimitMB=100 -volume.max=100 > weed-test-config2.log 2>&1 & echo $$! > weed-config2.pid
	@sleep 5
	@go test -v -timeout=5m -run "TestVersioningBasicWorkflow" . || true
	@if [ -f weed-config2.pid ]; then kill -TERM $$(cat weed-config2.pid) 2>/dev/null || true; rm -f weed-config2.pid; fi
	@echo "✅ Configuration tests completed"

# Performance/stress testing
test-versioning-stress: check-deps
	@echo "Running stress tests for versioning..."
	@go test -v -timeout=20m -run "TestVersioningConcurrentOperations" . -count=5
	@echo "✅ Stress tests completed"

# Generate test reports
test-report: check-deps
	@echo "Generating test reports..."
	@mkdir -p reports
	@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -json > reports/test-results.json 2>&1 || true
	@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -coverprofile=reports/coverage.out 2>&1 || true
	@go tool cover -html=reports/coverage.out -o reports/coverage.html 2>/dev/null || true
	@echo "✅ Test reports generated in reports/ directory"

# Clean up test artifacts
clean:
	@echo "Cleaning up test artifacts..."
	@$(MAKE) stop-server
	@rm -f weed-test*.log weed-server.pid weed-config*.pid
	@rm -rf reports/
	@rm -rf test-volume-data/
	@go clean -testcache
	@echo "✅ Cleanup completed"

# Debug mode - start server with verbose logging
debug-server:
	@echo "Starting SeaweedFS server in debug mode..."
	@$(MAKE) stop-server
	@mkdir -p ./test-volume-data
	@$(WEED_BINARY) server \
		-debug \
		-s3 \
		-s3.port=$(S3_PORT) \
		-s3.allowEmptyFolder=false \
		-s3.allowDeleteBucketNotEmpty=true \
		-s3.config=../../../docker/compose/s3.json \
		-filer \
		-filer.maxMB=16 \
		-master.volumeSizeLimitMB=50 \
		-volume.max=100 \
		-dir=./test-volume-data \
		-volume.preStopSeconds=1 \
		-metricsPort=9324

# Run a single test for debugging
debug-test: check-deps
	@echo "Running single test for debugging..."
	@go test -v -timeout=5m -run "TestBucketListReturnDataVersioning" . -count=1

# Continuous testing (re-run tests on file changes)
watch-tests:
	@echo "Starting continuous testing (requires 'entr' command)..."
	@command -v entr >/dev/null 2>&1 || (echo "Install 'entr' for file watching: brew install entr (macOS) or apt-get install entr (Linux)" && exit 1)
	@find . -name "*.go" | entr -c $(MAKE) test-versioning-quick

# Install missing Go dependencies
install-deps:
	@echo "Installing Go dependencies..."
	@go mod download
	@go mod tidy
	@echo "✅ Dependencies installed"

# Validate test configuration
validate-config:
	@echo "Validating test configuration..."
	@test -f test_config.json || (echo "❌ test_config.json not found" && exit 1)
	@python3 -m json.tool test_config.json > /dev/null 2>&1 || (echo "❌ test_config.json is not valid JSON" && exit 1)
	@echo "✅ Configuration is valid"

# Quick health check
health-check:
	@echo "Running health check..."
	@curl -s http://localhost:$(S3_PORT) >/dev/null 2>&1 && echo "✅ S3 API is accessible" || echo "❌ S3 API is not accessible"
	@curl -s http://localhost:9324/metrics >/dev/null 2>&1 && echo "✅ Metrics endpoint is accessible" || echo "❌ Metrics endpoint is not accessible"

# Simple server start without process cleanup (for CI troubleshooting)
start-server-simple: check-deps
	@echo "Starting SeaweedFS server (simple mode)..."
	@$(WEED_BINARY) server \
		-debug \
		-s3 \
		-s3.port=$(S3_PORT) \
		-s3.allowEmptyFolder=false \
		-s3.allowDeleteBucketNotEmpty=true \
		-s3.config=../../../docker/compose/s3.json \
		-filer \
		-filer.maxMB=64 \
		-master.volumeSizeLimitMB=50 \
		-volume.max=100 \
		-volume.preStopSeconds=1 \
		-metricsPort=9324 \
		> weed-test.log 2>&1 & echo $$! > weed-server.pid
	@echo "Server PID: $$(cat weed-server.pid)"
	@echo "Waiting for server to start..."
	@sleep 10
	@curl -s http://localhost:$(S3_PORT) >/dev/null 2>&1 && echo "✅ Server started successfully" || echo "❌ Server failed to start"

# Simple test run without server management
test-versioning-simple: check-deps
	@echo "Running versioning tests (assuming server is already running)..."
	@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" .
	@echo "✅ Tests completed"

# Force cleanup all weed processes (use with caution)
force-cleanup:
	@echo "⚠️  Force cleaning up all weed processes..."
	@echo "This will attempt to kill ALL weed processes on the system"
	@ps aux | grep weed | grep -v grep || echo "No weed processes found"
	@killall -TERM weed_binary 2>/dev/null || echo "No weed_binary processes to terminate"
	@sleep 2
	@killall -KILL weed_binary 2>/dev/null || echo "No weed_binary processes to kill"
	@rm -f weed-server.pid weed-config*.pid
	@echo "✅ Force cleanup completed"

# Compare with Python s3tests (if available)
compare-python-tests:
	@echo "Comparing Go tests with Python s3tests..."
	@echo "Go test: TestBucketListReturnDataVersioning"
	@echo "Python equivalent: test_bucket_list_return_data_versioning"
	@echo ""
	@echo "Running Go version..."
	@time go test -v -run "TestBucketListReturnDataVersioning" . 2>&1 | grep -E "(PASS|FAIL|took)"