Repository navigation
255 lines (218 loc) · 7.94 KB
/
Copy pathtest-install.yml
File metadata and controls
255 lines (218 loc) · 7.94 KB
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
name: Test Install Script
on:
push:
paths:
- 'docs/public/install.sh'
- 'docs/public/uninstall.sh'
- 'scripts/test-install-arch.sh'
- 'scripts/test-install.sh'
- '.github/workflows/test-install.yml'
pull_request:
paths:
- 'docs/public/install.sh'
- 'docs/public/uninstall.sh'
- 'scripts/test-install-arch.sh'
- 'scripts/test-install.sh'
- '.github/workflows/test-install.yml'
workflow_dispatch:
jobs:
# Basic validation - shellcheck
validate:
name: Validate Scripts
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install shellcheck
run: |
if ! command -v shellcheck &> /dev/null; then
sudo apt-get update && sudo apt-get install -y shellcheck
fi
- name: Shellcheck install.sh
run: shellcheck docs/public/install.sh
- name: Shellcheck uninstall.sh
run: shellcheck docs/public/uninstall.sh
- name: Shellcheck test-install-arch.sh
run: shellcheck scripts/test-install-arch.sh
- name: Shellcheck test-install.sh
run: shellcheck scripts/test-install.sh
- name: Test install.sh architecture detection
run: ./scripts/test-install-arch.sh
- name: Test install.sh behavior (root warning, execution guard)
run: ./scripts/test-install.sh
# Test install.sh (v2 - user-local only)
test-install:
name: Test install.sh - ${{ matrix.os }}
needs: validate
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Test installation
run: |
./docs/public/install.sh
export PATH="$HOME/fvm/bin:$PATH"
fvm --version
- name: Test reinstall (idempotency)
run: |
./docs/public/install.sh
export PATH="$HOME/fvm/bin:$PATH"
fvm --version
- name: Test uninstall
run: |
export PATH="$HOME/fvm/bin:$PATH"
which fvm
./docs/public/install.sh --uninstall
# Verify uninstall - only bin/ should be removed
if [[ -d ~/fvm/bin ]]; then
echo "❌ FVM bin directory still exists after uninstall"
exit 1
fi
echo "✅ FVM successfully uninstalled"
- name: Test uninstall on clean system (idempotency)
run: ./docs/public/install.sh --uninstall
- name: Test specific version installation
run: |
# Install specific version (use a known stable version)
./docs/public/install.sh 3.2.1
# Verify correct version installed
export PATH="$HOME/fvm/bin:$PATH"
fvm_version=$(fvm --version)
echo "Installed version: $fvm_version"
# Version should contain 3.2.1
echo "$fvm_version" | grep -q "3.2.1" || { echo "❌ Wrong version installed"; exit 1; }
echo "✅ Specific version installation successful"
# Clean up for next tests
./docs/public/install.sh --uninstall
- name: Test custom install location (FVM_INSTALL_DIR)
run: |
export FVM_INSTALL_DIR="$HOME/fvm-install-test"
mkdir -p "$FVM_INSTALL_DIR/versions/stable"
echo "cached sdk" > "$FVM_INSTALL_DIR/versions/stable/marker"
./docs/public/install.sh
export PATH="$FVM_INSTALL_DIR/bin:$PATH"
fvm --version
./docs/public/install.sh --uninstall
# Verify uninstall - only bin/ should be removed
if [[ -d "$FVM_INSTALL_DIR/bin" ]]; then
echo "❌ FVM bin directory still exists after uninstall"
exit 1
fi
# Cached SDKs should survive
if [[ ! -f "$FVM_INSTALL_DIR/versions/stable/marker" ]]; then
echo "❌ Cached SDKs were deleted!"
exit 1
fi
echo "✅ Custom install location test successful"
# Test v1 to v2 migration
test-migration:
name: Test v1 to v2 Migration
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Simulate v1 installation
run: |
# Create old v1 structure
mkdir -p ~/.fvm_flutter/bin
echo '#!/bin/bash' > ~/.fvm_flutter/bin/fvm
echo 'echo "fake v1 fvm"' >> ~/.fvm_flutter/bin/fvm
chmod +x ~/.fvm_flutter/bin/fvm
# Create old system symlink (if sudo available)
if command -v sudo >/dev/null 2>&1; then
sudo ln -sf ~/.fvm_flutter/bin/fvm /usr/local/bin/fvm
echo "SYSTEM_SYMLINK_CREATED=true" >> $GITHUB_ENV
echo "✅ Created system symlink"
else
echo "SYSTEM_SYMLINK_CREATED=false" >> $GITHUB_ENV
echo "ℹ️ Skipping system symlink (no sudo)"
fi
# Create some cached SDKs (should survive)
mkdir -p ~/fvm/versions/stable
echo "cached sdk" > ~/fvm/versions/stable/marker
echo "✅ v1 simulation ready"
ls -la ~/.fvm_flutter/bin/
ls -la ~/fvm/versions/
- name: Run v3 installer (triggers migration)
run: |
./docs/public/install.sh
echo "✅ Installation complete"
- name: Verify migration
run: |
# Old user directory should be removed
if [ -d ~/.fvm_flutter ]; then
echo "❌ Old ~/.fvm_flutter still exists"
exit 1
fi
echo "✅ Old user directory removed"
# Check system symlink only if it was created
if [ "$SYSTEM_SYMLINK_CREATED" = "true" ]; then
if [ -e /usr/local/bin/fvm ]; then
echo "⚠️ Old symlink still exists (may need sudo to remove)"
else
echo "✅ Old system symlink removed"
fi
else
echo "ℹ️ System symlink test skipped (wasn't created)"
fi
# New binary should exist
if [ ! -f ~/fvm/bin/fvm ]; then
echo "❌ New binary not found at ~/fvm/bin/fvm"
exit 1
fi
echo "✅ New binary installed at ~/fvm/bin/fvm"
# Cached SDKs should survive
if [ ! -f ~/fvm/versions/stable/marker ]; then
echo "❌ Cached SDKs were deleted!"
exit 1
fi
echo "✅ Cached SDKs preserved"
# Verify binary works
~/fvm/bin/fvm --version
echo "✅ Migration test complete"
# Test install.sh in container (root allowed with warning)
test-container:
name: Test install.sh in Container
needs: validate
runs-on: ubuntu-latest
container: ubuntu:latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: apt-get update && apt-get install -y curl tar gzip
- name: Test container root install (should warn but succeed)
run: |
output=$(./docs/public/install.sh 2>&1)
echo "$output"
# Should show warning
if echo "$output" | grep -q "Running as root"; then
echo "✅ Root warning displayed"
else
echo "❌ Expected root warning"
exit 1
fi
# Should still succeed
$HOME/fvm/bin/fvm --version
echo "✅ Container install successful"
# Test install.sh root permissions (warns but allows)
test-permissions:
name: Test install.sh Root Warning
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Test root shows warning but succeeds
run: |
output=$(sudo -H ./docs/public/install.sh 2>&1)
echo "$output"
# Should show warning
if echo "$output" | grep -q "Running as root"; then
echo "✅ Root warning displayed"
else
echo "❌ Expected root warning"
exit 1
fi
# Should succeed
sudo -H /root/fvm/bin/fvm --version
echo "✅ Root install successful"