1/*
2 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 6250772
27 * @summary Test that *List objects are checked after asList is called.
28 * @author Eamonn McManus
29 *
30 * @run clean ListTypeCheckTest
31 * @run build ListTypeCheckTest
32 * @run main ListTypeCheckTest
33 */
34
35import java.lang.reflect.*;
36import java.util.*;
37import javax.management.*;
38import javax.management.relation.*;
39
40/* For compatibility reasons, the classes AttributeList, RoleList,
41 * and RoleUnresolvedList all extend ArrayList<Object> even though
42 * logically they should extend ArrayList<Attribute> etc.  They are
43 * all specified to have a method asList() with return type
44 * List<Attribute> etc, and to refuse to add any object other than
45 * an Attribute etc once this method has been called, but not before.
46 */
47public class ListTypeCheckTest {
48    public static void main(String[] args) throws Exception {
49        Class[] classes = {
50            AttributeList.class, RoleList.class, RoleUnresolvedList.class,
51        };
52        for (Class c : classes)
53            test((Class<? extends ArrayList>) c);
54    }
55
56    private static void test(Class<? extends ArrayList> c) throws Exception {
57        System.out.println("Testing " + c.getName());
58        ArrayList al = c.newInstance();
59        test(al);
60    }
61
62    private static void test(ArrayList al) throws Exception {
63        test(al, true);
64        al.clear();
65        Method m = al.getClass().getMethod("asList");
66        m.invoke(al);
67        test(al, false);
68    }
69
70    private static void test(ArrayList al, boolean allowsBogus) throws Exception {
71        for (int i = 0; i < 5; i++) {
72            try {
73                switch (i) {
74                    case 0:
75                        al.add("yo");
76                        break;
77                    case 1:
78                        al.add(0, "yo");
79                        break;
80                    case 2:
81                        al.addAll(Arrays.asList("foo", "bar"));
82                        break;
83                    case 3:
84                        al.addAll(0, Arrays.asList("foo", "bar"));
85                        break;
86                    case 4:
87                        al.set(0, "foo");
88                        break;
89                    default:
90                        throw new Exception("test wrong");
91                }
92                if (!allowsBogus)
93                    throw new Exception("op allowed but should fail");
94            } catch (IllegalArgumentException e) {
95                if (allowsBogus)
96                    throw new Exception("got exception but should not", e);
97            }
98        }
99    }
100}
101