require File.expand_path('../spec_helper', __FILE__) module XcodeInstall describe '#fetch' do before do client = mock client.stubs(:cookie).returns('customCookie') Spaceship::PortalClient.stubs(:login).returns(client) end it 'downloads the file and calls the `progress_block` with the percentage' do installer = Installer.new xcode = XcodeInstall::Xcode.new('name' => 'Xcode 9.3', 'files' => [{ 'remotePath' => '/Developer_Tools/Xcode_9.3/Xcode_9.3.xip' }]) installer.stubs(:fetch_seedlist).returns([xcode]) stdin = 'stdin' stdout = 'stdout' stderr = 'stderr' wait_thr = 'wait_thr' stdin.stubs(:close) stdout.stubs(:close) stderr.stubs(:close) current_time = '123123' Time.stubs(:now).returns(current_time) xip_path = File.join(File.expand_path('~'), '/Library/Caches/XcodeInstall/Xcode_9.3.xip') progress_log_file = File.join(File.expand_path('~'), "/Library/Caches/XcodeInstall/progress.#{current_time}.progress") command = [ 'curl', '--cookie customCookie', '--cookie-jar /tmp/curl-cookies.txt', '--retry 3', '--location', '--continue-at -', "--output #{xip_path}", 'https://developer.apple.com/devcenter/download.action\\?path\\=/Developer_Tools/Xcode_9.3/Xcode_9.3.xip', "2> #{progress_log_file}" ] Open3.stubs(:popen3).with(command.join(' ')).returns([stdin, stdout, stderr, wait_thr]) wait_thr.stubs(:alive?).returns(true) thr_value = 'thr_value' wait_thr.stubs(:value).returns(thr_value) thr_value.stubs(:success?).returns(true) installer.stubs(:install_dmg).with(Pathname.new(xip_path), '-9.3', false, false) Thread.new do sleep(1) File.write(progress_log_file, ' 0 4766M 0 6835k 0 0 573k 0 2:21:58 0:00:11 2:21:47 902k') sleep(1) File.write(progress_log_file, ' 5 4766M 0 6835k 0 0 573k 0 2:21:58 0:00:11 2:21:47 902k') sleep(1) File.write(progress_log_file, '50 4766M 0 6835k 0 0 573k 0 2:21:58 0:00:11 2:21:47 902k') sleep(1) File.write(progress_log_file, '100 4766M 0 6835k 0 0 573k 0 2:21:58 0:00:11 2:21:47 902k') sleep(0.5) wait_thr.stubs(:alive?).returns(false) end percentages = [] installer.install_version( # version: the version to install '9.3', # `should_switch false, # `should_clean` false, # false for now for faster debugging # `should_install` true, # `progress` false, # `url` is nil, as we don't have a custom source nil, # `show_release_notes` is `false`, as this is a non-interactive machine false, # `progress_block` be updated on the download progress proc do |percent| percentages << percent end ) percentages.each do |current_percent| # Verify all reported percentages are between 0 and 100 current_percent.should.be.close(50, 50) end # Verify we got a good amount of percentages reported percentages.count.should.be.close(8, 4) end end end