Skip to content

Commit 8bf7da9

Browse files
committed
test windows ci
Signed-off-by: Andrei Gherghescu <[email protected]>
1 parent d6f822f commit 8bf7da9

File tree

5 files changed

+459
-27
lines changed

5 files changed

+459
-27
lines changed

.github/workflows/ci.yml

Lines changed: 319 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ jobs:
7070
strategy:
7171
fail-fast: false
7272
matrix:
73-
os: [ubuntu-latest, windows-latest, macos-latest]
73+
# os: [ubuntu-latest, windows-latest, macos-latest]
74+
os: [ubuntu-latest, macos-latest]
7475
runs-on: ${{ matrix.os }}
7576
steps:
7677
- name: Setup Chrome
@@ -145,6 +146,323 @@ jobs:
145146
targets: wasm32-unknown-unknown
146147
- run: cd ${{ github.workspace }}/examples/wasm-yew/${{ matrix.example }} && cargo build --target wasm32-unknown-unknown
147148

149+
test_static_export_chrome:
150+
name: Test Static Export with Chrome (Windows)
151+
runs-on: windows-latest
152+
timeout-minutes: 30
153+
steps:
154+
- uses: actions/checkout@v4
155+
156+
- name: Setup Chrome and chromedriver
157+
id: setup-chrome
158+
uses: browser-actions/setup-chrome@v1
159+
with:
160+
chrome-version: 'latest'
161+
install-chromedriver: true
162+
163+
- uses: dtolnay/rust-toolchain@stable
164+
165+
- name: Cache cargo registry
166+
uses: actions/cache@v4
167+
with:
168+
path: |
169+
~/.cargo/registry/index/
170+
~/.cargo/registry/cache/
171+
~/.cargo/git/db/
172+
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
173+
restore-keys: |
174+
${{ runner.os }}-cargo-registry-
175+
176+
- name: Debug - Show setup-chrome outputs
177+
run: |
178+
Write-Host "=== Setup Chrome Action Outputs ==="
179+
Write-Host "chrome-version: ${{ steps.setup-chrome.outputs.chrome-version }}"
180+
Write-Host "chrome-path: ${{ steps.setup-chrome.outputs.chrome-path }}"
181+
Write-Host "chromedriver-version: ${{ steps.setup-chrome.outputs.chromedriver-version }}"
182+
Write-Host "chromedriver-path: ${{ steps.setup-chrome.outputs.chromedriver-path }}"
183+
Write-Host "================================"
184+
185+
- name: Debug - System information
186+
run: |
187+
Write-Host "=== System Information ==="
188+
Write-Host "OS Version: $(Get-ComputerInfo | Select-Object -ExpandProperty WindowsProductName)"
189+
Write-Host "Architecture: $(Get-ComputerInfo | Select-Object -ExpandProperty OsArchitecture)"
190+
Write-Host "Available memory: $((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB) MB"
191+
Write-Host "=========================="
192+
193+
- name: Debug - Check Chrome and chromedriver installation
194+
run: |
195+
Write-Host "=== Chrome and Chromedriver Check ==="
196+
197+
# Check if Chrome is in PATH
198+
try {
199+
$chromeVersion = & chrome.exe --version 2>$null
200+
Write-Host "Chrome in PATH: $chromeVersion"
201+
} catch {
202+
Write-Host "Chrome not found in PATH"
203+
}
204+
205+
# Check if chromedriver is in PATH
206+
try {
207+
$chromedriverVersion = & chromedriver.exe --version 2>$null
208+
Write-Host "Chromedriver in PATH: $chromedriverVersion"
209+
} catch {
210+
Write-Host "Chromedriver not found in PATH"
211+
}
212+
213+
# Check specific paths from action outputs
214+
$chromePath = "${{ steps.setup-chrome.outputs.chrome-path }}"
215+
$chromedriverPath = "${{ steps.setup-chrome.outputs.chromedriver-path }}"
216+
217+
Write-Host "Chrome path from action: $chromePath"
218+
Write-Host "Chromedriver path from action: $chromedriverPath"
219+
220+
if (Test-Path $chromePath) {
221+
Write-Host "Chrome file exists: $(Get-Item $chromePath | Select-Object -ExpandProperty FullName)"
222+
Write-Host "Chrome file size: $((Get-Item $chromePath).Length) bytes"
223+
} else {
224+
Write-Host "Chrome file does not exist at specified path"
225+
}
226+
227+
if (Test-Path $chromedriverPath) {
228+
Write-Host "Chromedriver file exists: $(Get-Item $chromedriverPath | Select-Object -ExpandProperty FullName)"
229+
Write-Host "Chromedriver file size: $((Get-Item $chromedriverPath).Length) bytes"
230+
231+
# Test if chromedriver is executable
232+
try {
233+
$testResult = & $chromedriverPath --version 2>&1
234+
Write-Host "Chromedriver executable test: $testResult"
235+
} catch {
236+
Write-Host "Chromedriver executable test failed: $_"
237+
}
238+
} else {
239+
Write-Host "Chromedriver file does not exist at specified path"
240+
}
241+
242+
# Try to find chromedriver in common locations
243+
Write-Host "=== Searching for chromedriver in common locations ==="
244+
$commonPaths = @(
245+
"C:\Program Files\Google\Chrome\Application\chromedriver.exe",
246+
"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",
247+
"$env:USERPROFILE\AppData\Local\Google\Chrome\Application\chromedriver.exe",
248+
"$env:PROGRAMFILES\Google\Chrome\Application\chromedriver.exe",
249+
"$env:PROGRAMFILES(X86)\Google\Chrome\Application\chromedriver.exe"
250+
)
251+
252+
foreach ($path in $commonPaths) {
253+
if (Test-Path $path) {
254+
Write-Host "Found chromedriver at: $path"
255+
try {
256+
$version = & $path --version 2>&1
257+
Write-Host " Version: $version"
258+
} catch {
259+
Write-Host " Version check failed: $_"
260+
}
261+
}
262+
}
263+
264+
Write-Host "================================"
265+
266+
- name: Debug - Check Rust toolchain and dependencies
267+
run: |
268+
Write-Host "=== Rust Toolchain Check ==="
269+
rustc --version
270+
cargo --version
271+
Write-Host "Current directory: $(Get-Location)"
272+
Write-Host "Workspace contents:"
273+
Get-ChildItem -Name | Sort-Object
274+
Write-Host "=========================="
275+
276+
- name: Debug - Check plotly_static package
277+
run: |
278+
Write-Host "=== Plotly Static Package Check ==="
279+
cd plotly_static
280+
Write-Host "Package contents:"
281+
Get-ChildItem -Name | Sort-Object
282+
Write-Host "Cargo.toml contents:"
283+
Get-Content Cargo.toml
284+
Write-Host "================================"
285+
286+
- name: Debug - Test chromedriver functionality
287+
run: |
288+
Write-Host "=== Testing Chromedriver Functionality ==="
289+
290+
# Test if chromedriver is in PATH and working
291+
try {
292+
$chromedriverVersion = & chromedriver.exe --version 2>&1
293+
Write-Host "Chromedriver in PATH: $chromedriverVersion"
294+
295+
# Try to start chromedriver in background
296+
Write-Host "Testing chromedriver startup..."
297+
$process = Start-Process -FilePath "chromedriver.exe" -ArgumentList "--port=4444" -PassThru -WindowStyle Hidden
298+
Start-Sleep -Seconds 3
299+
300+
# Check if it's running
301+
$isRunning = Get-Process -Name "chromedriver" -ErrorAction SilentlyContinue
302+
if ($isRunning) {
303+
Write-Host "Chromedriver started successfully, PID: $($process.Id)"
304+
305+
# Test WebDriver status endpoint
306+
try {
307+
$response = Invoke-WebRequest -Uri "http://localhost:4444/status" -TimeoutSec 5
308+
Write-Host "WebDriver status response: $($response.StatusCode)"
309+
Write-Host "Response content: $($response.Content)"
310+
} catch {
311+
Write-Host "WebDriver status check failed: $_"
312+
}
313+
314+
# Stop the process
315+
Stop-Process -Id $process.Id -Force
316+
Write-Host "Chromedriver stopped"
317+
} else {
318+
Write-Host "Chromedriver failed to start"
319+
}
320+
} catch {
321+
Write-Host "Chromedriver test failed: $_"
322+
}
323+
324+
Write-Host "================================"
325+
326+
- name: Debug - Test Rust WebDriver spawning
327+
run: |
328+
Write-Host "=== Testing Rust WebDriver Spawning ==="
329+
330+
# Set environment variables
331+
$env:WEBDRIVER_PATH = "${{ steps.setup-chrome.outputs.chromedriver-path }}"
332+
$env:CHROME_PATH = "${{ steps.setup-chrome.outputs.chrome-path }}"
333+
$env:RUST_LOG = "debug"
334+
$env:RUST_BACKTRACE = "1"
335+
336+
Write-Host "Environment variables:"
337+
Write-Host "WEBDRIVER_PATH: $env:WEBDRIVER_PATH"
338+
Write-Host "CHROME_PATH: $env:CHROME_PATH"
339+
340+
# Try to compile and run a simple test
341+
Write-Host "Compiling simple WebDriver test..."
342+
cd plotly_static
343+
344+
# Try to run a simple WebDriver test
345+
try {
346+
Write-Host "Testing WebDriver creation with cargo test..."
347+
cargo test --verbose --package plotly_static --features chromedriver tests::save_png -- --nocapture
348+
} catch {
349+
Write-Host "Simple WebDriver test failed: $_"
350+
}
351+
352+
Write-Host "================================"
353+
354+
- name: Debug - Pre-update cargo index
355+
run: |
356+
Write-Host "=== Pre-update Cargo Index Check ==="
357+
Write-Host "Current cargo index status:"
358+
cargo search --limit 1 plotly 2>&1 | Select-String -Pattern "Updating|Downloading|error" || Write-Host "Index seems up to date"
359+
Write-Host "================================"
360+
361+
- name: Update cargo index (if needed)
362+
run: |
363+
Write-Host "=== Updating Cargo Index ==="
364+
# Force update the index with a timeout
365+
$timeout = 300 # 5 minutes
366+
$job = Start-Job -ScriptBlock {
367+
cargo update --dry-run
368+
}
369+
370+
try {
371+
Wait-Job $job -Timeout $timeout
372+
$result = Receive-Job $job
373+
Write-Host "Cargo update result: $result"
374+
if ($job.State -eq "Completed") {
375+
Write-Host "Cargo index updated successfully"
376+
} else {
377+
Write-Host "Cargo index update timed out, continuing anyway"
378+
Stop-Job $job
379+
}
380+
} catch {
381+
Write-Host "Cargo index update failed: $_"
382+
Write-Host "Continuing with test anyway..."
383+
} finally {
384+
if ($job) {
385+
Remove-Job $job -Force -ErrorAction SilentlyContinue
386+
}
387+
}
388+
Write-Host "================================"
389+
390+
- name: Pre-compile dependencies
391+
run: |
392+
Write-Host "=== Pre-compiling Dependencies ==="
393+
394+
# Set environment variables
395+
$env:WEBDRIVER_PATH = "${{ steps.setup-chrome.outputs.chromedriver-path }}"
396+
$env:CHROME_PATH = "${{ steps.setup-chrome.outputs.chrome-path }}"
397+
$env:RUST_LOG = "debug"
398+
$env:RUST_BACKTRACE = "1"
399+
400+
Write-Host "Pre-compiling plotly_static with features..."
401+
# Note: We don't need webdriver_download feature since chromedriver is already installed
402+
cargo check --verbose --package plotly_static --features chromedriver
403+
404+
Write-Host "Dependencies pre-compiled successfully"
405+
406+
- name: Run PNG export test with Chrome
407+
run: |
408+
Write-Host "=== Starting PNG Export Test ==="
409+
410+
# Try to find chromedriver if action output path doesn't work
411+
$chromedriverPath = "${{ steps.setup-chrome.outputs.chromedriver-path }}"
412+
if (-not (Test-Path $chromedriverPath)) {
413+
Write-Host "Action output chromedriver path not found, searching for alternatives..."
414+
415+
# Try common locations
416+
$commonPaths = @(
417+
"C:\Program Files\Google\Chrome\Application\chromedriver.exe",
418+
"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",
419+
"$env:USERPROFILE\AppData\Local\Google\Chrome\Application\chromedriver.exe",
420+
"$env:PROGRAMFILES\Google\Chrome\Application\chromedriver.exe",
421+
"$env:PROGRAMFILES(X86)\Google\Chrome\Application\chromedriver.exe"
422+
)
423+
424+
foreach ($path in $commonPaths) {
425+
if (Test-Path $path) {
426+
Write-Host "Using chromedriver from: $path"
427+
$chromedriverPath = $path
428+
break
429+
}
430+
}
431+
}
432+
433+
# Set environment variables - WEBDRIVER_PATH should point to directory, not full path
434+
$env:WEBDRIVER_PATH = Split-Path -Parent $chromedriverPath
435+
$env:CHROME_PATH = "${{ steps.setup-chrome.outputs.chrome-path }}"
436+
$env:RUST_LOG = "debug"
437+
$env:RUST_BACKTRACE = "1"
438+
439+
Write-Host "Environment variables set:"
440+
Write-Host "WEBDRIVER_PATH: $env:WEBDRIVER_PATH"
441+
Write-Host "CHROME_PATH: $env:CHROME_PATH"
442+
Write-Host "RUST_LOG: $env:RUST_LOG"
443+
Write-Host "RUST_BACKTRACE: $env:RUST_BACKTRACE"
444+
445+
# Verify the paths exist
446+
if (-not (Test-Path $env:WEBDRIVER_PATH)) {
447+
Write-Error "Chromedriver not found at: $env:WEBDRIVER_PATH"
448+
Write-Host "Available chromedriver locations:"
449+
Get-ChildItem -Path "C:\Program Files\Google\Chrome\Application\" -Name "chromedriver*" -ErrorAction SilentlyContinue
450+
Get-ChildItem -Path "C:\Program Files (x86)\Google\Chrome\Application\" -Name "chromedriver*" -ErrorAction SilentlyContinue
451+
exit 1
452+
}
453+
if (-not (Test-Path $env:CHROME_PATH)) {
454+
Write-Error "Chrome not found at: $env:CHROME_PATH"
455+
exit 1
456+
}
457+
458+
Write-Host "All paths verified, starting cargo test..."
459+
460+
# Run the test directly without PowerShell job complexity
461+
# Note: We don't need webdriver_download feature since chromedriver is already installed
462+
cargo test --verbose --package plotly_static --features chromedriver tests::save_png -- --nocapture
463+
464+
Write-Host "=== PNG Export Test Completed ==="
465+
148466
build_book:
149467
name: Build Book
150468
runs-on: ubuntu-latest

