summaryrefslogtreecommitdiff
path: root/test/task.rb
blob: df78b1ad26d86b80145618200492022ae434a16b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
require_relative "setup.rb"

begin
  puts "Service URI is: #{$task[:uri]}"
rescue
  puts "Configuration Error: $task[:uri] is not defined in: " + File.join(ENV["HOME"],".opentox","config","test.rb")
  exit
end

class String 
  def uri?
    uri = URI.parse(self)
    %w( http https ).include?(uri.scheme)
  rescue URI::BadURIError
    false
  rescue URI::InvalidURIError
    false
  end
end

class TaskTest < MiniTest::Test

  def test_01_create_and_complete
    task = OpenTox::Task.run __method__ do
      sleep 5
      $task[:uri]
    end
    assert_equal true,  task.running?
    assert_equal "Running", task.hasStatus
    assert_equal 202, task.code
    task.wait
    assert_equal 200, task.code
    assert_equal true,  task.completed?
    assert_equal "Completed", task.hasStatus
    assert_equal $task[:uri], task.resultURI
    refute_empty task.created_at
    refute_empty task.finished_at
  end

  def test_02_all
    all = OpenTox::Task.all
    assert_equal Array, all.class
    t = all.last
    assert_equal OpenTox::Task, t.class
    assert_equal RDF::OT.Task, t[RDF.type]
  end

  def test_03_create_and_cancel
    task = OpenTox::Task.run __method__ do
      sleep 5
      $task[:uri]
    end
    assert_equal true, task.running?
    assert_equal 202, task.code
    task.cancel
    assert_equal 503, task.code
    assert_equal true, task.cancelled?
    refute_empty task.created_at.to_s
    refute_empty task.finished_at.to_s
  end

  def test_04_create_and_fail
    task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
      sleep 5
      raise "A runtime error occured"
    end
    assert_equal true, task.running?
    assert_equal "Running", task.hasStatus
    assert_equal 202, task.code
    task.wait
    assert task.error?
    assert_equal 500, task.code
    assert_equal "Error", task.hasStatus
    assert_equal "A runtime error occured", task.error_report[RDF::OT.message]
    assert_equal "500", task.error_report[RDF::OT.statusCode]
    refute_empty task.error_report[RDF::OT.errorCause]
    refute_empty task.created_at
    refute_empty task.finished_at
  end

  def test_05_create_and_fail_with_opentox_error
    task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
      sleep 5
      raise OpenTox::Error.new 500, "An OpenTox::Error occured"
    end
    assert task.running?
    assert_equal "Running", task.hasStatus
    assert_equal 202, task.code
    task.wait
    assert task.error?
    assert_equal 500, task.code
    assert_equal "Error", task.hasStatus
    assert_equal "An OpenTox::Error occured", task.error_report[RDF::OT.message]
    assert_equal "500", task.error_report[RDF::OT.statusCode]
    refute_empty task.error_report[RDF::OT.errorCause]
  end

  def test_06_create_and_fail_with_not_found_error
    task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
      sleep 5
      resource_not_found_error "An OpenTox::ResourceNotFoundError occured",  "http://test.org/fake_creator"
    end
    assert task.running?
    assert_equal "Running", task.hasStatus
    assert_equal 202, task.code
    task.wait
    assert task.error?
    assert_equal 404, task.code
    assert_equal "Error", task.hasStatus
    assert_equal "An OpenTox::ResourceNotFoundError occured", task.error_report[RDF::OT.message]
    assert_equal "OpenTox::ResourceNotFoundError", task.error_report[RDF::OT.errorCode]
    refute_empty task.error_report[RDF::OT.errorCause]
    assert_equal "404", task.error_report[RDF::OT.statusCode]
  end

  def test_07_create_and_fail_with_rest_not_found_error
    task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
      sleep 5
      OpenTox::Feature.new.get
    end
    assert task.running?
    assert_equal "Running", task.hasStatus
    assert_equal 202, task.code
    task.wait
    assert task.error?
    assert_equal 404, task.code
    assert_equal "Error", task.hasStatus
    refute_empty task.error_report[RDF::OT.errorCause]
    assert_equal "404", task.error_report[RDF::OT.statusCode]
  end

  def test_08_create_and_fail_with_restclientwrapper_error
    task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
      sleep 5
      OpenTox::RestClientWrapper.get "invalid uri"
    end
    assert task.running?
    assert_equal "Running", task.hasStatus, "Expected Task Running has status: #{task.hasStatus} - #{task.uri}"
    assert_equal 202, task.code
    task.wait
    assert task.error?
    assert_equal 400, task.code
    assert_equal "Error", task.hasStatus
    refute_empty task.error_report[RDF::OT.errorCause]
    assert_equal "400", task.error_report[RDF::OT.statusCode]
  end

  def test_09_check_resultURIs
    resulturi = "http://resulturi/test/1"
    task = OpenTox::Task.run __method__ do
      sleep 5
      resulturi
    end
    assert_equal "Running", task.hasStatus
    response = OpenTox::RestClientWrapper.get task.uri,nil, {:accept => "text/uri-list"}
    assert_equal 202, response.code
    assert_equal task.uri, response
    assert_equal nil, task.resultURI
    task.wait
    response = OpenTox::RestClientWrapper.get task.uri,nil, {:accept => "text/uri-list"}
    assert_equal 200, response.code
    assert_equal resulturi, response
    assert_equal resulturi, task.resultURI
  end

  def test_10_uri_with_credentials
    task = OpenTox::Task.run __method__,nil do
      sleep 1
      resource_not_found_error "test", "http://username:password@test.org/fake_uri"
    end
    task.wait
    refute_match %r{username|password},  task.error_report[RDF::OT.actor]
  end

  def test_11a_plain_errors
    tests = [ { :uri=>File.join($dataset[:uri],'test/plain_error'),
                :error=>OpenTox::BadRequestError,
                :msg=>"plain_bad_request_error",
                :line=>"16" },
              { :uri=>File.join($dataset[:uri],'test/plain_no_ot_error'),
                :error=>OpenTox::InternalServerError,
                :msg=>"undefined method `no_method_for_nil' for nil:NilClass",
                :line=>"20" } ]
    tests.each do |test|
      begin
        OpenTox::RestClientWrapper.get test[:uri]
        assert false,"there should have been an error"
      rescue => ex
        assert ex.is_a?(test[:error]),"error type should be a #{test[:error]}, but is a #{ex.class}"
        assert ex.message=~/#{test[:msg]}/,"message should be #{test[:msg]}, but is #{ex.message}"
        assert ex.error_cause=~/test.rb:#{test[:line]}/,"code line number test.rb:#{test[:line]} is lost or wrong: #{ex.error_cause}"
        assert ex.uri==test[:uri]
      end
    end
  end

  def test_11_wait_for_error_task
    # testing two uris:
    # ../dataset/test/error_in_task starts a task that produces an internal-error with message 'error_in_task_message'  
    # ../algorithm/test/wait_for_error_in_task starts a task that waits for ../dataset/test/error_in_task
    # TODO: remove test uris from services, e.g. dynamically instantiate Sinatra routes instead
    
    def check_msg(msg,complete)
      assert msg=~/bad_request_error_in_task/,"orignial task error message ('bad_request_error_in_task') is lost: #{msg}"
      assert((msg=~/\\/)==nil,"no backslashes please!")
      assert complete=~/test.rb:9/,"code line number test.rb:9 is lost"
    end
    
    [ File.join($dataset[:uri],'test/error_in_task'),
      File.join($algorithm[:uri],'test/wait_for_error_in_task')
    ].each do |uri|
        
      task_uri = OpenTox::RestClientWrapper.post uri
      assert(URI.task?(task_uri) ,"no task uri: #{task_uri}")
      task = OpenTox::Task.new task_uri
      
      # test1: wait_for_task, this should abort
      begin
        wait_for_task task_uri
        assert false,"should have thrown an error because there was an error in the task we have waited for"
      rescue => ex
        assert ex.is_a?(OpenTox::BadRequestError),"not a bad request error, instead: #{ex.class}"
        check_msg(ex.message,ex.error_cause)
      end

      ## test2: test if task is set accordingly
      assert task.error?
      assert task.error_report[RDF::OT.errorCode]==OpenTox::BadRequestError.to_s,"errorCode should be #{OpenTox::BadRequestError.to_s}, but is #{task.error_report[RDF::OT.errorCode]}"
      check_msg(task.error_report[RDF::OT.message],task.error_report[RDF::OT.errorCause])
    end
  end

  def test_12_non_runtime_errors

    [RuntimeError, ThreadError, StopIteration, LocalJumpError, EOFError, IOError, RegexpError, 
     FloatDomainError, ZeroDivisionError, SystemCallError, EncodingError, NoMethodError, NameError, 
     RangeError, KeyError, IndexError, ArgumentError, TypeError].each do |ex|
      
      error_msg = "raising a #{ex}"
      
      task = OpenTox::Task.run __method__,"http://test.org/fake_creator" do
        sleep 5
        raise ex,error_msg
      end
      assert task.running?
      assert_equal "Running", task.hasStatus
      assert_equal 202, task.code
      task.wait
      assert task.error?
      assert_equal 500, task.code
      assert_equal "Error", task.hasStatus
      refute_empty task.error_report[RDF::OT.errorCause]
      assert_match error_msg,task.error_report[RDF::OT.message]
    end
    
  end

end