Class: Fastlane::FirebaseTestRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb

Constant Summary collapse

VALID_TEST_TYPES =
%w[instrumentation robo].freeze

Class Method Summary collapse

Class Method Details

.download_file(file:, destination:) ⇒ Object

Download a Google Cloud Storage file to the local machine, creating intermediate directories as needed.

Parameters:

  • file (Google::Cloud::Storage::File)

    Usually provided via ‘bucket.files`.

  • destination (String)

    The local directory to store the file. It will retain its original name.



87
88
89
90
91
92
93
94
95
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 87

def self.download_file(file:, destination:)
  destination = File.join(destination, file.name)
  FileUtils.mkdir_p(File.dirname(destination))

  # Print our progress
  UI.message(file.name)

  file.download(destination)
end

.download_result_files(result:, destination:, project_id:, key_file_path:) ⇒ Object

Downloads all files associated with a Firebase Test Run to the local machine.

Parameters:

  • result (FirebaseTestLabResult)

    The result bundle for a given test run.

  • destination (String)

    The local directory to store all downloaded files.

  • project_id (String)

    The Google Cloud Project ID – required for Google Cloud Storage access.

  • key_file_path (String)

    The path to the key file – required for Google Cloud Storage access.



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 60

def self.download_result_files(result:, destination:, project_id:, key_file_path:)
  UI.user_error! 'You must pass a `FirebaseTestLabResult` to this method' unless result.is_a? Fastlane::FirebaseTestLabResult

  paths = result.raw_results_paths
  UI.user_error! "Log File doesn't contain a raw results URL" if paths.nil?

  FileUtils.mkdir_p(destination) unless File.directory?(destination)

  storage = Google::Cloud::Storage.new(
    project_id: project_id,
    credentials: key_file_path
  )

  # Set up the download
  bucket = storage.bucket(paths[:bucket])
  files_to_download = bucket.files(prefix: paths[:prefix])

  # Download the files
  UI.header "Downloading Results Files to #{destination}"
  files_to_download.each { |file| download_file(file: file, destination: destination) }
end

.preflight(verify_gcloud_binary: true, verify_logged_in: true) ⇒ Object



12
13
14
15
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 12

def self.preflight(verify_gcloud_binary: true, verify_logged_in: true)
  verify_has_gcloud_binary! if verify_gcloud_binary
  verify_logged_in! if verify_logged_in
end

.run_tests(project_id:, apk_path:, test_apk_path:, device:, test_targets: nil, type: 'instrumentation') ⇒ Object

Run a given APK and Test Bundle on the given device type.

Parameters:

  • project_id (String)

    The Google Firebase Console Project ID.

  • apk_path (String)

    Path to the application APK on disk.

  • test_apk_path (String)

    Path to the test runner APK on disk.

  • device (FirebaseDevice)

    The virtual device to run tests on.

  • type (String) (defaults to: 'instrumentation')

    The type of test to run.



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
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 25

def self.run_tests(project_id:, apk_path:, test_apk_path:, device:, test_targets: nil, type: 'instrumentation')
  raise "Unable to find apk: #{apk_path}" unless File.file?(apk_path)
  raise "Unable to find apk: #{test_apk_path}" unless File.file?(test_apk_path)
  raise "Invalid Type: #{type}" unless VALID_TEST_TYPES.include?(type)

  params = {
    project: project_id,
    type: type,
    app: apk_path,
    test: test_apk_path,
    'test-targets': test_targets,
    device: device.to_s,
    verbosity: 'info'
  }.compact.flat_map { |k, v| ["--#{k}", v] }
  command = Shellwords.join(['gcloud', 'firebase', 'test', 'android', 'run', *params])

  log_file_path = Fastlane::Actions.lane_context[:FIREBASE_TEST_LOG_FILE_PATH]

  UI.message "Streaming log output to #{log_file_path}"
  Action.sh("#{command} 2>&1 | tee #{log_file_path}")

  # Make the file object available to other tasks
  result = FirebaseTestLabResult.new(log_file_path: log_file_path)
  Fastlane::Actions.lane_context[:FIREBASE_TEST_LOG_FILE] = result

  result
end

.verify_has_gcloud_binary!Object



97
98
99
100
101
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 97

def self.verify_has_gcloud_binary!
  Action.sh('command', '-v', 'gcloud', print_command: false, print_command_output: false)
rescue StandardError
  UI.user_error!("The `gcloud` binary isn't available on this machine. Unable to continue.")
end

.verify_logged_in!Object



103
104
105
# File 'lib/fastlane/plugin/wpmreleasetoolkit/models/firebase_test_runner.rb', line 103

def self.verify_logged_in!
  UI.user_error!('You are not logged into Firebase on this machine. Unable to continue.') unless FirebaseAccount.authenticated?
end