grntest 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/doc/text/news.md +17 -0
- data/lib/grntest/execution-context.rb +6 -0
- data/lib/grntest/executors/base-executor.rb +30 -16
- data/lib/grntest/executors/http-executor.rb +10 -2
- data/lib/grntest/log-parser.rb +5 -1
- data/lib/grntest/test-runner.rb +37 -7
- data/lib/grntest/tester.rb +12 -0
- data/lib/grntest/version.rb +1 -1
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 915bd62815178dc7740a1bf25e0f29483421399e
|
4
|
+
data.tar.gz: '02896dee4bbe5117a6fa3acc39c5de14c6243538'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e93ddd16e4f5397f2a9dd634967234b57459fc848352fb5f2e12730c789676c5ae49909dee17defd181c55998509fa153eb05c1f8ea964129eeeb5f645fff8e0
|
7
|
+
data.tar.gz: b79b86bff0a082bc8f949f1041db225cb4b8733d8578675d565e7733bccb9f5a722fbc3f241a7226782149d5f8cfddef6a3ea0e22544685de56ca696b13edd49
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.2.4: 2017-03-27
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Supported outputting actual file even if the test detects memory
|
8
|
+
leaks.
|
9
|
+
|
10
|
+
* Supported unused port dynamically if static port is unavailable.
|
11
|
+
|
12
|
+
* Ignored "thread start" log messages.
|
13
|
+
|
14
|
+
* Supported log with PID.
|
15
|
+
|
16
|
+
* Supported auto chunked `load`.
|
17
|
+
|
18
|
+
* Added `--no-suppress-backtrace` option.
|
19
|
+
|
3
20
|
## 1.2.3: 2016-07-19
|
4
21
|
|
5
22
|
### Improvements
|
@@ -24,6 +24,7 @@ module Grntest
|
|
24
24
|
attr_accessor :abort_tag
|
25
25
|
attr_accessor :timeout
|
26
26
|
attr_accessor :default_timeout
|
27
|
+
attr_writer :suppress_backtrace
|
27
28
|
attr_writer :collect_query_log
|
28
29
|
attr_writer :debug
|
29
30
|
def initialize
|
@@ -42,6 +43,7 @@ module Grntest
|
|
42
43
|
@timeout = 0
|
43
44
|
@default_timeout = 0
|
44
45
|
@omitted = false
|
46
|
+
@suppress_backtrace = true
|
45
47
|
@collect_query_log = false
|
46
48
|
@debug = false
|
47
49
|
end
|
@@ -50,6 +52,10 @@ module Grntest
|
|
50
52
|
@logging
|
51
53
|
end
|
52
54
|
|
55
|
+
def suppress_backtrace?
|
56
|
+
@suppress_backtrace or debug?
|
57
|
+
end
|
58
|
+
|
53
59
|
def collect_query_log?
|
54
60
|
@collect_query_log
|
55
61
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
#
|
3
3
|
# This program is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -295,21 +295,23 @@ module Grntest
|
|
295
295
|
def execute_directive_generate_series(parser, line, content, options)
|
296
296
|
start, stop, table, template, = options
|
297
297
|
evaluator = TemplateEvaluator.new(template)
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
first_record
|
305
|
-
|
306
|
-
|
298
|
+
(Integer(start)..Integer(stop)).each_slice(1000) do |range|
|
299
|
+
parser << "load --table #{table}\n"
|
300
|
+
parser << "["
|
301
|
+
first_record = true
|
302
|
+
range.each do |i|
|
303
|
+
record = ""
|
304
|
+
if first_record
|
305
|
+
first_record = false
|
306
|
+
else
|
307
|
+
record << ","
|
308
|
+
end
|
309
|
+
record << "\n"
|
310
|
+
record << evaluator.evaluate(i).to_json
|
311
|
+
parser << record
|
307
312
|
end
|
308
|
-
|
309
|
-
record << evaluator.evaluate(i).to_json
|
310
|
-
parser << record
|
313
|
+
parser << "\n]\n"
|
311
314
|
end
|
312
|
-
parser << "\n]\n"
|
313
315
|
end
|
314
316
|
|
315
317
|
def execute_directive(parser, line, content)
|
@@ -428,7 +430,10 @@ module Grntest
|
|
428
430
|
parser = LogParser.new
|
429
431
|
parser.parse(log) do |entry|
|
430
432
|
next unless important_log_level?(entry.log_level)
|
431
|
-
|
433
|
+
if @context.suppress_backtrace?
|
434
|
+
next if backtrace_log_message?(entry.message)
|
435
|
+
end
|
436
|
+
next if thread_log_message?(entry.message)
|
432
437
|
important_messages << "\#|#{entry.log_level}| #{entry.message}"
|
433
438
|
end
|
434
439
|
important_messages.join("\n")
|
@@ -458,7 +463,7 @@ module Grntest
|
|
458
463
|
case message
|
459
464
|
when /\A\//
|
460
465
|
true
|
461
|
-
when /\A[a-zA-Z]
|
466
|
+
when /\A[a-zA-Z]:[\/\\]/
|
462
467
|
true
|
463
468
|
when /\Agroonga\(\) \[0x[\da-f]+\]\z/
|
464
469
|
true
|
@@ -471,6 +476,15 @@ module Grntest
|
|
471
476
|
end
|
472
477
|
end
|
473
478
|
|
479
|
+
def thread_log_message?(message)
|
480
|
+
case message
|
481
|
+
when /\Athread start/
|
482
|
+
true
|
483
|
+
else
|
484
|
+
false
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
474
488
|
def error_response?(response, type)
|
475
489
|
status = nil
|
476
490
|
begin
|
@@ -74,7 +74,7 @@ module Grntest
|
|
74
74
|
request.content_type = "application/json; charset=UTF-8"
|
75
75
|
request.body = body
|
76
76
|
response = Net::HTTP.start(@host, @port) do |http|
|
77
|
-
http.read_timeout =
|
77
|
+
http.read_timeout = read_timeout
|
78
78
|
http.request(request)
|
79
79
|
end
|
80
80
|
normalize_response_data(command, response.body)
|
@@ -83,7 +83,7 @@ module Grntest
|
|
83
83
|
def send_normal_command(command)
|
84
84
|
url = "http://#{@host}:#{@port}#{command.to_uri_format}"
|
85
85
|
begin
|
86
|
-
open(url, :read_timeout =>
|
86
|
+
open(url, :read_timeout => read_timeout) do |response|
|
87
87
|
normalize_response_data(command, response.read)
|
88
88
|
end
|
89
89
|
rescue SystemCallError
|
@@ -101,6 +101,14 @@ module Grntest
|
|
101
101
|
"#{raw_response_data}\n"
|
102
102
|
end
|
103
103
|
end
|
104
|
+
|
105
|
+
def read_timeout
|
106
|
+
if @context.timeout.zero?
|
107
|
+
nil
|
108
|
+
else
|
109
|
+
@context.timeout
|
110
|
+
end
|
111
|
+
end
|
104
112
|
end
|
105
113
|
end
|
106
114
|
end
|
data/lib/grntest/log-parser.rb
CHANGED
@@ -29,12 +29,16 @@ module Grntest
|
|
29
29
|
end
|
30
30
|
log.each_line do |line|
|
31
31
|
case line
|
32
|
-
when /\A(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+)\|
|
32
|
+
when /\A(\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}\.\d+)\|
|
33
|
+
([a-zA-Z])\|
|
34
|
+
(?:\d+:)?
|
35
|
+
\s*/x
|
33
36
|
emit_entry.call
|
34
37
|
timestamp = $1
|
35
38
|
log_level = $2
|
36
39
|
message = $POSTMATCH
|
37
40
|
else
|
41
|
+
message ||= ""
|
38
42
|
message << line
|
39
43
|
end
|
40
44
|
end
|
data/lib/grntest/test-runner.rb
CHANGED
@@ -17,6 +17,7 @@ require "pathname"
|
|
17
17
|
require "fileutils"
|
18
18
|
require "tempfile"
|
19
19
|
require "timeout"
|
20
|
+
require "socket"
|
20
21
|
|
21
22
|
require "json"
|
22
23
|
|
@@ -107,6 +108,7 @@ module Grntest
|
|
107
108
|
succeeded = false
|
108
109
|
when :leaked
|
109
110
|
@worker.on_test_leak(result)
|
111
|
+
output_actual_file(result.actual) unless result.checked?
|
110
112
|
succeeded = false
|
111
113
|
when :omitted
|
112
114
|
@worker.on_test_omission(result)
|
@@ -139,6 +141,7 @@ module Grntest
|
|
139
141
|
context.timeout = @tester.timeout
|
140
142
|
context.timeout = 0 if @tester.gdb
|
141
143
|
context.default_timeout = context.timeout
|
144
|
+
context.suppress_backtrace = @tester.suppress_backtrace?
|
142
145
|
context.debug = @tester.debug?
|
143
146
|
run_groonga(context) do |executor|
|
144
147
|
executor.execute(test_script_path)
|
@@ -329,9 +332,27 @@ call chdir("#{context.temporary_directory_path}")
|
|
329
332
|
"libtool"
|
330
333
|
end
|
331
334
|
|
335
|
+
def decide_groonga_server_port(host)
|
336
|
+
static_port = 50041 + @worker.id
|
337
|
+
10.times do
|
338
|
+
begin
|
339
|
+
TCPSocket.new(host, static_port)
|
340
|
+
rescue SystemCallError
|
341
|
+
return static_port
|
342
|
+
else
|
343
|
+
sleep(0.1)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
dynamic_port = TCPServer.open(host, 0) do |server|
|
348
|
+
server.addr[1]
|
349
|
+
end
|
350
|
+
dynamic_port
|
351
|
+
end
|
352
|
+
|
332
353
|
def run_groonga_http(context)
|
333
354
|
host = "127.0.0.1"
|
334
|
-
port =
|
355
|
+
port = decide_groonga_server_port(host)
|
335
356
|
pid_file_path = context.temporary_directory_path + "groonga.pid"
|
336
357
|
|
337
358
|
env = extract_custom_env(context)
|
@@ -617,12 +638,17 @@ http {
|
|
617
638
|
})
|
618
639
|
else
|
619
640
|
error = header["error"]
|
641
|
+
normalized_values = {}
|
620
642
|
message = error["message"]
|
621
|
-
message =
|
643
|
+
normalized_values["message"] = normalize_error_message(message)
|
644
|
+
file = error["file"]
|
645
|
+
if file
|
646
|
+
normalized_values["file"] = normalize_error_file_path(file)
|
647
|
+
end
|
622
648
|
header.merge({
|
623
649
|
"start_time" => 0.0,
|
624
650
|
"elapsed_time" => 0.0,
|
625
|
-
"error" => error.merge(
|
651
|
+
"error" => error.merge(normalized_values),
|
626
652
|
})
|
627
653
|
end
|
628
654
|
else
|
@@ -633,7 +659,7 @@ http {
|
|
633
659
|
else
|
634
660
|
message, backtrace = rest
|
635
661
|
_ = backtrace # for suppress warnings
|
636
|
-
message =
|
662
|
+
message = normalize_error_message(message)
|
637
663
|
[[return_code, 0.0, 0.0], message]
|
638
664
|
end
|
639
665
|
end
|
@@ -645,7 +671,7 @@ http {
|
|
645
671
|
if body["exception"]
|
646
672
|
exception = Marshal.load(Marshal.dump(body["exception"]))
|
647
673
|
message = exception["message"]
|
648
|
-
exception["message"] =
|
674
|
+
exception["message"] = normalize_error_message(message)
|
649
675
|
body.merge("exception" => exception)
|
650
676
|
else
|
651
677
|
body.each do |key, value|
|
@@ -663,11 +689,11 @@ http {
|
|
663
689
|
end
|
664
690
|
|
665
691
|
def normalize_error(content)
|
666
|
-
content =
|
692
|
+
content = normalize_error_message(content)
|
667
693
|
normalize_raw_content(content)
|
668
694
|
end
|
669
695
|
|
670
|
-
def
|
696
|
+
def normalize_error_message(content)
|
671
697
|
case content
|
672
698
|
when /\A(.*: fopen: failed to open mruby script file: )<(.+?)>?\z/
|
673
699
|
pre = $1
|
@@ -678,6 +704,10 @@ http {
|
|
678
704
|
end
|
679
705
|
end
|
680
706
|
|
707
|
+
def normalize_error_file_path(path)
|
708
|
+
File.basename(path)
|
709
|
+
end
|
710
|
+
|
681
711
|
def normalize_plugin_path(path)
|
682
712
|
path.gsub(/\.libs\//, "").gsub(/\.dll\z/, ".so")
|
683
713
|
end
|
data/lib/grntest/tester.rb
CHANGED
@@ -194,6 +194,12 @@ module Grntest
|
|
194
194
|
tester.suppress_omit_log = boolean
|
195
195
|
end
|
196
196
|
|
197
|
+
parser.on("--no-suppress-backtrace",
|
198
|
+
"Suppress backtrace",
|
199
|
+
"(#{tester.suppress_backtrace?})") do |boolean|
|
200
|
+
tester.suppress_backtrace = boolean
|
201
|
+
end
|
202
|
+
|
197
203
|
parser.on("--output=OUTPUT",
|
198
204
|
"Output to OUTPUT",
|
199
205
|
"(stdout)") do |output|
|
@@ -264,6 +270,7 @@ module Grntest
|
|
264
270
|
attr_writer :reporter, :keep_database, :use_color
|
265
271
|
attr_writer :stop_on_failure
|
266
272
|
attr_writer :suppress_omit_log
|
273
|
+
attr_writer :suppress_backtrace
|
267
274
|
attr_writer :debug
|
268
275
|
attr_reader :test_patterns, :test_suite_patterns
|
269
276
|
attr_reader :exclude_test_patterns, :exclude_test_suite_patterns
|
@@ -286,6 +293,7 @@ module Grntest
|
|
286
293
|
@use_color = nil
|
287
294
|
@stop_on_failure = false
|
288
295
|
@suppress_omit_log = true
|
296
|
+
@suppress_backtrace = true
|
289
297
|
@debug = false
|
290
298
|
@test_patterns = []
|
291
299
|
@test_suite_patterns = []
|
@@ -336,6 +344,10 @@ module Grntest
|
|
336
344
|
@suppress_omit_log
|
337
345
|
end
|
338
346
|
|
347
|
+
def suppress_backtrace?
|
348
|
+
@suppress_backtrace
|
349
|
+
end
|
350
|
+
|
339
351
|
def debug?
|
340
352
|
@debug
|
341
353
|
end
|
data/lib/grntest/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grntest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-03-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -219,14 +219,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
219
|
version: '0'
|
220
220
|
requirements: []
|
221
221
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.5.
|
222
|
+
rubygems_version: 2.5.2
|
223
223
|
signing_key:
|
224
224
|
specification_version: 4
|
225
225
|
summary: Grntest is a testing framework for Groonga. You can write a test for Groonga
|
226
226
|
by writing Groonga commands and expected result.
|
227
227
|
test_files:
|
228
|
-
- test/
|
228
|
+
- test/test-log-parser.rb
|
229
229
|
- test/executors/test-base-executor.rb
|
230
230
|
- test/executors/test-standard-io-executor.rb
|
231
|
-
- test/test
|
232
|
-
has_rdoc:
|
231
|
+
- test/run-test.rb
|