grntest 1.5.6 → 1.5.8
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 +21 -0
- data/lib/grntest/executors/base-executor.rb +50 -4
- data/lib/grntest/template-evaluator.rb +7 -3
- data/lib/grntest/test-runner.rb +20 -5
- data/lib/grntest/tester.rb +31 -3
- data/lib/grntest/version.rb +2 -2
- data/lib/grntest/worker.rb +21 -23
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2209e3afe2a2ef0d25a9ad8e61e0ef36fad7b9faa7106b20d00511ad6f767a9e
|
4
|
+
data.tar.gz: dfe1b6a22dbae8d02ada396dc237e20f7384e94a52b5c37e35d8c2dbd01a90df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e84e6673963cb2bf2de0cb5cbd21a9d64977924716c37102aea48415aab1ffcbfdde2f630030f3179828c9e0855da124ca226523c0a060dd92cfd04bb6880e1
|
7
|
+
data.tar.gz: 6f2c4f6730b26200e5fa8d39cb56d550dbe98407e5eb54f824e99f0dac9a84616da12fb1f4a32e799344d443d91fd297128e979a8c1caafa96d85a15fb7444ce
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.5.8: 2023-07-21
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* `--random-seed`: Added.
|
8
|
+
|
9
|
+
* xml: Accepted negative elapsed time.
|
10
|
+
|
11
|
+
* Added support for groonga-nginx.
|
12
|
+
|
13
|
+
## 1.5.7: 2023-03-08
|
14
|
+
|
15
|
+
### Improvements
|
16
|
+
|
17
|
+
* Added support for `rr`.
|
18
|
+
|
19
|
+
* Improved backtrace normalization on macOS.
|
20
|
+
|
21
|
+
* Added `add-substitution` and `remove-substitution` to unify common
|
22
|
+
tests for `NormalizerNFKC*`.
|
23
|
+
|
3
24
|
## 1.5.6: 2022-03-16
|
4
25
|
|
5
26
|
### Improvements
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <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
|
@@ -47,6 +47,7 @@ module Grntest
|
|
47
47
|
@sleep_after_command = nil
|
48
48
|
@raw_status_response = nil
|
49
49
|
@features = nil
|
50
|
+
@substitutions = {}
|
50
51
|
end
|
51
52
|
|
52
53
|
def execute(script_path)
|
@@ -59,6 +60,7 @@ module Grntest
|
|
59
60
|
parser = create_parser
|
60
61
|
script_file.each_line do |line|
|
61
62
|
begin
|
63
|
+
line = substitute_input(line)
|
62
64
|
parser << line
|
63
65
|
rescue Error, Groonga::Command::Parser::Error
|
64
66
|
line_info = "#{script_path}:#{script_file.lineno}:#{line.chomp}"
|
@@ -319,7 +321,7 @@ module Grntest
|
|
319
321
|
record << ","
|
320
322
|
end
|
321
323
|
record << "\n"
|
322
|
-
record << evaluator.evaluate(i).to_json
|
324
|
+
record << evaluator.evaluate(i: i).to_json
|
323
325
|
before = Time.now
|
324
326
|
parser << record
|
325
327
|
elapsed = Time.now - before
|
@@ -479,6 +481,45 @@ module Grntest
|
|
479
481
|
end
|
480
482
|
end
|
481
483
|
|
484
|
+
def substitute_input(input)
|
485
|
+
return input if @substitutions.empty?
|
486
|
+
@substitutions.each_value do |pattern, substituted_evaluator, _|
|
487
|
+
input = input.gsub(pattern) do
|
488
|
+
substituted_evaluator.evaluate(match_data: Regexp.last_match)
|
489
|
+
end
|
490
|
+
end
|
491
|
+
input
|
492
|
+
end
|
493
|
+
|
494
|
+
def normalize_input(input)
|
495
|
+
return input if @substitutions.empty?
|
496
|
+
@substitutions.each_value do |pattern, _, normalized_evaluator|
|
497
|
+
input = input.gsub(pattern) do
|
498
|
+
normalized_evaluator.evaluate(match_data: Regexp.last_match)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
input
|
502
|
+
end
|
503
|
+
|
504
|
+
def execute_directive_add_substitution(line, content, options)
|
505
|
+
_, pattern, rest = content.split(" ", 3)
|
506
|
+
substituted, normalized = Shellwords.shellsplit(rest)
|
507
|
+
substituted.force_encoding("UTF-8")
|
508
|
+
normalized.force_encoding("UTF-8")
|
509
|
+
substituted_evaluator = TemplateEvaluator.new("\"#{substituted}\"")
|
510
|
+
normalized_evaluator = TemplateEvaluator.new("\"#{normalized}\"")
|
511
|
+
@substitutions[pattern] = [
|
512
|
+
compile_pattern(pattern),
|
513
|
+
substituted_evaluator,
|
514
|
+
normalized_evaluator,
|
515
|
+
]
|
516
|
+
end
|
517
|
+
|
518
|
+
def execute_directive_remove_substitution(line, content, options)
|
519
|
+
pattern = content.split(" ", 2)[1]
|
520
|
+
@substitutions.delete(pattern)
|
521
|
+
end
|
522
|
+
|
482
523
|
def execute_directive(parser, line, content)
|
483
524
|
command, *options = Shellwords.split(content)
|
484
525
|
case command
|
@@ -534,6 +575,10 @@ module Grntest
|
|
534
575
|
execute_directive_require_feature(line, content, options)
|
535
576
|
when "synonym-generate"
|
536
577
|
execute_directive_synonym_generate(parser, line, content, options)
|
578
|
+
when "add-substitution"
|
579
|
+
execute_directive_add_substitution(line, content, options)
|
580
|
+
when "remove-substitution"
|
581
|
+
execute_directive_remove_substitution(line, content, options)
|
537
582
|
else
|
538
583
|
log_input(line)
|
539
584
|
log_error("#|e| unknown directive: <#{command}>")
|
@@ -722,7 +767,7 @@ module Grntest
|
|
722
767
|
true
|
723
768
|
when /\A[\w.\\-]+:\d+:\d+: /
|
724
769
|
true
|
725
|
-
when /\A(?:groonga|groonga-httpd)
|
770
|
+
when /\A(?:groonga|groonga-httpd|nginx)
|
726
771
|
\((?:\+0x\h+|\w+\+0x\h+)?\)
|
727
772
|
\s
|
728
773
|
\[0x\h+\]\z/x
|
@@ -731,7 +776,7 @@ module Grntest
|
|
731
776
|
# groonga-httpd(+0xbd1aa) [0x564caf2bfc12]
|
732
777
|
# groonga-httpd(ngx_http_core_run_phases+0x25) [0x564caf2bfc12]
|
733
778
|
true
|
734
|
-
when /\A\d+\s+(?:lib\S+\.dylib|\S+\.so|groonga|nginx
|
779
|
+
when /\A\d+\s+(?:lib\S+\.dylib|\S+\.so|groonga|nginx|\?\?\?|dyld)\s+
|
735
780
|
0x[\da-f]+\s
|
736
781
|
\S+\s\+\s\d+\z/x
|
737
782
|
true
|
@@ -780,6 +825,7 @@ module Grntest
|
|
780
825
|
end
|
781
826
|
|
782
827
|
def log_input(content)
|
828
|
+
content = normalize_input(content)
|
783
829
|
log(:input, content)
|
784
830
|
end
|
785
831
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2016 Kouhei
|
1
|
+
# Copyright (C) 2016-2023 Sutou Kouhei <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
|
@@ -19,8 +19,12 @@ module Grntest
|
|
19
19
|
@template = template
|
20
20
|
end
|
21
21
|
|
22
|
-
def evaluate(
|
23
|
-
|
22
|
+
def evaluate(**local_variables)
|
23
|
+
_binding = binding
|
24
|
+
local_variables.each do |name, value|
|
25
|
+
_binding.local_variable_set(name, value)
|
26
|
+
end
|
27
|
+
_binding.eval(@template)
|
24
28
|
end
|
25
29
|
end
|
26
30
|
end
|
data/lib/grntest/test-runner.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2022 Sutou Kouhei <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
|
@@ -272,6 +272,13 @@ call (int)chdir("#{context.temporary_directory_path}")
|
|
272
272
|
command_line << "--command=#{gdb_command_path}"
|
273
273
|
command_line << "--quiet"
|
274
274
|
command_line << "--args"
|
275
|
+
elsif @tester.rr
|
276
|
+
if libtool_wrapper?(command)
|
277
|
+
command_line << find_libtool(command)
|
278
|
+
command_line << "--mode=execute"
|
279
|
+
end
|
280
|
+
command_line << @tester.rr
|
281
|
+
command_line << "record"
|
275
282
|
elsif @tester.valgrind
|
276
283
|
if libtool_wrapper?(command)
|
277
284
|
command_line << find_libtool(command)
|
@@ -493,10 +500,13 @@ call (int)chdir("#{context.temporary_directory_path}")
|
|
493
500
|
"-s",
|
494
501
|
context.relative_db_path.to_s,
|
495
502
|
]
|
496
|
-
when "groonga-httpd"
|
497
|
-
command_line = command_command_line(@tester.groonga_httpd,
|
503
|
+
when "groonga-httpd", "groonga-nginx"
|
504
|
+
command_line = command_command_line(@tester.groonga_httpd,
|
505
|
+
context,
|
498
506
|
spawn_options)
|
499
|
-
config_file_path = create_config_file(context,
|
507
|
+
config_file_path = create_config_file(context,
|
508
|
+
host,
|
509
|
+
port,
|
500
510
|
pid_file_path)
|
501
511
|
command_line += [
|
502
512
|
"-c", config_file_path.to_s,
|
@@ -510,6 +520,11 @@ call (int)chdir("#{context.temporary_directory_path}")
|
|
510
520
|
config_file_path =
|
511
521
|
context.temporary_directory_path + "groonga-httpd.conf"
|
512
522
|
config_file_path.open("w") do |config_file|
|
523
|
+
if @tester.ngx_http_groonga_module_so
|
524
|
+
config_file.puts(<<-LOAD_MODULE)
|
525
|
+
load_module #{@tester.ngx_http_groonga_module_so};
|
526
|
+
LOAD_MODULE
|
527
|
+
end
|
513
528
|
config_file.puts(<<-GLOBAL)
|
514
529
|
daemon off;
|
515
530
|
master_process off;
|
@@ -718,7 +733,7 @@ http {
|
|
718
733
|
|
719
734
|
def normalize_output_xml(content, options)
|
720
735
|
content.sub(/^<RESULT .+?>/) do |result|
|
721
|
-
result.gsub(/( (?:UP|ELAPSED))="
|
736
|
+
result.gsub(/( (?:UP|ELAPSED))="-?\d+\.\d+(?:e[+-]?\d+)?"/, '\1="0.0"')
|
722
737
|
end
|
723
738
|
end
|
724
739
|
|
data/lib/grntest/tester.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <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
|
@@ -38,6 +38,7 @@ module Grntest
|
|
38
38
|
parser = OptionParser.new
|
39
39
|
parser.banner += " TEST_FILE_OR_DIRECTORY..."
|
40
40
|
|
41
|
+
custom_groonga_httpd = false
|
41
42
|
parser.on("--groonga=COMMAND",
|
42
43
|
"Use COMMAND as groonga command",
|
43
44
|
"(#{tester.groonga})") do |command|
|
@@ -48,6 +49,13 @@ module Grntest
|
|
48
49
|
"Use COMMAND as groonga-httpd command for groonga-httpd tests",
|
49
50
|
"(#{tester.groonga_httpd})") do |command|
|
50
51
|
tester.groonga_httpd = normalize_command(command)
|
52
|
+
custom_groonga_httpd = true
|
53
|
+
end
|
54
|
+
|
55
|
+
parser.on("--ngx-http-groonga-module-so=PATH",
|
56
|
+
"Use PATH as ngx_http_groonga_module.so for groonga-nginx tests",
|
57
|
+
"(#{tester.ngx_http_groonga_module_so})") do |path|
|
58
|
+
tester.ngx_http_groonga_module_so = path
|
51
59
|
end
|
52
60
|
|
53
61
|
parser.on("--groonga-suggest-create-dataset=COMMAND",
|
@@ -101,15 +109,19 @@ module Grntest
|
|
101
109
|
tester.output_type = type
|
102
110
|
end
|
103
111
|
|
104
|
-
available_testees = ["groonga", "groonga-httpd"]
|
112
|
+
available_testees = ["groonga", "groonga-httpd", "groonga-nginx"]
|
105
113
|
available_testee_labels = available_testees.join(", ")
|
106
114
|
parser.on("--testee=TESTEE", available_testees,
|
107
115
|
"Test against TESTEE",
|
108
116
|
"[#{available_testee_labels}]",
|
109
117
|
"(#{tester.testee})") do |testee|
|
110
118
|
tester.testee = testee
|
111
|
-
|
119
|
+
case tester.testee
|
120
|
+
when "groonga-httpd"
|
112
121
|
tester.interface = "http"
|
122
|
+
when "groonga-nginx"
|
123
|
+
tester.interface = "http"
|
124
|
+
tester.groonga_httpd = "nginx" unless custom_groonga_httpd
|
113
125
|
end
|
114
126
|
end
|
115
127
|
|
@@ -197,6 +209,12 @@ module Grntest
|
|
197
209
|
tester.gdb = command || tester.default_gdb
|
198
210
|
end
|
199
211
|
|
212
|
+
parser.on("--rr[=COMMAND]",
|
213
|
+
"Run Groonga on 'rr record' and use COMMAND as rr",
|
214
|
+
"(#{tester.default_rr})") do |command|
|
215
|
+
tester.rr = command || tester.default_rr
|
216
|
+
end
|
217
|
+
|
200
218
|
parser.on("--valgrind[=COMMAND]",
|
201
219
|
"Run Groonga on valgrind and use COMMAND as valgrind",
|
202
220
|
"(#{tester.default_valgrind})") do |command|
|
@@ -275,6 +293,11 @@ module Grntest
|
|
275
293
|
tester.shutdown_wait_timeout = timeout
|
276
294
|
end
|
277
295
|
|
296
|
+
parser.on("--random-seed=SEED", Integer,
|
297
|
+
"Seed for random numbers") do |seed|
|
298
|
+
srand(seed)
|
299
|
+
end
|
300
|
+
|
278
301
|
parser.on("--version",
|
279
302
|
"Show version and exit") do
|
280
303
|
puts(VERSION)
|
@@ -311,6 +334,7 @@ module Grntest
|
|
311
334
|
|
312
335
|
attr_accessor :groonga
|
313
336
|
attr_accessor :groonga_httpd
|
337
|
+
attr_accessor :ngx_http_groonga_module_so
|
314
338
|
attr_accessor :groonga_suggest_create_dataset
|
315
339
|
attr_accessor :groonga_synonym_generate
|
316
340
|
attr_accessor :interface
|
@@ -323,6 +347,7 @@ module Grntest
|
|
323
347
|
attr_accessor :n_workers
|
324
348
|
attr_accessor :output
|
325
349
|
attr_accessor :gdb, :default_gdb
|
350
|
+
attr_accessor :rr, :default_rr
|
326
351
|
attr_accessor :valgrind, :default_valgrind
|
327
352
|
attr_accessor :timeout
|
328
353
|
attr_accessor :read_timeout
|
@@ -339,6 +364,7 @@ module Grntest
|
|
339
364
|
def initialize
|
340
365
|
@groonga = "groonga"
|
341
366
|
@groonga_httpd = "groonga-httpd"
|
367
|
+
@ngx_http_groonga_module_so = nil
|
342
368
|
@groonga_suggest_create_dataset = "groonga-suggest-create-dataset"
|
343
369
|
unless command_exist?(@groonga_suggest_create_dataset)
|
344
370
|
@groonga_suggest_create_dataset = nil
|
@@ -534,6 +560,8 @@ module Grntest
|
|
534
560
|
def initialize_debuggers
|
535
561
|
@gdb = nil
|
536
562
|
@default_gdb = "gdb"
|
563
|
+
@rr = nil
|
564
|
+
@default_rr = "rr"
|
537
565
|
end
|
538
566
|
|
539
567
|
def initialize_memory_checkers
|
data/lib/grntest/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2023 Sutou Kouhei <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
|
@@ -14,5 +14,5 @@
|
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
16
|
module Grntest
|
17
|
-
VERSION = "1.5.
|
17
|
+
VERSION = "1.5.8"
|
18
18
|
end
|
data/lib/grntest/worker.rb
CHANGED
@@ -93,31 +93,29 @@ module Grntest
|
|
93
93
|
|
94
94
|
@result.measure do
|
95
95
|
@reporter.on_worker_start(self)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
break
|
115
|
-
end
|
96
|
+
loop do
|
97
|
+
suite_name, test_script_path, test_name = queue.pop
|
98
|
+
break if test_script_path.nil?
|
99
|
+
|
100
|
+
unless @suite_name == suite_name
|
101
|
+
@reporter.on_suite_finish(self) if @suite_name
|
102
|
+
@suite_name = suite_name
|
103
|
+
@reporter.on_suite_start(self)
|
104
|
+
end
|
105
|
+
|
106
|
+
unless run_test(test_script_path, test_name)
|
107
|
+
succeeded = false
|
108
|
+
end
|
109
|
+
|
110
|
+
break if interruptted?
|
111
|
+
|
112
|
+
if @tester.stop_on_failure? and @test_suites_result.have_failure?
|
113
|
+
break
|
116
114
|
end
|
117
|
-
@status = "finished"
|
118
|
-
@reporter.on_suite_finish(@suite_name) if @suite_name
|
119
|
-
@suite_name = nil
|
120
115
|
end
|
116
|
+
@status = "finished"
|
117
|
+
@reporter.on_suite_finish(@suite_name) if @suite_name
|
118
|
+
@suite_name = nil
|
121
119
|
end
|
122
120
|
@reporter.on_worker_finish(self)
|
123
121
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grntest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
- Haruka Yoshihara
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: diff-lcs
|
@@ -269,7 +269,7 @@ homepage: https://github.com/groonga/grntest
|
|
269
269
|
licenses:
|
270
270
|
- GPL-3.0+
|
271
271
|
metadata: {}
|
272
|
-
post_install_message:
|
272
|
+
post_install_message:
|
273
273
|
rdoc_options: []
|
274
274
|
require_paths:
|
275
275
|
- lib
|
@@ -284,8 +284,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
284
284
|
- !ruby/object:Gem::Version
|
285
285
|
version: '0'
|
286
286
|
requirements: []
|
287
|
-
rubygems_version: 3.
|
288
|
-
signing_key:
|
287
|
+
rubygems_version: 3.5.0.dev
|
288
|
+
signing_key:
|
289
289
|
specification_version: 4
|
290
290
|
summary: Grntest is a testing framework for Groonga. You can write a test for Groonga
|
291
291
|
by writing Groonga commands and expected result.
|