Skip to content

Mooncake Testing Architecture

πŸ“š Other Docs: Index | Quick Reference | Testing Guide | Implementation

Overview Diagram

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Mooncake Test Infrastructure                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   LOCAL DEVELOPMENT      β”‚  β”‚        CI/CD (GitHub)            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Makefile Commands                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚make test  β”‚  β”‚make test-β”‚  β”‚make test-  β”‚  β”‚make test-all-β”‚ β”‚
β”‚  β”‚           β”‚  β”‚quick     β”‚  β”‚docker-all  β”‚  β”‚platforms     β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚             β”‚               β”‚                β”‚
         β–Ό             β–Ό               β–Ό                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Native    β”‚  β”‚           Docker Test Matrix                 β”‚
β”‚  Go Tests   β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  (10 sec)   β”‚  β”‚ Ubuntu   β”‚ Alpine   β”‚ Debian   β”‚   Fedora    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ 22.04    β”‚ 3.19     β”‚ 12       β”‚   39        β”‚
                 β”‚ 20.04    β”‚          β”‚          β”‚             β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚          β”‚          β”‚          β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚  test-runner.sh     β”‚
                        β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                        β”‚  β”‚ Smoke Tests    β”‚ β”‚
                        β”‚  β”‚ Integration    β”‚ β”‚
                        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

CI/CD Pipeline

GitHub Push
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    GitHub Actions Workflow                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  JOB: unit-tests (Matrix: 4 platforms)                    β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚ ubuntu-     β”‚ β”‚ macos-   β”‚ β”‚ macos-13 β”‚ β”‚ windows- β”‚  β”‚  β”‚
β”‚  β”‚  β”‚ latest      β”‚ β”‚ latest   β”‚ β”‚ (Intel)  β”‚ β”‚ latest   β”‚  β”‚  β”‚
β”‚  β”‚  β”‚ (x86_64)    β”‚ β”‚ (ARM)    β”‚ β”‚          β”‚ β”‚          β”‚  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  JOB: docker-tests (Matrix: 5 distros)                    β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”            β”‚  β”‚
β”‚  β”‚  β”‚Ubuntuβ”‚ β”‚Ubuntuβ”‚ β”‚Alpineβ”‚ β”‚Debianβ”‚ β”‚Fedoraβ”‚            β”‚  β”‚
β”‚  β”‚  β”‚22.04 β”‚ β”‚20.04 β”‚ β”‚ 3.19 β”‚ β”‚  12  β”‚ β”‚  39  β”‚            β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”˜            β”‚  β”‚
β”‚  β”‚     β”‚        β”‚        β”‚        β”‚        β”‚                 β”‚  β”‚
β”‚  β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚  β”‚
β”‚  β”‚                      β”‚                                     β”‚  β”‚
β”‚  β”‚              Smoke + Integration                           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  JOB: integration-tests (Needs: unit-tests)               β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚  β”‚
β”‚  β”‚  β”‚ ubuntu-     β”‚ β”‚ macos-   β”‚ β”‚ windows- β”‚               β”‚  β”‚
β”‚  β”‚  β”‚ latest      β”‚ β”‚ latest   β”‚ β”‚ latest   β”‚               β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                    β”‚                    β”‚
         β–Ό                    β–Ό                    β–Ό
    Pass               Pass               Pass

Test Fixture Organization

testing/fixtures/
β”œβ”€β”€ configs/
β”‚   β”œβ”€β”€ smoke/                    # Fast validation (<1 min total)
β”‚   β”‚   β”œβ”€β”€ 001-version-check.yml      # Binary works
β”‚   β”‚   β”œβ”€β”€ 002-simple-file.yml        # File operations
β”‚   β”‚   β”œβ”€β”€ 003-simple-shell.yml       # Shell execution
β”‚   β”‚   └── 004-simple-vars.yml        # Variables
β”‚   β”‚
β”‚   └── integration/              # Full features (5-10 min total)
β”‚       β”œβ”€β”€ 010-file-operations.yml    # Complete file workflow
β”‚       β”œβ”€β”€ 020-loops.yml              # Loop iteration
β”‚       β”œβ”€β”€ 030-conditionals.yml       # When conditions
β”‚       └── 040-shell-commands.yml     # Complex shell
β”‚
└── templates/
    └── test-template.j2          # Template rendering test

