stf-client 0.3.0.pre.rc.12 → 0.3.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 52a4f2a68edf69cda4d74621215c184f14ea2fbf97d2c27948581f7dee93e838
4
- data.tar.gz: 622083a2cd27df2e8b3ba9dd78ff79cf9054bdfe27049544816dc04fed77b3b6
2
+ SHA1:
3
+ metadata.gz: a8d5a305e07467bde680b3784cd9f60ac9bfb17e
4
+ data.tar.gz: 95496e9d6f38c47422a27d6f4b7e647a5274f032
5
5
  SHA512:
6
- metadata.gz: 42f63749eb0a0f748b3a66051f3a409d92765d7b519627608b52e34a7241ae8b58b91a35dcc1c28ef61d18c482d18b0aebba88af50e52227cfd78fbdc4f6671d
7
- data.tar.gz: 3a27762217fad2da4895997c33def45bd35044b3b4a0a3e17f48fa0434236b899ae058802c0fa1c6e9a110aae3ccfc4fd2f72f068360adbd8c47f04ab0085554
6
+ metadata.gz: 2c70937862d2e99ae42532586d89a7c79f39a08215a6627232f0b19eef08d62552ca266e3bde21d7e20ef46e4eeaf17513bf4c33a9232611445255bf334f68d4
7
+ data.tar.gz: ff78646a4367cadc337b29e328e0ffbc6730b5a8604e6cbe2498dec695d58c099e6e0822f4f13dbbc9638b23828ec1af2a0fdf59872737ee671925e998b83e61
data/README.md CHANGED
@@ -48,7 +48,7 @@ COMMANDS
48
48
  connect - Search for a device available in STF and attach it to local adb server
49
49
  disconnect - Disconnect device(s) from local adb server and remove device(s) from user devices in STF
50
50
  help - Shows a list of commands or help for one command
51
- keys - Show available keys for filtering
51
+ keys - Show avaliable keys for filtering
52
52
  values - Show known values for the filtering key
53
53
 
54
54
  ENVIRONMENT VARIABLES
data/lib/di.rb CHANGED
@@ -9,7 +9,6 @@ require 'stf/interactor/stop_all_debug_sessions_interactor'
9
9
  require 'stf/interactor/remove_all_user_devices_interactor'
10
10
  require 'stf/interactor/get_keys_interactor'
11
11
  require 'stf/interactor/get_values_interactor'
12
- require 'stf/validate/uri_validator'
13
12
 
14
13
  class DI
15
14
  class << self
@@ -61,9 +60,6 @@ class DI
61
60
  -> {Stf::RemoveAllUserDevicesInteractor.new},
62
61
  memoize: true)
63
62
 
64
- c.register(:uri_validator,
65
- -> {Stf::URIValidator.new},
66
- memoize: true)
67
63
  end
68
64
 
69
65
  def [](what)
data/lib/stf/client.rb CHANGED
@@ -4,6 +4,7 @@ require 'ostruct'
4
4
 
5
5
  require 'stf/version'
6
6
  require 'stf/log/log'
7
+ require 'stf/errors'
7
8
 
8
9
  module Stf
9
10
  class Client
data/lib/stf/errors.rb ADDED
@@ -0,0 +1,7 @@
1
+ module Stf
2
+ class DeviceNotAvailableError < StandardError
3
+ def message
4
+ 'Device not available'
5
+ end
6
+ end
7
+ end
@@ -3,6 +3,8 @@ require 'di'
3
3
 
4
4
  require 'stf/client'
5
5
  require 'stf/log/log'
6
+ require 'stf/errors'
7
+ require 'stf/model/session'
6
8
  require 'stf/model/device'
7
9
 
8
10
  module Stf
@@ -3,6 +3,8 @@ require 'ADB'
3
3
 
4
4
  require 'stf/client'
5
5
  require 'stf/log/log'
6
+ require 'stf/errors'
7
+ require 'stf/model/session'
6
8
  require 'stf/model/device'
7
9
 
8
10
  module Stf
@@ -2,6 +2,8 @@ require 'ADB'
2
2
 
3
3
  require 'stf/client'
4
4
  require 'stf/log/log'
5
+ require 'stf/errors'
6
+ require 'stf/model/session'
5
7
  require 'stf/model/device_list'
6
8
 
7
9
  module Stf
@@ -17,29 +19,24 @@ module Stf
17
19
  max_n = opts[:n].to_i > 0 ? opts[:n].to_i : 1
18
20
  start_timeout = opts[:starttime].to_i > 0 ? opts[:starttime].to_i : 120
19
21
  session = opts[:worktime].to_i > 0 ? opts[:session].to_i : 10800
20
- min_n = opts[:min].to_s.empty? ? (max_n + 1) / 2 : [opts[:min].to_i, max_n].min
21
- healthcheck = opts[:health]
22
- force_filter = opts[:forcefilter]
22
+ min_n = opts[:min].to_s.empty? ? (max_n + 1) / 2 : opts[:min].to_i
23
23
 
24
24
  DI[:demonizer].kill unless opts[:nokill]
25
25
 
26
+ if filter
27
+ DI[:stop_all_debug_sessions_interactor].execute(exceptFilter: filter)
28
+ end
29
+
26
30
  wanted = nodaemon_flag ? max_n : min_n
27
31
 
28
32
  begin
29
- connect_loop(all_flag: all_flag,
30
- wanted: wanted,
31
- filter: filter,
32
- force_filter: force_filter,
33
- healthcheck: healthcheck,
34
- delay: 5,
35
- timeout: start_timeout)
36
-
33
+ connect_loop(all_flag, wanted, filter, false, 5, start_timeout)
37
34
  rescue SignalException => e
38
- logger.info "Caught signal \"#{e.message}\""
35
+ logger.info "Caught signal #{e.message}"
39
36
  DI[:stop_all_debug_sessions_interactor].execute
40
37
  return false
41
- rescue Exception => e
42
- logger.info "Exception \"#{e.message}\" during initial connect loop"
38
+ rescue
39
+ logger.info "Exception #{e.message} during initial connect loop"
43
40
  DI[:stop_all_debug_sessions_interactor].execute
44
41
  return false
45
42
  end
@@ -51,14 +48,12 @@ module Stf
51
48
 
52
49
  # will be daemon here
53
50
  DI[:demonizer].run do
54
- connect_loop(all_flag: all_flag,
55
- wanted: max_n,
56
- filter: filter,
57
- force_filter: force_filter,
58
- healthcheck: healthcheck,
59
- daemon_mode: true,
60
- delay: 30,
61
- timeout: session)
51
+ connect_loop(all_flag,
52
+ max_n,
53
+ filter,
54
+ true,
55
+ 30,
56
+ session)
62
57
 
63
58
  DI[:stop_all_debug_sessions_interactor].execute(byFilter: filter, nokill: true)
64
59
  end
@@ -66,39 +61,28 @@ module Stf
66
61
  return true
67
62
  end
68
63
 
69
- def connect_loop(all_flag: false,
70
- wanted: 1,
71
-
72
- filter: nil,
73
- force_filter: false,
74
- healthcheck: nil,
75
-
76
- daemon_mode: false,
77
- delay: 5,
78
- timeout: 120)
64
+ def connect_loop(all_flag, wanted, filter, daemon_mode, delay, timeout)
79
65
  finish_time = Time.now + timeout
80
66
  one_time_mode = !daemon_mode
81
67
 
82
68
  while true do
83
- cleanup_disconnected_devices(filter, force_filter, healthcheck)
69
+ cleanup_disconnected_devices(filter)
84
70
 
85
71
  if one_time_mode && Time.now > finish_time
86
72
  raise "Connect loop timeout reached"
87
73
  end
88
74
 
89
- all_devices = DeviceList.new(DI[:stf].get_devices)
90
- stf_devices = all_devices.select_ready_to_connect
91
- stf_devices = stf_devices.by_filter(filter) if filter
92
- stf_devices = stf_devices.select_healthy_for_connect(healthcheck) if healthcheck
75
+ stf_devices = DeviceList.new(DI[:stf].get_devices)
76
+ stf_devices = stf_devices.byFilter(filter) if filter
93
77
 
94
78
  if all_flag
95
- to_connect = stf_devices.size
79
+ to_connect = stf_devices.filterReadyToConnect.size
96
80
  else
97
- connected = devices & all_devices.as_connect_url_list
81
+ connected = devices & stf_devices.asConnectUrlList
98
82
  to_connect = wanted - connected.size
99
83
  end
100
84
 
101
- return if one_time_mode && to_connect <= 0
85
+ return if one_time_mode && to_connect == 0
102
86
 
103
87
  if to_connect > 0
104
88
  if stf_devices.empty?
@@ -116,41 +100,40 @@ module Stf
116
100
 
117
101
  def count_connected_devices(filter)
118
102
  stf_devices = DeviceList.new(DI[:stf].get_user_devices)
119
- stf_devices = stf_devices.by_filter(filter) if filter
120
- connected = devices & stf_devices.as_connect_url_list
103
+ stf_devices = stf_devices.byFilter(filter) if filter
104
+ connected = devices & stf_devices.asConnectUrlList
121
105
  connected.size
122
106
  end
123
107
 
124
- def cleanup_disconnected_devices(filter, force_filter, healthcheck)
125
- to_disconnect = []
108
+ def cleanup_disconnected_devices(filter)
126
109
  stf_devices = DeviceList.new(DI[:stf].get_user_devices)
110
+ stf_devices = stf_devices.byFilter(filter) if filter
111
+ connected = stf_devices.asConnectUrlList - devices
127
112
 
128
- if filter && force_filter
129
- disconnect_because_filter = stf_devices.except_filter(filter).as_connect_url_list
130
- unless disconnect_because_filter.empty?
131
- logger.info 'will be disconnected by filter: ' + disconnect_because_filter.join(',')
132
- to_disconnect += disconnect_because_filter
133
- end
113
+ connected.reject {|url| url.to_s.empty?}.each do |url|
114
+ logger.info 'Cleanup the device ' + url.to_s
115
+ DI[:stop_debug_session_interactor].execute(url)
134
116
  end
117
+ end
135
118
 
136
- if healthcheck
137
- disconnect_by_health = stf_devices.select_not_healthy(healthcheck).as_connect_url_list
138
- unless disconnect_by_health.empty?
139
- logger.info 'will be disconnected by health check: ' + disconnect_by_health.join(',')
140
- to_disconnect += disconnect_by_health
141
- end
142
- end
119
+ def connect(filter, all_flag, wanted)
120
+ devices = DeviceList.new(DI[:stf].get_devices)
121
+ devices = devices.filterReadyToConnect
122
+ devices = devices.byFilter(filter) if filter
143
123
 
144
- dead_persons = stf_devices.as_connect_url_list - devices
145
- unless dead_persons.empty?
146
- logger.info 'will be disconnected because not present locally: ' + dead_persons.join(',')
147
- to_disconnect += dead_persons
124
+ if devices.empty?
125
+ logger.error 'There is no available devices with criteria ' + filter
126
+ return 0
148
127
  end
149
128
 
150
- to_disconnect.reject {|url| url.to_s.empty?}.uniq.each do |url|
151
- logger.info 'Cleanup the device ' + url.to_s
152
- DI[:stop_debug_session_interactor].execute(url)
129
+ n = 0
130
+ devices.asArray.shuffle.each do |d|
131
+ n += 1 if DI[:start_one_debug_session_interactor].execute(d)
132
+ break if !all_flag && n >= wanted
153
133
  end
