module Rake::TeamCity::MessageFactory

Constants

CUSTOM_MSG_TYPES
MOCK_ATTRIBUTES_VALUES
MSG_BLOCK_TYPES
MSG_STATUS_TYPES

Public Class Methods

create_build_error_report(message) click to toggle source

This message should show custom build status on buildserver and can be ignored by IDE tests runners

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 126
def self.create_build_error_report(message)
  create_message :message_name => 'buildStatus',
                 :status => MSG_STATUS_TYPES[:error],
                 :text => message
end
create_close_target(message) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 157
def self.create_close_target(message)
  create_message :message_name => 'blockClosed',
                 :name => message,
                 :type => MSG_BLOCK_TYPES[:target]
end
create_custom_progress_test_status(status) click to toggle source

noinspection RubyClassMethodNamingConvention

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 171
def self.create_custom_progress_test_status(status)
  create_message :message_name => 'customProgressStatus',
                 :type => CUSTOM_MSG_TYPES[status]
end
create_custom_progress_tests_category(category_name, int_count = 0) click to toggle source

noinspection RubyClassMethodNamingConvention

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 164
def self.create_custom_progress_tests_category(category_name, int_count = 0)
  create_message :message_name => 'customProgressStatus',
                 :testsCategory => category_name,
                 :count => int_count
end
create_msg_error(message, stacktrace = nil) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 132
def self.create_msg_error(message, stacktrace = nil)
  attrs = {
      :message_name => 'message',
      :text => message,
      :status => MSG_STATUS_TYPES[:error],
      :errorDetails => stacktrace
  }
  attrs[:text] &&= MOCK_ATTRIBUTES_VALUES[:error_msg][:value] if MOCK_ATTRIBUTES_VALUES[:error_msg][:enabled]

  create_message attrs
end
create_msg_warning(message, stacktrace = nil) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 144
def self.create_msg_warning(message, stacktrace = nil)
  create_message :message_name => 'message',
                 :text => message,
                 :status => MSG_STATUS_TYPES[:warning],
                 :errorDetails => stacktrace
end
create_open_target(message) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 151
def self.create_open_target(message)
  create_message :message_name => 'blockOpened',
                 :name => message,
                 :type => MSG_BLOCK_TYPES[:target]
end
create_progress_message(message) click to toggle source

This message should show progress on buildserver and can be ignored by IDE tests runners

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 118
def self.create_progress_message(message)
  # This kind of message doesn't support timestamp attribute
  create_message :message_name => 'progressMessage',
                 :message_text => message
end
create_suite_finished(suite_name) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 61
def self.create_suite_finished(suite_name)
  create_message :message_name => "testSuiteFinished",
                 :name => suite_name
end
create_suite_started(suite_name, location_url = nil) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 55
def self.create_suite_started(suite_name, location_url = nil)
  create_message :message_name => "testSuiteStarted",
                 :name => suite_name,
                 :locationHint => location_url
end
create_test_error(test_name, message, stacktrace) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 100
def self.create_test_error(test_name, message, stacktrace)
  stacktrace = format_stacktrace_if_needed(message, stacktrace)
  create_message :message_name => 'testFailed',
                 :name => test_name,
                 :message => message,
                 :details => stacktrace,
                 :error => 'true'
end
create_test_failed(test_name, message, stacktrace) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 92
def self.create_test_failed(test_name, message, stacktrace)
  stacktrace = format_stacktrace_if_needed(message, stacktrace)
  create_message :message_name => 'testFailed',
                 :name => test_name,
                 :message => message,
                 :details => stacktrace
end
create_test_finished(test_name, duration_ms, diagnostic_info=nil) click to toggle source

Duration in millisec

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 79
def self.create_test_finished(test_name, duration_ms, diagnostic_info=nil)
  create_message :message_name => "testFinished",
                 :name => test_name,
                 :duration => [duration_ms, 0].max,
                 :diagnosticInfo => diagnostic_info
end
create_test_ignored(test_name, message, stacktrace = nil) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 109
def self.create_test_ignored(test_name, message, stacktrace = nil)
  create_message :message_name => 'testIgnored',
                 :name => test_name,
                 :message => message,
                 :details => stacktrace
end
create_test_output_message(test_name, is_std_out, out_text) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 86
def self.create_test_output_message(test_name, is_std_out, out_text)
  create_message :message_name => "testStd#{is_std_out ? "Out" : "Err"}",
                 :name => test_name,
                 :out => out_text
