lazylead 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) 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/.github/dependabot.yml +6 -0
  7. data/Rakefile +6 -3
  8. data/bin/lazylead +7 -5
  9. data/lazylead.gemspec +5 -3
  10. data/lib/lazylead/cli/app.rb +5 -2
  11. data/lib/lazylead/exchange.rb +15 -9
  12. data/lib/lazylead/log.rb +2 -1
  13. data/lib/lazylead/model.rb +35 -1
  14. data/lib/lazylead/opts.rb +13 -0
  15. data/lib/lazylead/postman.rb +13 -7
  16. data/lib/lazylead/schedule.rb +16 -15
  17. data/lib/lazylead/smtp.rb +3 -1
  18. data/lib/lazylead/system/jira.rb +65 -4
  19. data/lib/lazylead/task/accuracy/accuracy.rb +13 -8
  20. data/lib/lazylead/task/accuracy/affected_build.rb +2 -6
  21. data/lib/lazylead/task/accuracy/attachment.rb +44 -0
  22. data/lib/lazylead/task/accuracy/environment.rb +39 -0
  23. data/lib/lazylead/task/accuracy/logs.rb +42 -0
  24. data/lib/lazylead/task/accuracy/records.rb +45 -0
  25. data/lib/lazylead/task/accuracy/requirement.rb +9 -0
  26. data/lib/lazylead/task/accuracy/servers.rb +50 -0
  27. data/lib/lazylead/task/accuracy/stacktrace.rb +103 -0
  28. data/lib/lazylead/task/accuracy/testcase.rb +91 -0
  29. data/lib/lazylead/task/accuracy/wiki.rb +41 -0
  30. data/lib/lazylead/task/assignment.rb +96 -0
  31. data/lib/lazylead/task/echo.rb +18 -0
  32. data/lib/lazylead/task/fix_version.rb +13 -2
  33. data/lib/lazylead/task/svn/diff.rb +76 -0
  34. data/lib/lazylead/task/svn/grep.rb +111 -0
  35. data/lib/lazylead/task/svn/touch.rb +101 -0
  36. data/lib/lazylead/version.rb +1 -1
  37. data/lib/messages/illegal_assignee_change.erb +123 -0
  38. data/lib/messages/illegal_fixversion_change.erb +2 -0
  39. data/lib/messages/svn_diff.erb +110 -0
  40. data/lib/messages/svn_diff_attachment.erb +117 -0
  41. data/lib/messages/svn_grep.erb +114 -0
  42. data/lib/messages/svn_touch.erb +1 -1
  43. data/license.txt +1 -1
  44. data/readme.md +5 -5
  45. data/test/lazylead/cli/app_test.rb +11 -11
  46. data/test/lazylead/system/jira_test.rb +41 -4
  47. data/test/lazylead/task/accuracy/accuracy_test.rb +1 -1
  48. data/test/lazylead/task/accuracy/affected_build_test.rb +2 -2
  49. data/test/lazylead/task/accuracy/attachment_test.rb +50 -0
  50. data/test/lazylead/task/accuracy/environment_test.rb +42 -0
  51. data/test/lazylead/task/accuracy/logs_test.rb +138 -0
  52. data/test/lazylead/task/accuracy/records_test.rb +60 -0
  53. data/test/lazylead/task/accuracy/score_test.rb +46 -0
  54. data/test/lazylead/task/accuracy/servers_test.rb +66 -0
  55. data/test/lazylead/task/accuracy/stacktrace_test.rb +340 -0
  56. data/test/lazylead/task/accuracy/testcase_test.rb +225 -0
  57. data/test/lazylead/task/accuracy/wiki_test.rb +40 -0
  58. data/test/lazylead/task/{touch_test.rb → assignment_test.rb} +17 -27
  59. data/test/lazylead/task/svn/diff_test.rb +97 -0
  60. data/test/lazylead/task/svn/grep_test.rb +61 -0
  61. data/test/lazylead/task/svn/touch_test.rb +61 -0
  62. data/test/test.rb +25 -0
  63. data/upgrades/sqlite/001-install-main-lazylead-tables.sql +1 -5
  64. data/upgrades/sqlite/999.testdata.sql +12 -17
  65. metadata +88 -21
  66. data/.travis.yml +0 -16
  67. data/lib/lazylead/task/touch.rb +0 -102
@@ -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