1 /* 2 * Copyright (C) 2010 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package doclava; 18 19 import com.google.doclava.Errors; 20 import com.google.doclava.Errors.Error; 21 import com.google.doclava.Errors.ErrorMessage; 22 import com.google.doclava.apicheck.ApiCheck; 23 import com.google.doclava.apicheck.ApiCheck.Report; 24 25 import junit.framework.TestCase; 26 27 import java.util.Iterator; 28 29 public class ApiCheckTest extends TestCase { 30 /** 31 * Clear all errors and make sure all future errors will be recorded. 32 */ setUp()33 public void setUp() { 34 Errors.clearErrors(); 35 for (Errors.Error error : Errors.sErrors) { 36 Errors.setErrorLevel(error.code, Errors.ERROR); 37 } 38 } 39 testEquivalentApi()40 public void testEquivalentApi() { 41 String[] args = { "test/api/medium.xml", "test/api/medium.xml" }; 42 ApiCheck apiCheck = new ApiCheck(); 43 Report report = apiCheck.checkApi(args); 44 assertEquals(report.errors().size(), 0); 45 } 46 testMethodReturnTypeChanged()47 public void testMethodReturnTypeChanged() { 48 String[] args = { "test/api/return-type-changed-1.xml", "test/api/return-type-changed-2.xml" }; 49 ApiCheck apiCheck = new ApiCheck(); 50 Report report = apiCheck.checkApi(args); 51 assertEquals(1, report.errors().size()); 52 assertEquals(Errors.CHANGED_TYPE, report.errors().iterator().next().error()); 53 } 54 testMethodParameterChanged()55 public void testMethodParameterChanged() { 56 String[] args = { "test/api/parameter-changed-1.xml", "test/api/parameter-changed-2.xml" }; 57 ApiCheck apiCheck = new ApiCheck(); 58 Report report = apiCheck.checkApi(args); 59 assertEquals(2, report.errors().size()); 60 61 Iterator<ErrorMessage> errors = report.errors().iterator(); 62 ErrorMessage m1 = errors.next(); 63 ErrorMessage m2 = errors.next(); 64 assertNotSame(m1.error(), m2.error()); 65 assertTrue(m1.error().equals(Errors.ADDED_METHOD) || m1.error().equals(Errors.REMOVED_METHOD)); 66 assertTrue(m2.error().equals(Errors.ADDED_METHOD) || m2.error().equals(Errors.REMOVED_METHOD)); 67 } 68 testConstructorParameterChanged()69 public void testConstructorParameterChanged() { 70 String[] args = { "test/api/parameter-changed-1.xml", "test/api/parameter-changed-3.xml" }; 71 ApiCheck apiCheck = new ApiCheck(); 72 Report report = apiCheck.checkApi(args); 73 assertEquals(2, report.errors().size()); 74 Iterator<ErrorMessage> errors = report.errors().iterator(); 75 ErrorMessage m1 = errors.next(); 76 ErrorMessage m2 = errors.next(); 77 assertNotSame(m1.error(), m2.error()); 78 assertTrue(m1.error().equals(Errors.ADDED_METHOD) || m1.error().equals(Errors.REMOVED_METHOD)); 79 assertTrue(m2.error().equals(Errors.ADDED_METHOD) || m2.error().equals(Errors.REMOVED_METHOD)); 80 } 81 testAddedClass()82 public void testAddedClass() { 83 String[] args = { "test/api/simple.xml", "test/api/added-class.xml" }; 84 ApiCheck apiCheck = new ApiCheck(); 85 Report report = apiCheck.checkApi(args); 86 assertEquals(1, report.errors().size()); 87 assertEquals(Errors.ADDED_CLASS, report.errors().iterator().next().error()); 88 } 89 testRemovedClass()90 public void testRemovedClass() { 91 String[] args = { "test/api/added-class.xml", "test/api/simple.xml" }; 92 ApiCheck apiCheck = new ApiCheck(); 93 Report report = apiCheck.checkApi(args); 94 assertEquals(1, report.errors().size()); 95 assertEquals(Errors.REMOVED_CLASS, report.errors().iterator().next().error()); 96 } 97 testRemovedDeprecatedClass()98 public void testRemovedDeprecatedClass() { 99 String[] args = { "test/api/added-deprecated-class.xml", "test/api/simple.xml" }; 100 ApiCheck apiCheck = new ApiCheck(); 101 Report report = apiCheck.checkApi(args); 102 assertEquals(1, report.errors().size()); 103 assertEquals(Errors.REMOVED_DEPRECATED_CLASS, report.errors().iterator().next().error()); 104 } 105 testChangedSuper()106 public void testChangedSuper() { 107 String[] args = { "test/api/simple.xml", "test/api/changed-super.xml" }; 108 ApiCheck apiCheck = new ApiCheck(); 109 Report report = apiCheck.checkApi(args); 110 assertEquals(1, report.errors().size()); 111 assertEquals(Errors.CHANGED_SUPERCLASS, report.errors().iterator().next().error()); 112 } 113 testChangedAssignableReturn()114 public void testChangedAssignableReturn() { 115 String[] args = { "test/api/changed-assignable-return-1.xml", "test/api/changed-assignable-return-2.xml" }; 116 ApiCheck apiCheck = new ApiCheck(); 117 Report report = apiCheck.checkApi(args); 118 assertEquals(0, report.errors().size()); 119 } 120 testInsertedSuper()121 public void testInsertedSuper() { 122 String[] args = { "test/api/inserted-super-1.xml", "test/api/inserted-super-2.xml" }; 123 ApiCheck apiCheck = new ApiCheck(); 124 Report report = apiCheck.checkApi(args); 125 assertEquals(0, report.errors().size()); 126 } 127 testAddedInterface()128 public void testAddedInterface() { 129 String[] args = { "test/api/removed-interface.xml", "test/api/medium.xml" }; 130 ApiCheck apiCheck = new ApiCheck(); 131 Report report = apiCheck.checkApi(args); 132 assertEquals(1, report.errors().size()); 133 assertEquals(Errors.ADDED_INTERFACE, report.errors().iterator().next().error()); 134 } 135 testRemovedInterface()136 public void testRemovedInterface() { 137 String[] args = { "test/api/medium.xml", "test/api/removed-interface.xml" }; 138 ApiCheck apiCheck = new ApiCheck(); 139 Report report = apiCheck.checkApi(args); 140 assertEquals(1, report.errors().size()); 141 assertEquals(Errors.REMOVED_INTERFACE, report.errors().iterator().next().error()); 142 } 143 testChangedAbstractClass()144 public void testChangedAbstractClass() { 145 String[] args = { "test/api/medium.xml", "test/api/changed-abstract.xml" }; 146 ApiCheck apiCheck = new ApiCheck(); 147 Report report = apiCheck.checkApi(args); 148 assertEquals(1, report.errors().size()); 149 assertEquals(Errors.CHANGED_ABSTRACT, report.errors().iterator().next().error()); 150 } 151 testChangedAbstractClass2()152 public void testChangedAbstractClass2() { 153 String[] args = { "test/api/changed-abstract.xml", "test/api/medium.xml" }; 154 ApiCheck apiCheck = new ApiCheck(); 155 Report report = apiCheck.checkApi(args); 156 assertEquals(1, report.errors().size()); 157 assertEquals(Errors.CHANGED_ABSTRACT, report.errors().iterator().next().error()); 158 } 159 testChangedAbstractMethod()160 public void testChangedAbstractMethod() { 161 String[] args = { "test/api/medium.xml", "test/api/changed-abstract2.xml" }; 162 ApiCheck apiCheck = new ApiCheck(); 163 Report report = apiCheck.checkApi(args); 164 assertEquals(1, report.errors().size()); 165 assertEquals(Errors.CHANGED_ABSTRACT, report.errors().iterator().next().error()); 166 } 167 testChangedAbstractMethod2()168 public void testChangedAbstractMethod2() { 169 String[] args = { "test/api/changed-abstract2.xml", "test/api/medium.xml" }; 170 ApiCheck apiCheck = new ApiCheck(); 171 Report report = apiCheck.checkApi(args); 172 assertEquals(1, report.errors().size()); 173 assertEquals(Errors.CHANGED_ABSTRACT, report.errors().iterator().next().error()); 174 } 175 testAddedPackage()176 public void testAddedPackage() { 177 String[] args = { "test/api/medium.xml", "test/api/added-package.xml" }; 178 ApiCheck apiCheck = new ApiCheck(); 179 Report report = apiCheck.checkApi(args); 180 assertEquals(1, report.errors().size()); 181 assertEquals(Errors.ADDED_PACKAGE, report.errors().iterator().next().error()); 182 } 183 testRemovedPackage()184 public void testRemovedPackage() { 185 String[] args = { "test/api/added-package.xml", "test/api/medium.xml" }; 186 ApiCheck apiCheck = new ApiCheck(); 187 Report report = apiCheck.checkApi(args); 188 assertEquals(1, report.errors().size()); 189 assertEquals(Errors.REMOVED_PACKAGE, report.errors().iterator().next().error()); 190 } 191 testChangedValue()192 public void testChangedValue() { 193 String[] args = { "test/api/constants.xml", "test/api/changed-value.xml" }; 194 ApiCheck apiCheck = new ApiCheck(); 195 Report report = apiCheck.checkApi(args); 196 assertEquals(1, report.errors().size()); 197 assertEquals(Errors.CHANGED_VALUE, report.errors().iterator().next().error()); 198 } 199 testChangedValue2()200 public void testChangedValue2() { 201 String[] args = { "test/api/constants.xml", "test/api/changed-value2.xml" }; 202 ApiCheck apiCheck = new ApiCheck(); 203 Report report = apiCheck.checkApi(args); 204 assertEquals(1, report.errors().size()); 205 assertEquals(Errors.CHANGED_VALUE, report.errors().iterator().next().error()); 206 } 207 testChangedType()208 public void testChangedType() { 209 String[] args = { "test/api/constants.xml", "test/api/changed-type.xml" }; 210 ApiCheck apiCheck = new ApiCheck(); 211 Report report = apiCheck.checkApi(args); 212 assertEquals(1, report.errors().size()); 213 assertEquals(Errors.CHANGED_TYPE, report.errors().iterator().next().error()); 214 } 215 testChangedFinalField()216 public void testChangedFinalField() { 217 String[] args = { "test/api/constants.xml", "test/api/changed-final.xml" }; 218 ApiCheck apiCheck = new ApiCheck(); 219 Report report = apiCheck.checkApi(args); 220 assertEquals(1, report.errors().size()); 221 assertEquals(Errors.ADDED_FINAL, report.errors().iterator().next().error()); 222 } 223 testChangedFinalMethod()224 public void testChangedFinalMethod() { 225 String[] args = { "test/api/constants.xml", "test/api/changed-final2.xml" }; 226 ApiCheck apiCheck = new ApiCheck(); 227 Report report = apiCheck.checkApi(args); 228 assertEquals(1, report.errors().size()); 229 assertEquals(Errors.ADDED_FINAL, report.errors().iterator().next().error()); 230 } 231 testChangedFinalClass()232 public void testChangedFinalClass() { 233 String[] args = { "test/api/constants.xml", "test/api/changed-final3.xml" }; 234 ApiCheck apiCheck = new ApiCheck(); 235 Report report = apiCheck.checkApi(args); 236 assertEquals(1, report.errors().size()); 237 assertEquals(Errors.ADDED_FINAL, report.errors().iterator().next().error()); 238 } 239 testChangedFinalClass2()240 public void testChangedFinalClass2() { 241 String[] args = { "test/api/changed-final3.xml", "test/api/constants.xml" }; 242 ApiCheck apiCheck = new ApiCheck(); 243 Report report = apiCheck.checkApi(args); 244 assertEquals(1, report.errors().size()); 245 assertEquals(Errors.REMOVED_FINAL, report.errors().iterator().next().error()); 246 } 247 testAddedField()248 public void testAddedField() { 249 String[] args = { "test/api/constants.xml", "test/api/added-field.xml" }; 250 ApiCheck apiCheck = new ApiCheck(); 251 Report report = apiCheck.checkApi(args); 252 assertEquals(1, report.errors().size()); 253 assertEquals(Errors.ADDED_FIELD, report.errors().iterator().next().error()); 254 } 255 testRemovedField()256 public void testRemovedField() { 257 String[] args = { "test/api/added-field.xml", "test/api/constants.xml" }; 258 ApiCheck apiCheck = new ApiCheck(); 259 Report report = apiCheck.checkApi(args); 260 assertEquals(1, report.errors().size()); 261 assertEquals(Errors.REMOVED_FIELD, report.errors().iterator().next().error()); 262 } 263 testRemovedDeprecatedField()264 public void testRemovedDeprecatedField() { 265 String[] args = { "test/api/added-deprecated-field.xml", "test/api/constants.xml" }; 266 ApiCheck apiCheck = new ApiCheck(); 267 Report report = apiCheck.checkApi(args); 268 assertEquals(1, report.errors().size()); 269 assertEquals(Errors.REMOVED_DEPRECATED_FIELD, report.errors().iterator().next().error()); 270 } 271 testAddedMethod()272 public void testAddedMethod() { 273 String[] args = { "test/api/constants.xml", "test/api/added-method.xml" }; 274 ApiCheck apiCheck = new ApiCheck(); 275 Report report = apiCheck.checkApi(args); 276 assertEquals(1, report.errors().size()); 277 assertEquals(Errors.ADDED_METHOD, report.errors().iterator().next().error()); 278 } 279 testRemovedMethod()280 public void testRemovedMethod() { 281 String[] args = { "test/api/added-method.xml", "test/api/constants.xml" }; 282 ApiCheck apiCheck = new ApiCheck(); 283 Report report = apiCheck.checkApi(args); 284 assertEquals(1, report.errors().size()); 285 assertEquals(Errors.REMOVED_METHOD, report.errors().iterator().next().error()); 286 } 287 testRemovedDeprecatedMethod()288 public void testRemovedDeprecatedMethod() { 289 String[] args = { "test/api/added-deprecated-method.xml", "test/api/constants.xml" }; 290 ApiCheck apiCheck = new ApiCheck(); 291 Report report = apiCheck.checkApi(args); 292 assertEquals(1, report.errors().size()); 293 assertEquals(Errors.REMOVED_DEPRECATED_METHOD, report.errors().iterator().next().error()); 294 } 295 testChangedStaticMethod()296 public void testChangedStaticMethod() { 297 String[] args = { "test/api/constants.xml", "test/api/changed-static.xml" }; 298 ApiCheck apiCheck = new ApiCheck(); 299 Report report = apiCheck.checkApi(args); 300 assertEquals(1, report.errors().size()); 301 assertEquals(Errors.CHANGED_STATIC, report.errors().iterator().next().error()); 302 } 303 testChangedStaticClass()304 public void testChangedStaticClass() { 305 String[] args = { "test/api/constants.xml", "test/api/changed-static2.xml" }; 306 ApiCheck apiCheck = new ApiCheck(); 307 Report report = apiCheck.checkApi(args); 308 assertEquals(1, report.errors().size()); 309 assertEquals(Errors.CHANGED_STATIC, report.errors().iterator().next().error()); 310 } 311 testChangedStaticField()312 public void testChangedStaticField() { 313 String[] args = { "test/api/constants.xml", "test/api/changed-static3.xml" }; 314 ApiCheck apiCheck = new ApiCheck(); 315 Report report = apiCheck.checkApi(args); 316 assertEquals(1, report.errors().size()); 317 assertEquals(Errors.CHANGED_STATIC, report.errors().iterator().next().error()); 318 } 319 testChangedTransient()320 public void testChangedTransient() { 321 String[] args = { "test/api/constants.xml", "test/api/changed-transient.xml" }; 322 ApiCheck apiCheck = new ApiCheck(); 323 Report report = apiCheck.checkApi(args); 324 assertEquals(1, report.errors().size()); 325 assertEquals(Errors.CHANGED_TRANSIENT, report.errors().iterator().next().error()); 326 } 327 testChangedSynchronized()328 public void testChangedSynchronized() { 329 String[] args = { "test/api/constants.xml", "test/api/changed-synchronized.xml" }; 330 ApiCheck apiCheck = new ApiCheck(); 331 Report report = apiCheck.checkApi(args); 332 assertEquals(0, report.errors().size()); 333 } 334 testChangedVolatile()335 public void testChangedVolatile() { 336 String[] args = { "test/api/constants.xml", "test/api/changed-volatile.xml" }; 337 ApiCheck apiCheck = new ApiCheck(); 338 Report report = apiCheck.checkApi(args); 339 assertEquals(1, report.errors().size()); 340 assertEquals(Errors.CHANGED_VOLATILE, report.errors().iterator().next().error()); 341 } 342 testChangedNative()343 public void testChangedNative() { 344 String[] args = { "test/api/constants.xml", "test/api/changed-native.xml" }; 345 ApiCheck apiCheck = new ApiCheck(); 346 Report report = apiCheck.checkApi(args); 347 assertEquals(1, report.errors().size()); 348 assertEquals(Errors.CHANGED_NATIVE, report.errors().iterator().next().error()); 349 } 350 testChangedScopeMethod()351 public void testChangedScopeMethod() { 352 String[] args = { "test/api/constants.xml", "test/api/changed-scope.xml" }; 353 ApiCheck apiCheck = new ApiCheck(); 354 Report report = apiCheck.checkApi(args); 355 assertEquals(1, report.errors().size()); 356 assertEquals(Errors.CHANGED_SCOPE, report.errors().iterator().next().error()); 357 } 358 testChangedScopeClass()359 public void testChangedScopeClass() { 360 String[] args = { "test/api/changed-scope.xml", "test/api/constants.xml" }; 361 ApiCheck apiCheck = new ApiCheck(); 362 Report report = apiCheck.checkApi(args); 363 assertEquals(1, report.errors().size()); 364 assertEquals(Errors.CHANGED_SCOPE, report.errors().iterator().next().error()); 365 } 366 testChangedScopeClass2()367 public void testChangedScopeClass2() { 368 String[] args = { "test/api/constants.xml", "test/api/changed-scope2.xml" }; 369 ApiCheck apiCheck = new ApiCheck(); 370 Report report = apiCheck.checkApi(args); 371 assertEquals(1, report.errors().size()); 372 assertEquals(Errors.CHANGED_SCOPE, report.errors().iterator().next().error()); 373 } 374 testChangedScopeField()375 public void testChangedScopeField() { 376 String[] args = { "test/api/constants.xml", "test/api/changed-scope3.xml" }; 377 ApiCheck apiCheck = new ApiCheck(); 378 Report report = apiCheck.checkApi(args); 379 assertEquals(1, report.errors().size()); 380 assertEquals(Errors.CHANGED_SCOPE, report.errors().iterator().next().error()); 381 } 382 testChangedConstructorScope()383 public void testChangedConstructorScope() { 384 String[] args = { "test/api/constants.xml", "test/api/changed-scope4.xml" }; 385 ApiCheck apiCheck = new ApiCheck(); 386 Report report = apiCheck.checkApi(args); 387 assertEquals(1, report.errors().size()); 388 assertEquals(Errors.CHANGED_SCOPE, report.errors().iterator().next().error()); 389 } 390 testChangedMethodThrows()391 public void testChangedMethodThrows() { 392 String[] args = { "test/api/throws.xml", "test/api/removed-exception.xml" }; 393 ApiCheck apiCheck = new ApiCheck(); 394 Report report = apiCheck.checkApi(args); 395 assertEquals(1, report.errors().size()); 396 assertEquals(Errors.CHANGED_THROWS, report.errors().iterator().next().error()); 397 } 398 testChangedMethodThrows2()399 public void testChangedMethodThrows2() { 400 String[] args = { "test/api/removed-exception.xml", "test/api/throws.xml" }; 401 ApiCheck apiCheck = new ApiCheck(); 402 Report report = apiCheck.checkApi(args); 403 assertEquals(1, report.errors().size()); 404 assertEquals(Errors.CHANGED_THROWS, report.errors().iterator().next().error()); 405 } 406 testChangedConstructorThrows()407 public void testChangedConstructorThrows() { 408 String[] args = { "test/api/throws.xml", "test/api/added-exception.xml" }; 409 ApiCheck apiCheck = new ApiCheck(); 410 Report report = apiCheck.checkApi(args); 411 assertEquals(1, report.errors().size()); 412 assertEquals(Errors.CHANGED_THROWS, report.errors().iterator().next().error()); 413 } 414 testChangedConstructorThrows2()415 public void testChangedConstructorThrows2() { 416 String[] args = { "test/api/added-exception.xml", "test/api/throws.xml" }; 417 ApiCheck apiCheck = new ApiCheck(); 418 Report report = apiCheck.checkApi(args); 419 assertEquals(1, report.errors().size()); 420 assertEquals(Errors.CHANGED_THROWS, report.errors().iterator().next().error()); 421 } 422 testChangedMethodDeprecated()423 public void testChangedMethodDeprecated() { 424 String[] args = { "test/api/constants.xml", "test/api/changed-deprecated.xml" }; 425 ApiCheck apiCheck = new ApiCheck(); 426 Report report = apiCheck.checkApi(args); 427 assertEquals(1, report.errors().size()); 428 assertEquals(Errors.CHANGED_DEPRECATED, report.errors().iterator().next().error()); 429 } 430 testChangedConstructorDeprecated()431 public void testChangedConstructorDeprecated() { 432 String[] args = { "test/api/constants.xml", "test/api/changed-deprecated2.xml" }; 433 ApiCheck apiCheck = new ApiCheck(); 434 Report report = apiCheck.checkApi(args); 435 assertEquals(1, report.errors().size()); 436 assertEquals(Errors.CHANGED_DEPRECATED, report.errors().iterator().next().error()); 437 } 438 testChangedFieldDeprecated()439 public void testChangedFieldDeprecated() { 440 String[] args = { "test/api/constants.xml", "test/api/changed-deprecated3.xml" }; 441 ApiCheck apiCheck = new ApiCheck(); 442 Report report = apiCheck.checkApi(args); 443 assertEquals(1, report.errors().size()); 444 assertEquals(Errors.CHANGED_DEPRECATED, report.errors().iterator().next().error()); 445 } 446 testChangedClassToInterface()447 public void testChangedClassToInterface() { 448 String[] args = { "test/api/changed-class-info2.xml", "test/api/changed-class-info.xml" }; 449 ApiCheck apiCheck = new ApiCheck(); 450 Report report = apiCheck.checkApi(args); 451 assertEquals(1, report.errors().size()); 452 assertEquals(Errors.CHANGED_CLASS, report.errors().iterator().next().error()); 453 } 454 testChangedInterfaceToClass()455 public void testChangedInterfaceToClass() { 456 String[] args = { "test/api/changed-class-info.xml", "test/api/changed-class-info2.xml" }; 457 ApiCheck apiCheck = new ApiCheck(); 458 Report report = apiCheck.checkApi(args); 459 assertEquals(1, report.errors().size()); 460 assertEquals(Errors.CHANGED_CLASS, report.errors().iterator().next().error()); 461 } 462 } 463