end
create_test_reported_attached() click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 176
def self.create_test_reported_attached
  # Allows to distinguish 2 situations
  # * nothing to test  - no tests, suites
  # * test reporter wasn't attached
  # Can be reported several times
  create_message :message_name => 'enteredTheMatrix'
end
create_test_started(test_name, location_url = nil) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 71
def self.create_test_started(test_name, location_url = nil)
  create_message :message_name => "testStarted",
                 :name => test_name,
                 :captureStandardOutput => 'true',
                 :locationHint => location_url
end
create_tests_count(int_count) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 66
def self.create_tests_count(int_count)
  create_message :message_name => "testCount",
                 :count => int_count
end
replace_escaped_symbols(text) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 188
def self.replace_escaped_symbols(text)
  copy_of_text = String.new(text)

  copy_of_text.gsub!(/\|/, "||")

  copy_of_text.gsub!(/'/, "|'")
  copy_of_text.gsub!(/\n/, "|n")
  copy_of_text.gsub!(/\r/, "|r")
  copy_of_text.gsub!(/\]/, "|]")

  copy_of_text.gsub!(/\[/, "|[")

  begin
    copy_of_text.encode!('UTF-8') if copy_of_text.respond_to? :encode!
    copy_of_text.gsub!(/\u0085/, "|x") # next line
    copy_of_text.gsub!(/\u2028/, "|l") # line separator
    copy_of_text.gsub!(/\u2029/, "|p") # paragraph separator
  rescue
    # it is not an utf-8 compatible string :(
  end

  copy_of_text
end

Protected Class Methods

convert_time_to_java_simple_date(time) click to toggle source

noinspection RubyClassMethodNamingConvention

# File lib/rspec/teamcity/utils/service_message_factory.rb, line 263
def self.convert_time_to_java_simple_date(time)
  if MOCK_ATTRIBUTES_VALUES[:time][:enabled]
    return MOCK_ATTRIBUTES_VALUES[:time][:value]
  end
  gmt_offset = time.gmt_offset
  gmt_sign = gmt_offset < 0 ? "-" : "+"
  gmt_hours = gmt_offset.abs / 3600
  gmt_minutes = gmt_offset.abs % 3600

  millisec = time.usec == 0 ? 0 : time.usec / 1000

  #Time string in Java SimpleDateFormat
  sprintf("#{time.strftime("%Y-%m-%dT%H:%M:%S.")}%03d#{gmt_sign}%02d%02d", millisec, gmt_hours, gmt_minutes)
end
create_message(msg_attrs = {}) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 225
def self.create_message(msg_attrs = {})
  # message type:
  message_name = msg_attrs.delete(:message_name)

  # optional body
  message_text = msg_attrs[:message_text]

  # if diagnostic info is null - don't pass it'
  diagnostic = msg_attrs[:diagnosticInfo]
  unless diagnostic
    msg_attrs.delete(:diagnosticInfo)
  end

  if message_text.nil?
    # mock some attrs
    [:details, :errorDetails, :locationHint, :duration].each do |key|
      if msg_attrs[key].nil?
        # if key is nil - don't include in msg attrs
        msg_attrs.delete(key) if MOCK_ATTRIBUTES_VALUES[key][:remove_empty]
      else
        # if not nil & debug mode - mock it
        msg_attrs[key] = MOCK_ATTRIBUTES_VALUES[key][:value] if MOCK_ATTRIBUTES_VALUES[key][:enabled]
      end
    end

    # add auto timestamp
    msg_attrs[:timestamp] ||= convert_time_to_java_simple_date(Time.now)

    # message args
    message_args = msg_attrs.map { |k, v| "#{k.to_s} = '#{v.nil? ? "" : replace_escaped_symbols(v.to_s)}'" }.join(" ")
  else
    message_args = "'#{message_text}'"
  end

  "##teamcity[#{message_name}#{message_args.empty? ? '' : " #{message_args}"}]"
end

Private Class Methods

format_stacktrace_if_needed(message, stacktrace) click to toggle source
# File lib/rspec/teamcity/utils/service_message_factory.rb, line 213
def self.format_stacktrace_if_needed message, stacktrace
  if Rake::TeamCity.is_in_buildserver_mode()
    # At current moment TC doesn't extract message from corresponding attribute.
    # see [TW-6270] http://jetbrains.net/tracker/workspace?currentIssueId=TW-6270
    message + "\n\nStack trace:\n" + stacktrace
  else
    stacktrace
  end
end