plotly_static/build.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ use webdriver_downloader::prelude::*;
1212
#[cfg(all(feature = "geckodriver", feature = "chromedriver"))]
1313
compile_error!("Only one of 'geckodriver' or 'chromedriver' features can be enabled at a time.");
1414

15+
// Enforce that at least one driver feature is enabled
16+
#[cfg(not(any(feature = "geckodriver", feature = "chromedriver")))]
17+
compile_error!("At least one of 'geckodriver' or 'chromedriver' features must be enabled.");
18+
1519
// Define the WEBDRIVER_BIN constant based on the enabled feature
1620
#[cfg(feature = "geckodriver")]
1721
const WEBDRIVER_BIN: &str = "geckodriver";
@@ -61,28 +65,28 @@ fn user_bin_dir() -> PathBuf {
6165

6266
/// Check if a driver is already installed at the given path from environment
6367
/// variable
64-
fn is_webdriver_available(env_var: &str, executable_name: &str) -> bool {
68+
fn is_webdriver_available(env_var: &str, bin_name: &str) -> bool {
6569
// First check environment variable path
6670
if let Ok(path) = env::var(env_var) {
67-
let exe_path = if cfg!(windows) && !path.to_lowercase().ends_with(".exe") {
71+
let bin_path = if cfg!(target_os = "windows") && !path.to_lowercase().ends_with(".exe") {
6872
format!("{path}{DRIVER_EXT}")
6973
} else {
7074
path
7175
};
72-
let exe = Path::new(&exe_path);
76+
let exe = Path::new(&bin_path);
7377
if exe.exists() && exe.is_file() {
74-
println!("{executable_name} found at path specified in {env_var}: {exe_path}");
78+
println!("{bin_name} found at path specified in {env_var}: {bin_path}");
7579
return true;
7680
}
7781
}
7882

7983
// Check if webdriver exists in user's bin directory
8084
let bin_dir = user_bin_dir();
81-
let bin_path = bin_dir.join(format!("{executable_name}{DRIVER_EXT}"));
85+
let bin_path = bin_dir.join(format!("{bin_name}{DRIVER_EXT}"));
8286
if bin_path.exists() && bin_path.is_file() {
8387
println!(
8488
"{} found in user's bin directory: {}",
85-
executable_name,
89+
bin_name,
8690
bin_path.display()
8791
);
8892
println!(
@@ -332,6 +336,12 @@ fn main() -> Result<()> {
332336
};
333337
setup_driver(&config)?;
334338
}
339+
340+
// Handle case where no specific driver feature is enabled
341+
#[cfg(not(any(feature = "chromedriver", feature = "geckodriver")))]
342+
{
343+
println!("cargo::warning=No specific driver feature enabled, skipping driver setup");
344+
}
335345
} else {
336346
let msg = format!("'webdriver_download' feature disabled. Please install a {GECKODRIVER_PATH_ENV} or {CHROMEDRIVER_PATH_ENV} version manually and make the environment variable 'WEBDRIVER_PATH' point to it.");
337347
println!("cargo::warning={msg}");

0 commit comments

Comments
 (0)