undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
|
|
@ -0,0 +1,312 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 7154390 8005712 8007278 8004912
|
||||
* @summary Unit test for repeated annotation reflection
|
||||
*
|
||||
* @compile RepeatedUnitTest.java subpackage/package-info.java subpackage/Container.java subpackage/Containee.java subpackage/NonRepeated.java subpackage/InheritedContainee.java subpackage/InheritedContainer.java subpackage/InheritedNonRepeated.java
|
||||
* @run main RepeatedUnitTest
|
||||
*/
|
||||
|
||||
import subpackage.*;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
public class RepeatedUnitTest {
|
||||
public static void main(String[] args) throws Exception {
|
||||
// PACKAGE ANNOTATIONS
|
||||
Class c = Class.forName("subpackage.NonRepeated"); // force package "subpackage" load
|
||||
Package p = Package.getPackage("subpackage");
|
||||
packageNonRepeated(p);
|
||||
packageRepeated(p);
|
||||
packageContainer(p);
|
||||
|
||||
// INHERITED/NON-INHERITED ON CLASS
|
||||
inheritedMe1();
|
||||
inheritedMe2();
|
||||
inheritedMe3();
|
||||
inheritedMe4();
|
||||
|
||||
inheritedMe5(); // ContainerOnSuperSingleOnSub
|
||||
inheritedMe6(); // RepeatableOnSuperSingleOnSub
|
||||
inheritedMe7(); // SingleAnnoOnSuperContainerOnSub
|
||||
inheritedMe8(); // SingleOnSuperRepeatableOnSub
|
||||
|
||||
|
||||
// CONSTRUCTOR
|
||||
checkMultiplier(Me1.class.getConstructor(new Class[0]), 10);
|
||||
|
||||
// FIELD
|
||||
checkMultiplier(Me1.class.getField("foo"), 1);
|
||||
|
||||
// METHOD
|
||||
checkMultiplier(Me1.class.getDeclaredMethod("mee", (Class<?>[])null), 100);
|
||||
|
||||
// INNER CLASS
|
||||
checkMultiplier(Me1.MiniMee.class, 1000);
|
||||
|
||||
// ENUM ELEMENT
|
||||
checkMultiplier(Me1.E.class.getField("EE"), 10000);
|
||||
|
||||
// ENUM
|
||||
checkMultiplier(Me1.E.class, 100000);
|
||||
}
|
||||
|
||||
static void packageNonRepeated(AnnotatedElement e) {
|
||||
NonRepeated nr = e.getAnnotation(NonRepeated.class);
|
||||
check(nr.value() == 10);
|
||||
|
||||
check(1 == countAnnotation(e, NonRepeated.class));
|
||||
|
||||
nr = e.getAnnotationsByType(NonRepeated.class)[0];
|
||||
check(nr.value() == 10);
|
||||
|
||||
check(1 == containsAnnotationOfType(e.getAnnotations(), NonRepeated.class));
|
||||
}
|
||||
|
||||
static void packageRepeated(AnnotatedElement e) {
|
||||
Containee c = e.getAnnotation(Containee.class);
|
||||
check(c == null);
|
||||
check(2 == countAnnotation(e, Containee.class));
|
||||
|
||||
c = e.getAnnotationsByType(Containee.class)[0];
|
||||
check(c.value() == 1);
|
||||
c = e.getAnnotationsByType(Containee.class)[1];
|
||||
check(c.value() == 2);
|
||||
|
||||
check(0 == containsAnnotationOfType(e.getAnnotations(), Containee.class));
|
||||
}
|
||||
|
||||
static void packageContainer(AnnotatedElement e) {
|
||||
Container cr = e.getAnnotation(Container.class);
|
||||
check(null != cr);
|
||||
check(1 == containsAnnotationOfType(e.getAnnotationsByType(Container.class), Container.class));
|
||||
check(1 == countAnnotation(e, Container.class));
|
||||
}
|
||||
|
||||
static void inheritedMe1() {
|
||||
AnnotatedElement e = Me1.class;
|
||||
check(null == e.getAnnotation(NonRepeated.class));
|
||||
check(e.getAnnotation(InheritedNonRepeated.class).value() == 20);
|
||||
check(0 == countAnnotation(e, Containee.class));
|
||||
check(4 == countAnnotation(e, InheritedContainee.class));
|
||||
check(0 == countAnnotation(e, Container.class));
|
||||
check(1 == countAnnotation(e, InheritedContainer.class));
|
||||
}
|
||||
|
||||
static void inheritedMe2() {
|
||||
AnnotatedElement e = Me2.class;
|
||||
check(e.getAnnotation(NonRepeated.class).value() == 100);
|
||||
check(e.getAnnotation(InheritedNonRepeated.class).value() == 200);
|
||||
check(4 == countAnnotation(e, Containee.class));
|
||||
check(4 == countAnnotation(e, InheritedContainee.class));
|
||||
check(1 == countAnnotation(e, Container.class));
|
||||
check(1 == countAnnotation(e, InheritedContainer.class));
|
||||
check(1 == countAnnotation(e, NonRepeated.class));
|
||||
check(1 == countAnnotation(e, InheritedNonRepeated.class));
|
||||
|
||||
check(e.getAnnotationsByType(Containee.class)[2].value() == 300);
|
||||
check(e.getAnnotationsByType(InheritedContainee.class)[2].value() == 300);
|
||||
check(e.getAnnotationsByType(InheritedNonRepeated.class)[0].value() == 200);
|
||||
check(e.getAnnotationsByType(NonRepeated.class)[0].value() == 100);
|
||||
}
|
||||
|
||||
static void inheritedMe3() {
|
||||
AnnotatedElement e = Me3.class;
|
||||
check(null == e.getAnnotation(NonRepeated.class));
|
||||
|
||||
check(0 == countAnnotation(e, Containee.class));
|
||||
check(4 == countAnnotation(e, InheritedContainee.class));
|
||||
check(0 == countAnnotation(e, Container.class));
|
||||
check(1 == countAnnotation(e, InheritedContainer.class));
|
||||
|
||||
check(e.getAnnotationsByType(InheritedContainee.class)[2].value() == 350);
|
||||
check(e.getAnnotationsByType(InheritedNonRepeated.class)[0].value() == 15);
|
||||
}
|
||||
|
||||
static void inheritedMe4() {
|
||||
AnnotatedElement e = Me4.class;
|
||||
check(e.getAnnotation(NonRepeated.class).value() == 1000);
|
||||
check(e.getAnnotation(InheritedNonRepeated.class).value() == 2000);
|
||||
check(4 == countAnnotation(e, Containee.class));
|
||||
check(4 == countAnnotation(e, InheritedContainee.class));
|
||||
check(1 == countAnnotation(e, Container.class));
|
||||
check(1 == countAnnotation(e, InheritedContainer.class));
|
||||
check(1 == countAnnotation(e, NonRepeated.class));
|
||||
check(1 == countAnnotation(e, InheritedNonRepeated.class));
|
||||
|
||||
check(e.getAnnotationsByType(Containee.class)[2].value() == 3000);
|
||||
check(e.getAnnotationsByType(InheritedContainee.class)[2].value() == 3000);
|
||||
check(e.getAnnotationsByType(InheritedNonRepeated.class)[0].value() == 2000);
|
||||
check(e.getAnnotationsByType(NonRepeated.class)[0].value() == 1000);
|
||||
}
|
||||
|
||||
static void inheritedMe5() {
|
||||
AnnotatedElement e = Me5.class;
|
||||
check(2 == e.getAnnotations().length);
|
||||
check(1 == countAnnotation(e, InheritedContainee.class));
|
||||
}
|
||||
|
||||
static void inheritedMe6() {
|
||||
AnnotatedElement e = Me6.class;
|
||||
check(2 == e.getAnnotations().length);
|
||||
check(1 == countAnnotation(e, InheritedContainee.class));
|
||||
}
|
||||
|
||||
static void inheritedMe7() {
|
||||
AnnotatedElement e = Me7.class;
|
||||
check(2 == e.getAnnotations().length);
|
||||
check(2 == countAnnotation(e, InheritedContainee.class));
|
||||
}
|
||||
|
||||
static void inheritedMe8() {
|
||||
AnnotatedElement e = Me8.class;
|
||||
check(2 == e.getAnnotations().length);
|
||||
check(2 == countAnnotation(e, InheritedContainee.class));
|
||||
}
|
||||
|
||||
static void checkMultiplier(AnnotatedElement e, int m) {
|
||||
// Basic sanity of non-repeating getAnnotation(Class)
|
||||
check(e.getAnnotation(NonRepeated.class).value() == 5 * m);
|
||||
|
||||
// Check count of annotations returned from getAnnotationsByType(Class)
|
||||
check(4 == countAnnotation(e, Containee.class));
|
||||
check(1 == countAnnotation(e, Container.class));
|
||||
check(1 == countAnnotation(e, NonRepeated.class));
|
||||
|
||||
// Check contents of array returned from getAnnotationsByType(Class)
|
||||
check(e.getAnnotationsByType(Containee.class)[2].value() == 3 * m);
|
||||
check(e.getAnnotationsByType(NonRepeated.class)[0].value() == 5 * m);
|
||||
|
||||
// Check getAnnotation(Class)
|
||||
check(e.getAnnotation(Containee.class) == null);
|
||||
check(e.getAnnotation(Container.class) != null);
|
||||
|
||||
// Check count of annotations returned from getAnnotations()
|
||||
check(0 == containsAnnotationOfType(e.getAnnotations(), Containee.class));
|
||||
check(1 == containsAnnotationOfType(e.getAnnotations(), Container.class));
|
||||
check(1 == containsAnnotationOfType(e.getAnnotations(), NonRepeated.class));
|
||||
}
|
||||
|
||||
static void check(Boolean b) {
|
||||
if (!b) throw new RuntimeException();
|
||||
}
|
||||
|
||||
static int countAnnotation(AnnotatedElement e, Class<? extends Annotation> c) {
|
||||
return containsAnnotationOfType(e.getAnnotationsByType(c), c);
|
||||
}
|
||||
|
||||
static <A extends Annotation> int containsAnnotationOfType(A[] l, Class<? extends Annotation> a) {
|
||||
int count = 0;
|
||||
for (Annotation an : l) {
|
||||
if (an.annotationType().equals(a))
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
@NonRepeated @InheritedNonRepeated
|
||||
@InheritedContainee(1) @InheritedContainee(2) @InheritedContainee(3) @InheritedContainee(4)
|
||||
@Containee(1) @Containee(2) @Containee(3) @Containee(4)
|
||||
class Grandma {}
|
||||
|
||||
class Mother extends Grandma {}
|
||||
|
||||
@NonRepeated(5) @InheritedNonRepeated(15)
|
||||
@InheritedContainee(150) @InheritedContainee(250) @InheritedContainee(350) @InheritedContainee(450)
|
||||
@Containee(150) @Containee(250) @Containee(350) @Containee(450)
|
||||
class Father extends Grandma {}
|
||||
|
||||
class Me1 extends Mother {
|
||||
|
||||
@NonRepeated(5)
|
||||
@Containee(1) @Containee(2) @Containee(3) @Containee(4)
|
||||
public String foo = "";
|
||||
|
||||
@NonRepeated(50)
|
||||
@Containee(10) @Containee(20) @Containee(30) @Containee(40)
|
||||
public Me1() {
|
||||
}
|
||||
|
||||
@NonRepeated(500)
|
||||
@Containee(100) @Containee(200) @Containee(300) @Containee(400)
|
||||
public void mee() {
|
||||
}
|
||||
|
||||
@NonRepeated(5000)
|
||||
@Containee(1000) @Containee(2000) @Containee(3000) @Containee(4000)
|
||||
public class MiniMee {}
|
||||
|
||||
@NonRepeated(500000)
|
||||
@Containee(100000) @Containee(200000) @Containee(300000) @Containee(400000)
|
||||
public enum E {
|
||||
@NonRepeated(50000)
|
||||
@Containee(10000) @Containee(20000) @Containee(30000) @Containee(40000)
|
||||
EE(),
|
||||
}
|
||||
}
|
||||
|
||||
@NonRepeated(100) @InheritedNonRepeated(200)
|
||||
@InheritedContainee(100) @InheritedContainee(200) @InheritedContainee(300) @InheritedContainee(400)
|
||||
@Containee(100) @Containee(200) @Containee(300) @Containee(400)
|
||||
class Me2 extends Mother {}
|
||||
|
||||
class Me3 extends Father {}
|
||||
|
||||
@NonRepeated(1000) @InheritedNonRepeated(2000)
|
||||
@InheritedContainee(1000) @InheritedContainee(2000) @InheritedContainee(3000) @InheritedContainee(4000)
|
||||
@Containee(1000) @Containee(2000) @Containee(3000) @Containee(4000)
|
||||
class Me4 extends Father {}
|
||||
|
||||
|
||||
@InheritedContainer({@InheritedContainee(1), @InheritedContainee(2)})
|
||||
class SuperOf5 {}
|
||||
|
||||
@InheritedContainee(3)
|
||||
class Me5 extends SuperOf5{}
|
||||
|
||||
|
||||
@InheritedContainee(1) @InheritedContainee(2)
|
||||
class SuperOf6 {}
|
||||
|
||||
@InheritedContainee(3)
|
||||
class Me6 extends SuperOf6 {}
|
||||
|
||||
|
||||
@InheritedContainee(1)
|
||||
class SuperOf7 {}
|
||||
|
||||
@InheritedContainer({@InheritedContainee(2), @InheritedContainee(3)})
|
||||
class Me7 extends SuperOf7 {}
|
||||
|
||||
|
||||
@InheritedContainee(1)
|
||||
class SuperOf8 {}
|
||||
|
||||
@InheritedContainee(2) @InheritedContainee(3)
|
||||
class Me8 extends SuperOf8 {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue