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

Sign up to get free protection for your applications and to get access to all the features.
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