134
+
135
+ n
154
136
  end
137
+
155
138
  end
156
139
  end
@@ -3,6 +3,8 @@ require 'ADB'
3
3
 
4
4
  require 'stf/client'
5
5
  require 'stf/log/log'
6
+ require 'stf/errors'
7
+ require 'stf/model/session'
6
8
 
7
9
  module Stf
8
10
  class StartOneDebugSessionInteractor
@@ -38,26 +40,23 @@ module Stf
38
40
 
39
41
  return true
40
42
 
41
- rescue StandardError, SignalException => e
43
+ rescue SignalException => e
44
+ raise e
45
+ rescue => e
42
46
  begin
43
47
  # we will try clean anyway
44
48
  DI[:stf].remove_device serial
45
49
  if test ?d, '/custom-metrics'
46
- File.open('/custom-metrics/openstf_connect_fail', 'a') do |f|
47
- message = (!e.nil? || !e.message.nil?) ? e.message : ""
48
- f.write("openstf_connect_fail,reason=\"#{escape(message)}\",serial=\"#{escape(serial)}\" count=1i #{Time.now.to_i}\n")
50
+ File.open('/custom-metrics/openstf_connect_fail', 'a') do
51
+ |f| f.write("openstf_connect_fail #{serial} #{Time.now.to_i}\n")
49
52
  end
50
53
  end
51
54
  rescue
52
55
  end
53
56
 
54
- logger.error "Failed to connect to #{serial}: " + e&.message
57
+ logger.error "Failed to connect to #{serial}: " + e.message
55
58
  return false
56
59
  end
57
60
  end
