@@ -3,7 +3,7 @@ use std::path::PathBuf;
33
44use crate :: downloads:: read_redirect_from_link;
55use crate :: files:: compose_driver_path_in_cache;
6- use crate :: manager:: { BrowserManager , detect_browser_version} ;
6+ use crate :: manager:: { BrowserManager , detect_browser_version, get_minor_version } ;
77use crate :: manager:: ARCH :: { ARM64 , X32 } ;
88use crate :: manager:: OS :: { MACOS , WINDOWS } ;
99use crate :: metadata:: { create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata} ;
@@ -71,9 +71,14 @@ impl BrowserManager for FirefoxManager {
7171 }
7272
7373 fn get_driver_url ( & self , driver_version : & str , os : & str , arch : & str ) -> String {
74+ // As of 0.32.0, geckodriver ships aarch64 binaries for Linux and Windows
75+ // https://github.com/mozilla/geckodriver/releases/tag/v0.32.0
76+ let minor_driver_version = get_minor_version ( driver_version) . parse :: < i32 > ( ) . unwrap ( ) ;
7477 let driver_label = if WINDOWS . is ( os) {
7578 if X32 . is ( arch) {
7679 "win32.zip"
80+ } else if ARM64 . is ( arch) && minor_driver_version > 31 {
81+ "win-aarch64.zip"
7782 } else {
7883 "win64.zip"
7984 }
@@ -85,16 +90,21 @@ impl BrowserManager for FirefoxManager {
8590 }
8691 } else if X32 . is ( arch) {
8792 "linux32.tar.gz"
93+ } else if ARM64 . is ( arch) && minor_driver_version > 31 {
94+ "linux-aarch64.tar.gz"
8895 } else {
8996 "linux64.tar.gz"
9097 } ;
9198 format ! ( "{}download/v{}/{}-v{}-{}" , DRIVER_URL , driver_version, self . driver_name, driver_version, driver_label)
9299 }
93100
94101 fn get_driver_path_in_cache ( & self , driver_version : & str , os : & str , arch : & str ) -> PathBuf {
102+ let minor_driver_version = get_minor_version ( driver_version) . parse :: < i32 > ( ) . unwrap ( ) ;
95103 let arch_folder = if WINDOWS . is ( os) {
96104 if X32 . is ( arch) {
97105 "win32"
106+ } else if ARM64 . is ( arch) && minor_driver_version > 31 {
107+ "win-arm64"
98108 } else {
99109 "win64"
100110 }
@@ -106,9 +116,47 @@ impl BrowserManager for FirefoxManager {
106116 }
107117 } else if X32 . is ( arch) {
108118 "linux32"
119+ } else if ARM64 . is ( arch) && minor_driver_version > 31 {
120+ "linux-arm64"
109121 } else {
110122 "linux64"
111123 } ;
112124 compose_driver_path_in_cache ( self . driver_name , os, arch_folder, driver_version)
113125 }
114126}
127+
128+ #[ cfg( test) ]
129+ mod unit_tests {
130+ use super :: * ;
131+
132+ #[ test]
133+ fn test_driver_url ( ) {
134+ let firefox_manager = FirefoxManager :: new ( ) ;
135+
136+ let data = vec ! (
137+ vec!( "0.32.0" , "linux" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux32.tar.gz" ) ,
138+ vec!( "0.32.0" , "linux" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux64.tar.gz" ) ,
139+ vec!( "0.32.0" , "linux" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux-aarch64.tar.gz" ) ,
140+ vec!( "0.32.0" , "windows" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-win32.zip" ) ,
141+ vec!( "0.32.0" , "windows" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-win64.zip" ) ,
142+ vec!( "0.32.0" , "windows" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-win-aarch64.zip" ) ,
143+ vec!( "0.32.0" , "macos" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-macos.tar.gz" ) ,
144+ vec!( "0.32.0" , "macos" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-macos.tar.gz" ) ,
145+ vec!( "0.32.0" , "macos" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-macos-aarch64.tar.gz" ) ,
146+ vec!( "0.31.0" , "linux" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux32.tar.gz" ) ,
147+ vec!( "0.31.0" , "linux" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz" ) ,
148+ vec!( "0.31.0" , "linux" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz" ) ,
149+ vec!( "0.31.0" , "windows" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-win32.zip" ) ,
150+ vec!( "0.31.0" , "windows" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-win64.zip" ) ,
151+ vec!( "0.31.0" , "windows" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-win64.zip" ) ,
152+ vec!( "0.31.0" , "macos" , "x86" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-macos.tar.gz" ) ,
153+ vec!( "0.31.0" , "macos" , "x86_64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-macos.tar.gz" ) ,
154+ vec!( "0.31.0" , "macos" , "aarch64" , "https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-macos-aarch64.tar.gz" ) ,
155+ ) ;
156+
157+ data. iter ( ) . for_each ( |d| {
158+ let driver_url = firefox_manager. get_driver_url ( d. get ( 0 ) . unwrap ( ) , d. get ( 1 ) . unwrap ( ) , d. get ( 2 ) . unwrap ( ) ) ;
159+ assert_eq ! ( d. get( 3 ) . unwrap( ) . to_string( ) , driver_url) ;
160+ } ) ;
161+ }
162+ }
0 commit comments