Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ gem "guard-rspec", require: false

group :test, :development do
gem "webmock"
gem "puma", '~> 5.6'
gem "puma", '~> 6'
gem "rackup"
gem "pry"
gem "simplecov", require: false
Expand Down
49 changes: 49 additions & 0 deletions lib/cache.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
class Cache
CACHE = {} # rubocop:disable Style/MutableConstant
CACHE_TIMEOUT = 5 * 60 # 300 seconds
TIMEOUT_KEY = 'last_access_time'.freeze
MUTEX = Mutex.new

# Caching Keys
CAPABILITIES = 'capabilities'.freeze
COMMAND_EXECUTOR_URL = 'command_executor_url'.freeze

def self.check_types(session_id, property)
raise TypeError, 'Argument session_id should be string' unless session_id.is_a?(String)
raise TypeError, 'Argument property should be string' unless property.is_a?(String)
end

def self.set_cache(session_id, property, value)
check_types(session_id, property)
MUTEX.synchronize do
session = CACHE[session_id] || {}
session[TIMEOUT_KEY] = Time.now.to_f
session[property] = value
CACHE[session_id] = session
end
end

def self.get_cache(session_id, property)
check_types(session_id, property)
MUTEX.synchronize do
cleanup_cache
session = CACHE[session_id] || {}
session[property]
end
end

def self.clear_cache!
MUTEX.synchronize do
CACHE.clear
end
end

def self.cleanup_cache
now = Time.now.to_f
CACHE.delete_if do |_, session|
timestamp = session[TIMEOUT_KEY]
timestamp && (now - timestamp >= CACHE_TIMEOUT)
end
end
private_class_method :cleanup_cache
end
57 changes: 57 additions & 0 deletions lib/driver_metadata.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require_relative 'cache'

class DriverMetaData
def initialize(driver)
@driver = driver
end

def session_id
@driver.session_id
end

def command_executor_url
cached = Cache.get_cache(session_id, Cache::COMMAND_EXECUTOR_URL)
return cached unless cached.nil?

url = nil
begin
raw = @driver.send(:bridge).http.send(:server_url)
url = raw.to_s unless raw.nil?
rescue StandardError => e
if defined?(Percy)
Percy.log("Could not get command_executor_url via bridge.http.server_url: #{e}", 'debug')
end
end

if url.nil? || url.empty?
begin
raw = @driver.send(:bridge).http.instance_variable_get(:@server_url)
url = raw.to_s unless raw.nil?
rescue StandardError => e
Percy.log("Could not get @server_url instance variable: #{e}", 'debug') if defined?(Percy)
end
end

url ||= ''
Cache.set_cache(session_id, Cache::COMMAND_EXECUTOR_URL, url)
url
end

def capabilities
cached = Cache.get_cache(session_id, Cache::CAPABILITIES)
return cached unless cached.nil?

caps = begin
@driver.capabilities.as_json
rescue StandardError
begin
@driver.capabilities.to_h
rescue StandardError
{}
end
end

Cache.set_cache(session_id, Cache::CAPABILITIES, caps)
caps
Comment thread
yashmahamulkar-bs marked this conversation as resolved.
end
end
Loading
Loading