58
-
59
- def escape(s)
60
- s.gsub(/["]/, '\"').gsub(/[ ]/, '\ ').gsub(/[=]/, '\=').gsub(/[,]/, '\,')
61
- end
62
61
  end
63
62
  end
@@ -3,6 +3,7 @@ require 'ADB'
3
3
 
4
4
  require 'stf/client'
5
5
  require 'stf/log/log'
6
+ require 'stf/errors'
6
7
  require 'stf/interactor/stop_debug_session_interactor'
7
8
  require 'stf/model/device_list'
8
9
 
@@ -12,14 +13,19 @@ module Stf
12
13
  include ADB
13
14
 
14
15
  # byFilter:
16
+ # exceptFilter:
15
17
  def execute(options = {})
16
18
  DI[:demonizer].kill unless options[:nokill]
17
19
 
18
20
  stf_devices = DeviceList.new(DI[:stf].get_user_devices)
19
21
 
20
- stf_devices = stf_devices.by_filter options[:byFilter] if options[:byFilter]
22
+ stf_devices = stf_devices.byFilter options[:byFilter] if options[:byFilter]
23
+ stf_devices = stf_devices.exceptFilter options[:exceptFilter] if options[:exceptFilter]
21
24
 
22
- pending_disconnect = stf_devices.as_connect_url_list
25
+ connected_devices = devices()
26
+ remote_devices = stf_devices.asConnectUrlList
27
+
28
+ pending_disconnect = connected_devices & remote_devices
23
29
 
24
30
  pending_disconnect.each {|d| DI[:stop_debug_session_interactor].execute d}
25
31
  end
@@ -3,6 +3,7 @@ require 'ADB'
3
3
 
4
4
  require 'stf/client'
5
5
  require 'stf/log/log'
6
+ require 'stf/errors'
6
7
 
7
8
  module Stf
8
9
  class StopDebugSessionInteractor
@@ -8,33 +8,7 @@ module Stf
8
8
  getKeysNextLevel('', self)
9
9
  end
10
10
 
11
- # more pessimistic decision
12
- def healthy_for_connect?(pattern)
13
- return true if pattern.nil?
14
- health = healthy?(pattern)
15
- ppp = pattern.split(',')
16
- ppp.each do |p|
17
- health &&= getValue('battery.temp').to_i < 30 if ['t', 'temp', 'temperature'].include? p
18
- health &&= getValue('battery.level').to_f > 30.0 if ['b', 'batt', 'battery'].include? p
19
- end
20
- health
21
- end
22
-
23
- def healthy?(pattern)
24
- return true if pattern.nil?
25
- ppp = pattern.split(',')
26
- health = true
27
- ppp.each do |p|
28
- health &&= getValue('battery.temp').to_i < 32 if ['t', 'temp', 'temperature'].include? p
29
- health &&= getValue('battery.level').to_f > 20.0 if ['b', 'batt', 'battery'].include? p
30
- health &&= getValue('network.connected') if ['n', 'net', 'network'].include? p
31
- health &&= getValue('network.type') == 'VPN' if ['vpn'].include? p
32
- health &&= getValue('network.type') == 'WIFI' if ['wifi'].include? p
33
- end
34
- health
35
- end
36
-
37
- def checkFilter?(filter)
11
+ def checkFilter(filter)
38
12
  return true if filter.nil?
39
13
  key, value = filter.split(':', 2)
40
14
  getValue(key) == value
@@ -11,49 +11,20 @@ module Stf
11
11
  end
12
12
  end
13
13
 
14
- def by_filter(filter)
15
- filter ? select {|d| d.checkFilter?(filter)} : []
14
+ def byFilter(filter)
15
+ filter ? select {|d| d.checkFilter(filter)} : Array.new
16
16
  end
17
17
 
18
- def except_filter(filter)
19
- filter ? reject {|d| d.checkFilter?(filter)} : this
18
+ def exceptFilter(filter)
19
+ filter ? reject {|d| d.checkFilter(filter)} : this
20
20
  end
21
21
 
22
- def select_healthy(pattern)
23
- pattern ? select { |d| d.healthy?(pattern) } : this
22
+ def filterReadyToConnect
23
+ select {|d| d.ready == true && d.present == true && d.usage.nil? }
24
24
  end
25
25
 
26
- # more pessimistic than healthy()
27
- def select_healthy_for_connect(pattern)
28
- pattern ? select { |d| d.healthy_for_connect?(pattern) } : this
29
- end
30
-
31
- def select_not_healthy(pattern)
32
- pattern ? reject { |d| d.healthy?(pattern) } : []
33
- end
34
-
35
- def select_ready_to_connect
36
- # https://github.com/openstf/stf/blob/93d9d7fe859bb7ca71669f375d841d94fa47d751/lib/wire/wire.proto#L170
37
- # enum DeviceStatus {
38
- # OFFLINE = 1;
39
- # UNAUTHORIZED = 2;
40
- # ONLINE = 3;
41
- # CONNECTING = 4;
42
- # AUTHORIZING = 5;
43
- # }
44
- #
45
- # https://github.com/openstf/stf/blob/93d9d7fe859bb7ca71669f375d841d94fa47d751/res/app/components/stf/device/enhance-device/enhance-device-service.js
46
- select {|d|
47
- d.present == true &&
48
- d.status == 3 &&
49
- d.ready == true &&
50
- d.using == false &&
51
- d.owner.nil?
52
- }
53
- end
54
-
55
- def as_connect_url_list
56
- @devices.map {|d| d.remoteConnectUrl}.reject { |c| c.nil? || c.empty? }
26
+ def asConnectUrlList
27
+ @devices.map {|d| d.remoteConnectUrl}
57
28
  end
58
29
 
59
30
  def select
@@ -61,6 +32,7 @@ module Stf
61
32
  end
62
33
 
63
34
  def reject
35
+ # DeviceList.new(@devices.reject {|d| yield(d)})
64
36
  DeviceList.new(@devices.select {|d| !yield(d)})
65
37
  end
66
38
 
@@ -76,4 +48,4 @@ module Stf
76
48
  @devices
77
49
  end
78
50
  end
79
- end
51
+ end
@@ -0,0 +1,12 @@
1
+ module Stf
2
+ class Session
3
+
4
+ attr_accessor :serial, :url
5
+
6
+ def initialize(serial, url)
7
+ @serial = serial
8
+ @url = url
9
+ end
10
+
11
+ end
12
+ end
data/lib/stf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Stf
2
- VERSION = '0.3.0-rc.12'
2
+ VERSION = '0.3.0.rc2'
3
3
  end
data/lib/stf/view/cli.rb CHANGED
@@ -7,7 +7,7 @@ module Stf
7
7
 
8
8
  extend self
9
9
 
10
- program_desc "Smartphone Test Lab client (version #{Stf::VERSION})"
10
+ program_desc 'Smartphone Test Lab client'
11
11
 
12
12
  desc 'Be verbose'
13
13
  switch [:v, :verbose]
@@ -35,9 +35,6 @@ module Stf
35
35
  Log::verbose(global_options[:verbose])
36
36
 
37
37
  DI.init(global_options)
38
-
39
- help_now!('Valid STF url is required, e.g. http(s)://openstf.local') if !DI[:uri_validator].validate(global_options[:url])
40
- true
41
38
  end
42
39
 
43
40
  desc 'Search for a device available in STF and attach it to local adb server'
@@ -50,10 +47,6 @@ module Stf
50
47
  c.flag [:min]
51
48
  c.desc 'Filter key:value for devices'
52
49
  c.flag [:f, :filter]
53
- c.desc 'Force filter check for connected devices'
54
- c.switch [:forcefilter, :ff]
55
- c.desc 'Check selected health parameters, could be any of the: battery,temperature,network,vpn,wifi'
56
- c.flag [:health]
57
50
  c.desc 'Maximum session duration in seconds, 10800 (3h) by default'
58
51
  c.flag [:session]
59
52
  c.desc 'Maximum time to connect minimal quantity of devices in seconds, 120 (2m) by default'
@@ -68,7 +61,7 @@ module Stf
68
61
  end
69
62
  end
70
63
 
71
- desc 'Show available keys for filtering'
64
+ desc 'Show avaliable keys for filtering'
72
65
  command :keys do |c|
73
66
  c.action {puts DI[:get_keys_interactor].execute}
74
67
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stf-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.pre.rc.12
4
+ version: 0.3.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Malinskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-22 00:00:00.000000000 Z
11
+ date: 2018-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gli
@@ -199,6 +199,7 @@ files:
199
199
  - lib/di.rb
200
200
  - lib/stf.rb
201
201
  - lib/stf/client.rb
202
+ - lib/stf/errors.rb
202
203
  - lib/stf/interactor/get_keys_interactor.rb
203
204
  - lib/stf/interactor/get_values_interactor.rb
204
205
  - lib/stf/interactor/remove_all_user_devices_interactor.rb
@@ -209,8 +210,8 @@ files:
209
210
  - lib/stf/log/log.rb
210
211
  - lib/stf/model/device.rb
211
212
  - lib/stf/model/device_list.rb
213
+ - lib/stf/model/session.rb
212
214
  - lib/stf/system/demonizer.rb
213
- - lib/stf/validate/uri_validator.rb
214
215
  - lib/stf/version.rb
215
216
  - lib/stf/view/cli.rb
216
217
  - stf-client.gemspec
@@ -234,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
235
  version: 1.3.1
235
236
  requirements: []
236
237
  rubyforge_project:
237
- rubygems_version: 2.7.7
238
+ rubygems_version: 2.6.13
238
239
  signing_key:
239
240
  specification_version: 4
240
241
  summary: Request devices from Smartphone Test Farm for adb connection
@@ -1,7 +0,0 @@
1
- module Stf
2
- class URIValidator
3
- def validate(uri)
4
- return (uri =~ /\A#{URI::regexp(%w(http https))}\z/) != nil
5
- end
6
- end
7
- end