lazylead 0.4.3 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.docs/accuracy.md +2 -2
  3. data/.docs/duedate_expired.md +3 -3
  4. data/.docs/propagate_down.md +3 -3
  5. data/.gitattributes +1 -0
  6. data/Rakefile +6 -3
  7. data/bin/lazylead +7 -5
  8. data/lazylead.gemspec +4 -3
  9. data/lib/lazylead/cli/app.rb +11 -3
  10. data/lib/lazylead/exchange.rb +15 -9
  11. data/lib/lazylead/log.rb +2 -1
  12. data/lib/lazylead/model.rb +42 -1
  13. data/lib/lazylead/opts.rb +13 -0
  14. data/lib/lazylead/postman.rb +13 -7
  15. data/lib/lazylead/schedule.rb +16 -15
  16. data/lib/lazylead/smtp.rb +3 -1
  17. data/lib/lazylead/system/jira.rb +65 -4
  18. data/lib/lazylead/task/accuracy/accuracy.rb +13 -8
  19. data/lib/lazylead/task/accuracy/affected_build.rb +2 -6
  20. data/lib/lazylead/task/accuracy/attachment.rb +44 -0
  21. data/lib/lazylead/task/accuracy/environment.rb +39 -0
  22. data/lib/lazylead/task/accuracy/logs.rb +42 -0
  23. data/lib/lazylead/task/accuracy/records.rb +45 -0
  24. data/lib/lazylead/task/accuracy/requirement.rb +9 -0
  25. data/lib/lazylead/task/accuracy/servers.rb +50 -0
  26. data/lib/lazylead/task/accuracy/stacktrace.rb +103 -0
  27. data/lib/lazylead/task/accuracy/testcase.rb +92 -0
  28. data/lib/lazylead/task/accuracy/wiki.rb +41 -0
  29. data/lib/lazylead/task/assignment.rb +96 -0
  30. data/lib/lazylead/task/echo.rb +18 -0
  31. data/lib/lazylead/task/fix_version.rb +13 -2
  32. data/lib/lazylead/task/svn/diff.rb +85 -0
  33. data/lib/lazylead/task/svn/grep.rb +111 -0
  34. data/lib/lazylead/task/svn/touch.rb +101 -0
  35. data/lib/lazylead/version.rb +1 -1
  36. data/lib/messages/illegal_assignee_change.erb +123 -0
  37. data/lib/messages/illegal_fixversion_change.erb +2 -0
  38. data/lib/messages/svn_diff.erb +110 -0
  39. data/lib/messages/svn_diff_attachment.erb +117 -0
  40. data/lib/messages/svn_grep.erb +114 -0
  41. data/license.txt +1 -1
  42. data/readme.md +5 -5
  43. data/test/lazylead/cli/app_test.rb +11 -11
  44. data/test/lazylead/model_test.rb +10 -0
  45. data/test/lazylead/system/jira_test.rb +41 -4
  46. data/test/lazylead/task/accuracy/accuracy_test.rb +1 -1
  47. data/test/lazylead/task/accuracy/affected_build_test.rb +2 -2
  48. data/test/lazylead/task/accuracy/attachment_test.rb +50 -0
  49. data/test/lazylead/task/accuracy/environment_test.rb +42 -0
  50. data/test/lazylead/task/accuracy/logs_test.rb +138 -0
  51. data/test/lazylead/task/accuracy/records_test.rb +60 -0
  52. data/test/lazylead/task/accuracy/score_test.rb +46 -0
  53. data/test/lazylead/task/accuracy/servers_test.rb +66 -0
  54. data/test/lazylead/task/accuracy/stacktrace_test.rb +340 -0
  55. data/test/lazylead/task/accuracy/testcase_test.rb +254 -0
  56. data/test/lazylead/task/accuracy/wiki_test.rb +40 -0
  57. data/test/lazylead/task/assignment_test.rb +53 -0
  58. data/test/lazylead/task/svn/diff_test.rb +97 -0
  59. data/test/lazylead/task/svn/grep_test.rb +61 -0
  60. data/test/lazylead/task/{touch_test.rb → svn/touch_test.rb} +8 -8
  61. data/test/test.rb +16 -0
  62. data/upgrades/sqlite/001-install-main-lazylead-tables.sql +1 -5
  63. data/upgrades/sqlite/999.testdata.sql +13 -17
  64. metadata +72 -20
  65. data/.travis.yml +0 -16
  66. data/lib/lazylead/task/touch.rb +0 -104
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/environment"
27
+
28
+ module Lazylead
29
+ class EnvironmentTest < Lazylead::Test
30
+ test "environment absent" do
31
+ refute Environment.new.passed(
32
+ OpenStruct.new(fields: { "environment" => "" })
33
+ )
34
+ end
35
+
36
+ test "environment provided" do
37
+ assert Environment.new.passed(
38
+ OpenStruct.new(fields: { "environment" => "http://host:port" })
39
+ )
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/logs"
27
+
28
+ module Lazylead
29
+ class LogsTest < Lazylead::Test
30
+ test "log file is present" do
31
+ assert Logs.new.passed(
32
+ OpenStruct.new(
33
+ attachments: [
34
+ OpenStruct.new(
35
+ attrs: { "size" => 10_241, "filename" => "catalina.log" }
36
+ )
37
+ ]
38
+ )
39
+ )
40
+ end
41
+
42
+ test "log file is present but name in uppercase" do
43
+ assert Logs.new.passed(
44
+ OpenStruct.new(
45
+ attachments: [
46
+ OpenStruct.new(
47
+ attrs: { "size" => 10_241, "filename" => "catalina.LOG" }
48
+ )
49
+ ]
50
+ )
51
+ )
52
+ end
53
+
54
+ test "attachment isn't a log file" do
55
+ refute Logs.new.passed(
56
+ OpenStruct.new(
57
+ attachments: [
58
+ OpenStruct.new(
59
+ attrs: { "size" => 10_001, "filename" => "readme.md" }
60
+ )
61
+ ]
62
+ )
63
+ )
64
+ end
65
+
66
+ test "log file size less than 5KB" do
67
+ refute Logs.new.passed(
68
+ OpenStruct.new(
69
+ attachments: [
70
+ OpenStruct.new(
71
+ attrs: { "size" => 5000, "filename" => "catalina.log" }
72
+ )
73
+ ]
74
+ )
75
+ )
76
+ end
77
+
78
+ test "rotated log file is present" do
79
+ assert Logs.new.passed(
80
+ OpenStruct.new(
81
+ attachments: [
82
+ OpenStruct.new(
83
+ attrs: { "size" => 10_241, "filename" => "catalina.log111" }
84
+ )
85
+ ]
86
+ )
87
+ )
88
+ end
89
+
90
+ test "log txt file is present" do
91
+ assert Logs.new.passed(
92
+ OpenStruct.new(
93
+ attachments: [
94
+ OpenStruct.new(
95
+ attrs: { "size" => 10_241, "filename" => "catalina.txt" }
96
+ )
97
+ ]
98
+ )
99
+ )
100
+ end
101
+
102
+ test "zip log file is present" do
103
+ assert Logs.new.passed(
104
+ OpenStruct.new(
105
+ attachments: [
106
+ OpenStruct.new(
107
+ attrs: { "size" => 10_241, "filename" => "catalina.log.zip" }
108
+ )
109
+ ]
110
+ )
111
+ )
112
+ end
113
+
114
+ test "gz log file is present" do
115
+ assert Logs.new.passed(
116
+ OpenStruct.new(
117
+ attachments: [
118
+ OpenStruct.new(
119
+ attrs: { "size" => 10_241, "filename" => "catalina.log.gz" }
120
+ )
121
+ ]
122
+ )
123
+ )
124
+ end
125
+
126
+ test "tar gz log file is present" do
127
+ assert Logs.new.passed(
128
+ OpenStruct.new(
129
+ attachments: [
130
+ OpenStruct.new(
131
+ attrs: { "size" => 10_241, "filename" => "catalina.log.tar.gz" }
132
+ )
133
+ ]
134
+ )
135
+ )
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/records"
27
+
28
+ module Lazylead
29
+ class RecordsTest < Lazylead::Test
30
+ test "file has .mp4 extension" do
31
+ assert Records.new.passed(
32
+ OpenStruct.new(
33
+ attachments: [
34
+ OpenStruct.new(attrs: { "filename" => "failed case 1.mp4" })
35
+ ]
36
+ )
37
+ )
38
+ end
39
+
40
+ test "file has .avi extension" do
41
+ assert Records.new.passed(
42
+ OpenStruct.new(
43
+ attachments: [
44
+ OpenStruct.new(attrs: { "filename" => "failed case 2.avi" })
45
+ ]
46
+ )
47
+ )
48
+ end
49
+
50
+ test "file has .txt extension" do
51
+ refute Records.new.passed(
52
+ OpenStruct.new(
53
+ attachments: [
54
+ OpenStruct.new(attrs: { "filename" => "failed case 2.txt" })
55
+ ]
56
+ )
57
+ )
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/accuracy"
27
+
28
+ module Lazylead
29
+ class ScoreTest < Lazylead::Test
30
+ test "grade is detected" do
31
+ {
32
+ "7": "0",
33
+ "5.5": "0",
34
+ "12": "10",
35
+ "21.5": "20",
36
+ "25.5": "20",
37
+ "57": "50",
38
+ "98": "90",
39
+ "100": "100"
40
+ }.each do |k, v|
41
+ assert_equal v.to_f,
42
+ Lazylead::Score.new({}, {}, {}).grade(k.to_s.to_f)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/servers"
27
+
28
+ module Lazylead
29
+ class ServersTest < Lazylead::Test
30
+ class Task
31
+ def initialize(desc)
32
+ @desc = desc
33
+ end
34
+
35
+ def [](_)
36
+ ""
37
+ end
38
+
39
+ def description
40
+ @desc
41
+ end
42
+ end
43
+
44
+ test "url to failed entity found in description" do
45
+ assert Servers.new(envs: [%r{(http|https):\/\/\w+\:\d+\/.{10,}}]).passed(
46
+ Task.new(
47
+ "1. Open the dedicated app
48
+ 2. Click on https://server:6900/object?id=2000
49
+ ER: Object has no failed status
50
+ AR: Object has failed status"
51
+ )
52
+ )
53
+ end
54
+
55
+ test "url to failed entity not present in description" do
56
+ refute Servers.new(envs: [%r{(http|https):\/\/\w+\:\d+\/.{10,}}]).passed(
57
+ Task.new(
58
+ "1. Open the dedicated app
59
+ 2. Click on https://server:6900/
60
+ ER: Object has no failed status
61
+ AR: Object has failed status"
62
+ )
63
+ )
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,340 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The MIT License
4
+ #
5
+ # Copyright (c) 2019-2020 Yurii Dubinka
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"),
9
+ # to deal in the Software without restriction, including without limitation
10
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
+ # and/or sell copies of the Software, and to permit persons to whom
12
+ # the Software is furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
+ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
23
+ # OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require_relative "../../../test"
26
+ require_relative "../../../../lib/lazylead/task/accuracy/stacktrace"
27
+
28
+ module Lazylead
29
+ class StacktraceTest < Lazylead::Test
30
+ test "java stacktrace is found" do
31
+ assert Stacktrace.new.passed(
32
+ OpenStruct.new(
33
+ description: "
34
+ XXXXXX env: http://xxxx.xxx.com:00000/
35
+ WL log [^clust1.log]
36
+ http://xxx.xxx.com/display/xxx/SQLException+No+more+data+to+read+from+socket
37
+
38
+ During call we found in clust1.log the following error
39
+ {noformat}
40
+ at xxx.xxx.xxx.xxx.wrapper.XxxXxxXxxxXxx.xxxxXxxxXxxx(XxxXxxXxxxXxx.java:233)
41
+ at xxx.xxx.xxx.xxx.wrapper.XxxXxxXxxxXxx.xxxxXxxxXxxx(XxxXxxXxxxXxx.java:343)
42
+ ... 318 more
43
+ Caused by: javax.transaction.TransactionRolledbackException: EJB Exception: ; nested exception is:
44
+ javax.ejb.TransactionRolledbackLocalException: EJB Exception:
45
+ at weblogic.utils.StackTraceDisabled.unknownMethod()
46
+ Caused by: javax.ejb.TransactionRolledbackLocalException: EJB Exception:
47
+ ... 1 more
48
+ Caused by: javax.ejb.EJBException: java.sql.SQLRecoverableException: No more data to read from socket
49
+ ... 1 more
50
+ Caused by: java.sql.SQLRecoverableException: No more data to read from socket
51
+ ... 1 more
52
+ {noformat}
53
+
54
+ The investigation is required.
55
+ More details here: XXXXX-xxxxxx"
56
+ )
57
+ )
58
+ end
59
+
60
+ test "java stacktrace is found in uppercase" do
61
+ assert Stacktrace.new.passed(
62
+ OpenStruct.new(
63
+ description: "
64
+ XXXXXX env: http://xxxx.xxx.com:00000/
65
+ WL log [^clust1.log]
66
+ http://xxx.xxx.com/display/xxx/SQLException+No+more+data+to+read+from+socket
67
+
68
+ During call we found in clust1.log the following error
69
+ {NoFoRmAt}
70
+ at xxx.xxx.xxx.xxx.wrapper.XxxXxxXxxxXxx.xxxxXxxxXxxx(XxxXxxXxxxXxx.java:233)
71
+ at xxx.xxx.xxx.xxx.wrapper.XxxXxxXxxxXxx.xxxxXxxxXxxx(XxxXxxXxxxXxx.java:343)
72
+ ... 318 more
73
+ Caused by: javax.transaction.TransactionRolledbackException: EJB Exception: ; nested exception is:
74
+ javax.ejb.TransactionRolledbackLocalException: EJB Exception:
75
+ at weblogic.utils.StackTraceDisabled.unknownMethod()
76
+ Caused by: javax.ejb.TransactionRolledbackLocalException: EJB Exception:
77
+ ... 1 more
78
+ Caused by: javax.ejb.EJBException: java.sql.SQLRecoverableException: No more data to read from socket
79
+ ... 1 more
80
+ Caused by: java.sql.SQLRecoverableException: No more data to read from socket
81
+ ... 1 more
82
+ {NoFoRmAt}
83
+
84
+ The investigation is required.
85
+ More details here: XXXXX-xxxxxx"
86
+ )
87
+ )
88
+ end
89
+
90
+ test "stacktrace is found" do
91
+ assert Stacktrace.new.passed(
92
+ OpenStruct.new(
93
+ description: "
94
+ Stack Trace
95
+ {noformat}
96
+ javax.transaction.TransactionRolledbackException: EJB Exception: ; nested exception is:
97
+ java.lang.IllegalArgumentException: Unknown xxxx-xxx xxx \"xxx.xxx.xxx.configuration\"
98
+ at weblogic.ejb.container.internal.EJBRuntimeUtils.asTxRollbackException(EJBRuntimeUtils.java:134)
99
+ at weblogic.ejb.container.internal.BaseRemoteObject.handleSystemException(BaseRemoteObject.java:595)
100
+ at weblogic.ejb.container.internal.BaseRemoteObject.handleSystemException(BaseRemoteObject.java:537)
101
+ at weblogic.ejb.container.internal.BaseRemoteObject.postInvoke1(BaseRemoteObject.java:365)
102
+ at weblogic.ejb.container.internal.StatelessRemoteObject.postInvoke1(StatelessRemoteObject.java:20)
103
+ at weblogic.ejb.container.internal.BaseRemoteObject.__WL_postInvokeTxRetry(BaseRemoteObject.java:307)
104
+ at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invokeInternal(SessionRemoteMethodInvoker.java:67)
105
+ at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invoke(SessionRemoteMethodInvoker.java:21)
106
+ at xxx.xxxx.xxxxxx.xxx.xxx.XxxxXxxxXxxxXxxxxxx.xxxxXxxxXXxxxx(Unknown Source)
107
+ at xxxx.xxxxxx.xxxxx.xxx.xxxxxx.xxx.xxxxxxxx.xxxx.xxxxxx.XxxxxXxxxx.xxxXxxxXxxxx(XxxxXxxxXxxx.java:677)
108
+ at xxxx.xxxxxx.xxxxx.xxx.xxxxxx.xxx.xxxxxxxx.xxxx.xxxxxx.XxxxxXxxxx.xxxXxxxXxxxx(XxxxXxxxXxxx.java:304)
109
+ at xxxx.xxxxxx.xxxxx.xxx.xxxxxx.xxx.xxxxxxxx.xxxx.xxxxxx.XxxxxXxxxx.xxxXxxxXxxxx(XxxxXxxxXxxx.java:75)
110
+ at xxxx.xxxxxx.xxxxx.xxx.xxxxxx.xxx.xxxxxxxx.xxxx.xxxxxx.XxxxxXxxxx.xxxXxxxXxxxx(XxxxXxxxXxxx.java:138)
111
+ at sun.reflect.GeneratedMethodAccessor2010.invoke(Unknown Source)
112
+ {noformat}
113
+
114
+ Log file - [^clust3.log]
115
+
116
+ Path to log file
117
+ {noformat}
118
+ \\ftp.server.com\\logs.tgz
119
+ {noformat}
120
+
121
+ Server link - http://xxxxxXxxXxxx:0000
122
+
123
+ !214.png|thumbnail!"
124
+ )
125
+ )
126
+ end
127
+
128
+ test "exception is found" do
129
+ assert Stacktrace.new.passed(
130
+ OpenStruct.new(
131
+ description: "{noformat}sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target{noformat}"
132
+ )
133
+ )
134
+ end
135
+
136
+ test "ORA error is found" do
137
+ assert Stacktrace.new.passed(
138
+ OpenStruct.new(
139
+ description: "
140
+ {noformat}
141
+ @XXXX/xxx/xxx/xxxx_xxx_xxxxx_xxx_xx.sql
142
+ ORA-02291: 1 integrity constraint (XXX_XXX_XXX.XX_xxx) violated - xx xxx not found for xx_xx=xx xxxxx_xx=XXXXXXX xxxxx=XXXXXXXX xxx_xx=xxx xx_xxx=xxxx.xxx.xxx.xxxxx.xxx.xxx.xxxxx
143
+ XXXX-xxx-xxxx: xxxxx xxxxx Xxxxx xxxx Xxxx
144
+ {noformat}
145
+
146
+ XXXX - XXX_XXX.X.XXXX.XXXX.XXXX.XxxxxxXX.X_xxxXXXXXX"
147
+ )
148
+ )
149
+ end
150
+
151
+ test "ORA error is found in uppercase" do
152
+ assert Stacktrace.new.passed(
153
+ OpenStruct.new(
154
+ description: "
155
+ {NOFORMAT}
156
+ @XXXX/xxx/xxx/xxxx_xxx_xxxxx_xxx_xx.sql
157
+ ORA-02291: 1 integrity constraint (XXX_XXX_XXX.XX_xxx) violated - xx xxx not found for xx_xx=xx xxxxx_xx=XXXXXXX xxxxx=XXXXXXXX xxx_xx=xxx xx_xxx=xxxx.xxx.xxx.xxxxx.xxx.xxx.xxxxx
158
+ XXXX-xxx-xxxx: xxxxx xxxxx Xxxxx xxxx Xxxx
159
+ {NOFORMAT}
160
+
161
+ XXXX - XXX_XXX.X.XXXX.XXXX.XXXX.XxxxxxXX.X_xxxXXXXXX"
162
+ )
163
+ )
164
+ end
165
+
166
+ test "java error is found in code section" do
167
+ assert Stacktrace.new.passed(
168
+ OpenStruct.new(
169
+ description: "
170
+ asdfasdfasdf
171
+ {code:java}texta-line1
172
+ ;texta-line2{code}
173
+ asdjf;asdjfa;sdjf
174
+ as;djf;asdjf
175
+ {code}javax.servlet.ServletException: Something went wrong
176
+ at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
177
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
178
+ at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
179
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
180
+ at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
181
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
182
+ at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
183
+ at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
184
+ at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
185
+ at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
186
+ at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
187
+ at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
188
+ at org.mortbay.jetty.Server.handle(Server.java:326)
189
+ at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
190
+ at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
191
+ at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
192
+ at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
193
+ at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
194
+ at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
195
+ at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
196
+ Caused by: com.example.myproject.MyProjectServletException
197
+ at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
198
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
199
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
200
+ at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
201
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
202
+ at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
203
+ ... 27 more
204
+ Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
205
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
206
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
207
+ at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
208
+ at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
209
+ at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
210
+ at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
211
+ at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
212
+ at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
213
+ at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
214
+ at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
215
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
216
+ at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
217
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
218
+ at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
219
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
220
+ at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
221
+ at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
222
+ at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
223
+ at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
224
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
225
+ at java.lang.reflect.Method.invoke(Method.java:597)
226
+ at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
227
+ at $Proxy19.save(Unknown Source)
228
+ at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
229
+ at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
230
+ ... 32 more
231
+ Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
232
+ at org.hsqldb.jdbc.Util.throwError(Unknown Source)
233
+ at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
234
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
235
+ at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
236
+ ... 54 more{code}
237
+ asdfasdfasdf{code:sql}select 1 from dual {code}what?
238
+ "
239
+ )
240
+ )
241
+ end
242
+
243
+ test "java error is found in code section in uppercase" do
244
+ assert Stacktrace.new.passed(
245
+ OpenStruct.new(
246
+ description: "
247
+ {CODE}javax.servlet.ServletException: Something went wrong
248
+ at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
249
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
250
+ at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
251
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
252
+ at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
253
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
254
+ at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
255
+ at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
256
+ at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
257
+ at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
258
+ at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
259
+ at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
260
+ at org.mortbay.jetty.Server.handle(Server.java:326)
261
+ at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
262
+ at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
263
+ at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
264
+ at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
265
+ at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
266
+ at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
267
+ at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
268
+ Caused by: com.example.myproject.MyProjectServletException
269
+ at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
270
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
271
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
272
+ at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
273
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
274
+ at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
275
+ ... 27 more
276
+ Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
277
+ at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
278
+ at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
279
+ at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
280
+ at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
281
+ at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
282
+ at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
283
+ at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
284
+ at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
285
+ at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
286
+ at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
287
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
288
+ at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
289
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
290
+ at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
291
+ at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
292
+ at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
293
+ at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
294
+ at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
295
+ at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
296
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
297
+ at java.lang.reflect.Method.invoke(Method.java:597)
298
+ at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
299
+ at $Proxy19.save(Unknown Source)
300
+ at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
301
+ at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
302
+ ... 32 more
303
+ Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
304
+ at org.hsqldb.jdbc.Util.throwError(Unknown Source)
305
+ at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
306
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
307
+ at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
308
+ ... 54 more{CODE}
309
+ "
310
+ )
311
+ )
312
+ end
313
+
314
+ test "java error is found in colored code section in uppercase" do
315
+ assert Stacktrace.new.passed(
316
+ OpenStruct.new(
317
+ description: "
318
+ {CODE:red}
319
+ Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
320
+ at org.hsqldb.jdbc.Util.throwError(Unknown Source)
321
+ at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
322
+ at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
323
+ at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
324
+ ... 54 more{CODE}
325
+ "
326
+ )
327
+ )
328
+ end
329
+
330
+ test "pair detected" do
331
+ assert_equal [[1, 4]],
332
+ Stacktrace.new.pairs(%w[aa tag bb cc tag dd], "tag")
333
+ end
334
+
335
+ test "proper pair detected" do
336
+ assert_equal [[1, 4]],
337
+ Stacktrace.new.pairs(%w[aa tag bb cc tag dd tag], "tag")
338
+ end
339
+ end
340
+ end