1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.hack23.sonar.cloudformation.reports;
21
22 import java.util.List;
23
24 import org.junit.Assert;
25 import org.junit.Test;
26
27 import com.hack23.sonar.cloudformation.reports.cfnnag.CfnNagScanReport;
28 import com.hack23.sonar.cloudformation.reports.checkov.CheckovReport;
29 import com.openpojo.random.RandomFactory;
30 import com.openpojo.reflection.PojoClass;
31 import com.openpojo.reflection.PojoClassFilter;
32 import com.openpojo.reflection.PojoField;
33 import com.openpojo.reflection.filters.FilterPackageInfo;
34 import com.openpojo.reflection.impl.PojoClassFactory;
35 import com.openpojo.validation.Validator;
36 import com.openpojo.validation.ValidatorBuilder;
37 import com.openpojo.validation.affirm.Affirm;
38 import com.openpojo.validation.rule.impl.EqualsAndHashCodeMatchRule;
39 import com.openpojo.validation.rule.impl.GetterMustExistRule;
40 import com.openpojo.validation.rule.impl.SetterMustExistRule;
41 import com.openpojo.validation.test.Tester;
42 import com.openpojo.validation.test.impl.GetterTester;
43 import com.openpojo.validation.test.impl.SetterTester;
44
45
46
47
48 public final class ModelSanityTest extends Assert {
49
50
51 private static final FilterPackageInfo FilterPackageInfo = new FilterPackageInfo();
52
53
54 private static final String EXPECT_CLASSES_IN_PACKAGE = "Expect classes in package";
55
56
57
58
59
60 @Test
61 public void checkCfnNagReportPackageTest() {
62 assertTrue(EXPECT_CLASSES_IN_PACKAGE,
63 checkAllClassesInPackage(CfnNagScanReport.class.getPackage().getName()));
64
65 }
66
67
68
69
70 @Test
71 public void checkCheckovReportPackageTest() {
72 assertTrue(EXPECT_CLASSES_IN_PACKAGE,
73 checkAllClassesInPackage(CheckovReport.class.getPackage().getName()));
74
75 }
76
77
78
79
80
81
82
83 protected boolean checkAllClassesInPackage(final String string) {
84 final List<PojoClass> pojoClassesRecursively = PojoClassFactory.getPojoClassesRecursively(string,
85 new FilterTestClasses());
86
87 final Validator validator = ValidatorBuilder.create().with(new SetterMustExistRule(), new GetterMustExistRule())
88 .with(new SetterTester(), new GetterTester()).with(new InvokeToStringTester())
89 .with(new InvokeHashcodeTester()).with(new DummyEqualsTester()).with(new EqualsAndHashCodeMatchRule()).build();
90 validator.validate(pojoClassesRecursively);
91
92
93 return true;
94 }
95
96
97
98
99 private static class FilterTestClasses implements PojoClassFilter {
100
101
102
103
104
105
106
107 @Override
108 public boolean include(final PojoClass pojoClass) {
109 return (!pojoClass.getSourcePath().contains("/test-classes/") && !pojoClass.getClazz().getName().contains("_") && !pojoClass.isEnum() && !pojoClass.isAbstract())
110 && FilterPackageInfo.include(pojoClass);
111 }
112 }
113
114
115
116
117 private static class InvokeToStringTester implements Tester {
118
119
120
121
122
123
124 @Override
125 public void run(final PojoClass pojoClass) {
126 final Object instance = RandomFactory.getRandomValue(pojoClass.getClazz());
127 Affirm.affirmNotNull("toStringFailure", instance.toString());
128 }
129 }
130
131
132
133
134 private static class InvokeHashcodeTester implements Tester {
135
136
137
138
139
140
141 @Override
142 public void run(final PojoClass pojoClass) {
143 final Object instance = RandomFactory.getRandomValue(pojoClass.getClazz());
144 Affirm.affirmFalse("hashCodeFailure", 0 == instance.hashCode());
145 }
146 }
147
148
149
150
151 private static class DummyEqualsTester implements Tester {
152
153
154
155
156
157
158 @Override
159 public void run(final PojoClass pojoClass) {
160 final Object instance = randomValues(pojoClass);
161
162 Affirm.affirmFalse("EqualsCompareNullFailure", instance.equals(null));
163 Affirm.affirmFalse("EqualsCompareWrongClassFailure", "WrongClass".equals(instance));
164 Affirm.affirmTrue("EqualsCompareSelfFailure", instance.equals(instance));
165
166 final Object instance2 = randomValues(pojoClass);
167
168 instance.equals(instance2);
169 }
170
171
172
173
174
175
176
177 private Object randomValues(final PojoClass pojoClass) {
178 final Object instance = RandomFactory.getRandomValue(pojoClass.getClazz());
179 randomValues(instance, pojoClass);
180
181 return instance;
182 }
183
184
185
186
187
188
189
190 private static void randomValues(final Object instance, final PojoClass pojoClass) {
191 if (pojoClass == null) {
192 return;
193 }
194
195 for (final PojoField fieldEntry : pojoClass.getPojoFields()) {
196 if (fieldEntry.hasSetter()) {
197 final Object value;
198
199 value = RandomFactory.getRandomValue(fieldEntry);
200 fieldEntry.invokeSetter(instance, value);
201 }
202 }
203 randomValues(instance, pojoClass.getSuperClass());
204 }
205 }
206
207 }