Docker Test Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Docker Test Process                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 1: Build Binary
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ env GOOS=linux GOARCH=amd64 \              β”‚
β”‚ go build -o out/mooncake-linux-amd64 ./cmd β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β–Ό
Step 2: Build Docker Image
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ docker build -f testing/docker/ubuntu.      β”‚
β”‚   Dockerfile -t mooncake-test-ubuntu .      β”‚
β”‚                                             β”‚
β”‚ Dockerfile:                                 β”‚
β”‚   - FROM ubuntu:22.04                       β”‚
β”‚   - Install: curl, git, sudo                β”‚
β”‚   - COPY binary β†’ /usr/local/bin/mooncake   β”‚
β”‚   - COPY test-runner.sh β†’ /test-runner.sh  β”‚
β”‚   - COPY fixtures/ β†’ /fixtures/             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β–Ό
Step 3: Run Tests
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ docker run --rm mooncake-test-ubuntu smoke  β”‚
β”‚                                             β”‚
β”‚ Container executes:                         β”‚
β”‚   /test-runner.sh smoke                     β”‚
β”‚      ↓                                      β”‚
β”‚   For each test in /fixtures/configs/smoke/β”‚
β”‚      mooncake run -c test.yml               β”‚
β”‚      Save results to /workspace/results/    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Test Runner Logic

test-runner.sh
β”œβ”€β”€ Verify mooncake binary exists
β”œβ”€β”€ Parse TEST_SUITE parameter (smoke|integration|all)
β”‚
β”œβ”€β”€ run_smoke_tests()
β”‚   β”œβ”€β”€ Find all *.yml in /fixtures/configs/smoke/
β”‚   β”œβ”€β”€ For each test:
β”‚   β”‚   β”œβ”€β”€ Run: mooncake run -c test.yml
β”‚   β”‚   β”œβ”€β”€ Capture output to results/
β”‚   β”‚   β”œβ”€β”€ Track pass/fail count
β”‚   β”‚   └── Print βœ“ or βœ—
β”‚   └── Return status
β”‚
β”œβ”€β”€ run_integration_tests()
β”‚   β”œβ”€β”€ Find all *.yml in /fixtures/configs/integration/
β”‚   β”œβ”€β”€ For each test:
β”‚   β”‚   β”œβ”€β”€ Run: mooncake run -c test.yml
β”‚   β”‚   β”œβ”€β”€ Capture output to results/
β”‚   β”‚   β”œβ”€β”€ Track pass/fail count
β”‚   β”‚   └── Print βœ“ or βœ—
β”‚   └── Return status
β”‚
└── Exit with appropriate code

Script Orchestration

make test-all-platforms
    β”œβ”€β”€ Run native Go tests
    β”‚   └── go test -v ./...
    β”‚
    └── Run Docker multi-distro tests
        └── scripts/test-docker-all.sh
            β”œβ”€β”€ Build Linux binary once
            β”œβ”€β”€ For each distro:
            β”‚   β”œβ”€β”€ scripts/test-docker.sh <distro>
            β”‚   β”‚   β”œβ”€β”€ Build Docker image
            β”‚   β”‚   └── Run container with test suite
            β”‚   └── Track pass/fail
            └── Print summary

Platform Coverage Matrix

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 β”‚ Local  β”‚  CI    β”‚ Docker  β”‚ Native       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Ubuntu 22.04    β”‚      β”‚      β”‚       β”‚              β”‚
β”‚ Ubuntu 20.04    β”‚      β”‚      β”‚       β”‚              β”‚
β”‚ Alpine 3.19     β”‚      β”‚      β”‚       β”‚              β”‚
β”‚ Debian 12       β”‚      β”‚      β”‚       β”‚              β”‚
β”‚ Fedora 39       β”‚      β”‚      β”‚       β”‚              β”‚
β”‚ macOS (ARM)     β”‚      β”‚      β”‚         β”‚            β”‚
β”‚ macOS (Intel)   β”‚      β”‚      β”‚         β”‚            β”‚
β”‚ Windows         β”‚        β”‚      β”‚         β”‚            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Legend:
   = Tested
  Local = Developer machine
  CI = GitHub Actions
  Docker = Container-based testing
  Native = Direct OS execution

Test Types and Timing

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Test Type    β”‚ Count       β”‚ Time    β”‚ Purpose              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Unit         β”‚ Per package β”‚ ~10s    β”‚ Go code validation   β”‚
β”‚ Smoke        β”‚ 4 tests     β”‚ ~30s    β”‚ Basic functionality  β”‚
β”‚ Integration  β”‚ 4 tests     β”‚ ~2-5m   β”‚ Feature validation   β”‚
β”‚ Full Suite   β”‚ All above   β”‚ ~15m    β”‚ Complete validation  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Smoke Tests:
  - Binary execution βœ“
  - File operations βœ“
  - Shell commands βœ“
  - Variables βœ“

Integration Tests:
  - File workflow βœ“
  - Loops βœ“
  - Conditionals βœ“
  - Complex shell βœ“

Directory Structure

mooncake/
β”‚
β”œβ”€β”€ .github/workflows/
β”‚   └── ci.yml ────────────────► CI/CD configuration
β”‚
β”œβ”€β”€ testing/
β”‚   β”œβ”€β”€ docker/ ───────────────► Dockerfiles (5 distros)
β”‚   β”œβ”€β”€ common/
β”‚   β”‚   └── test-runner.sh ────► Test orchestration
β”‚   β”œβ”€β”€ fixtures/
β”‚   β”‚   β”œβ”€β”€ configs/
β”‚   β”‚   β”‚   β”œβ”€β”€ smoke/ ────────► 4 smoke tests
β”‚   β”‚   β”‚   └── integration/ ──► 4 integration tests
β”‚   β”‚   └── templates/ ────────► Test templates
β”‚   β”œβ”€β”€ results/ ──────────────► Test outputs (gitignored)
β”‚   └── README.md ─────────────► Testing documentation
β”‚
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ test-docker.sh ────────► Single distro test
β”‚   β”œβ”€β”€ test-docker-all.sh ────► Multi-distro test
β”‚   β”œβ”€β”€ test-all-platforms.sh ─► Complete test suite
β”‚   └── run-integration-tests.sh β–Ί Integration runner
β”‚
β”œβ”€β”€ Makefile ──────────────────► Test targets
└── out/ ──────────────────────► Compiled binaries

Data Flow

Developer
    β”‚
    β”œβ”€β–Ί Edit Code
    β”‚       β”‚
    β”‚       β–Ό
    β”‚   make test ────► go test ./... ────► /
    β”‚
    β”œβ”€β–Ί make test-quick
    β”‚       β”‚
    β”‚       β”œβ”€β–Ί Build Linux binary
    β”‚       β”œβ”€β–Ί Build Docker image (Ubuntu)
    β”‚       β”œβ”€β–Ί Run smoke tests
    β”‚       └─► /
    β”‚
    β”œβ”€β–Ί make test-all-platforms
    β”‚       β”‚
    β”‚       β”œβ”€β–Ί go test ./...
    β”‚       β”œβ”€β–Ί Build Linux binary
    β”‚       β”œβ”€β–Ί For each distro:
    β”‚       β”‚   β”œβ”€β–Ί Build image
    β”‚       β”‚   └─► Run smoke + integration
    β”‚       └─► / Summary
    β”‚
    └─► git push
            β”‚
            β–Ό
        GitHub Actions
            β”‚
            β”œβ”€β–Ί unit-tests (4 platforms)
            β”œβ”€β–Ί docker-tests (5 distros)
            └─► integration-tests (3 platforms)
                    β”‚
                    β–Ό
                / Status

Success Metrics

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Testing Success Criteria               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                     β”‚
β”‚  ⚑ Fast Feedback                                   β”‚
β”‚    β€’ Local smoke: < 2 minutes                    β”‚
β”‚    β€’ CI complete: < 10 minutes                   β”‚
β”‚                                                     β”‚
β”‚  πŸ” Comprehensive Coverage                          β”‚
β”‚    β€’ 5 Linux distros tested                      β”‚
β”‚    β€’ macOS Intel + ARM                           β”‚
β”‚    β€’ Windows Server                              β”‚
β”‚                                                     β”‚
β”‚  πŸ‘¨β€πŸ’» Developer Experience                            β”‚
β”‚    β€’ Single command testing                      β”‚
β”‚    β€’ Clear documentation                         β”‚
β”‚    β€’ Easy to add tests                           β”‚
β”‚                                                     β”‚
β”‚   Quality Assurance                               β”‚
β”‚    β€’ Unit tests: >60% coverage                   β”‚
β”‚    β€’ Smoke tests: 4 scenarios                    β”‚
β”‚    β€’ Integration: 4 workflows                    β”‚
β”‚                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Future Architecture Enhancements

Potential Additions:
β”œβ”€β”€ ARM64 Linux Testing
β”‚   └── Add arm64 Docker builds
β”‚
β”œβ”€β”€ Performance Benchmarking
β”‚   β”œβ”€β”€ Benchmark suite
β”‚   └── Historical tracking
β”‚
β”œβ”€β”€ Test Result Dashboard
β”‚   β”œβ”€β”€ Web UI for results
β”‚   └── Trend analysis
β”‚
└── Extended Platform Support
    β”œβ”€β”€ FreeBSD
    β”œβ”€β”€ OpenBSD
    └── Additional Linux distros

Key Design Decisions

  1. Docker for Linux - Portable, reproducible, multi-distro support
  2. Native for macOS - Simplest, fastest, no containerization overhead
  3. CI-only for Windows - Avoid VM complexity, sufficient for validation
  4. Two-tier tests - Smoke (fast feedback) + Integration (thorough)
  5. Parallel execution - Maximize throughput in CI
  6. Cached layers - Docker caching for faster rebuilds
  7. Gitignored results - Keep repo clean, results are ephemeral
  8. Shell scripts - Portable, easy to debug, no extra dependencies

For detailed usage instructions, see: guide.md For quick reference, see: quick-reference.md