1 /*
   2  * Copyright (c) 2014, 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  * @summary Test of method selection and resolution cases that
  27  * generate InvokeVirtualSuccessTest
  28  * @run main InvokeVirtualSuccessTest
  29  */
  30 
  31 import java.util.function.Consumer;
  32 import java.util.Collection;
  33 import java.util.Collections;
  34 import java.util.Arrays;
  35 import java.util.EnumSet;
  36 
  37 public class InvokeVirtualSuccessTest extends SelectionResolutionTest {
  38 
  39     private static final SelectionResolutionTestCase.Builder initBuilder =
  40         new SelectionResolutionTestCase.Builder();
  41 
  42     static {
  43         initBuilder.invoke = SelectionResolutionTestCase.InvokeInstruction.INVOKEVIRTUAL;
  44     }
  45 
  46     private static final Collection<TestGroup> testgroups =
  47         Arrays.asList(
  48                 /* invokevirtual tests */
  49                 /* Group 16: callsite = methodref = expected, no override */
  50                 new TestGroup.Simple(initBuilder,
  51                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
  52                                              EnumSet.of(MethodData.Access.PRIVATE),
  53                                              EnumSet.of(MethodData.Context.INSTANCE),
  54                                              EnumSet.of(ClassData.Package.SAME)),
  55                         Template.OverrideAbstractExpectedClass,
  56                         Template.MethodrefEqualsExpected,
  57                         Template.IgnoredAbstract,
  58                         Template.CallsiteEqualsMethodref,
  59                         Template.MethodrefSelectionResolvedIsClassNoOverride),
  60                 /* Group 17: callsite = methodref = expected, override allowed */
  61                 new TestGroup.Simple(initBuilder,
  62                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
  63                                              EnumSet.of(MethodData.Access.PROTECTED,
  64                                                         MethodData.Access.PUBLIC),
  65                                              EnumSet.of(MethodData.Context.INSTANCE,
  66                                                         MethodData.Context.ABSTRACT),
  67                                              EnumSet.of(ClassData.Package.SAME)),
  68                         Template.OverrideAbstractExpectedClass,
  69                         Template.MethodrefEqualsExpected,
  70                         Template.IgnoredAbstract,
  71                         Template.CallsiteEqualsMethodref,
  72                         Template.MethodrefSelectionResolvedIsClass,
  73                         Template.SelectionOverrideAbstract),
  74                 /* Group 18: callsite = methodref = resolved, possibly
  75                  * skip different package in selection.
  76                  */
  77                 new TestGroup.Simple(initBuilder,
  78                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
  79                                              EnumSet.of(MethodData.Access.PACKAGE),
  80                                              EnumSet.of(MethodData.Context.INSTANCE,
  81                                                         MethodData.Context.ABSTRACT),
  82                                              EnumSet.of(ClassData.Package.SAME)),
  83                         Template.OverrideAbstractExpectedClass,
  84                         Template.MethodrefEqualsExpected,
  85                         Template.IgnoredAbstract,
  86                         Template.CallsiteEqualsMethodref,
  87                         Template.MethodrefSelectionPackageSkip,
  88                         Template.SelectionOverrideAbstract),
  89                 /* Group 19: callsite = methodref, methodref != expected,
  90                  * expected is class, expected and callsite in the same package
  91                  */
  92                 new TestGroup.Simple(initBuilder,
  93                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
  94                                              EnumSet.of(MethodData.Access.PUBLIC,
  95                                                         MethodData.Access.PROTECTED),
  96                                              EnumSet.of(MethodData.Context.INSTANCE,
  97                                                         MethodData.Context.ABSTRACT),
  98                                              EnumSet.of(ClassData.Package.SAME)),
  99                         Template.OverrideAbstractExpectedClass,
 100                         Template.MethodrefNotEqualsExpectedClass,
 101                         Template.IgnoredAbstract,
 102                         Template.CallsiteEqualsMethodref,
 103                         Template.MethodrefSelectionResolvedIsClass,
 104                         Template.SelectionOverrideAbstract),
 105                 /* Group 20: callsite = methodref, methodref \!=
 106                  * expected, possibly skip different package in
 107                  * selection.
 108                  */
 109                 new TestGroup.Simple(initBuilder,
 110                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 111                                              EnumSet.of(MethodData.Access.PACKAGE),
 112                                              EnumSet.of(MethodData.Context.INSTANCE,
 113                                                         MethodData.Context.ABSTRACT),
 114                                              EnumSet.of(ClassData.Package.SAME)),
 115                         Template.OverrideAbstractExpectedClass,
 116                         Template.MethodrefNotEqualsExpectedClass,
 117                         Template.IgnoredAbstract,
 118                         Template.CallsiteEqualsMethodref,
 119                         Template.MethodrefSelectionPackageSkip,
 120                         Template.SelectionOverrideAbstract),
 121                 /* Group 21: callsite = methodref, methodref != expected,
 122                  * expected is interface, expected and callsite in the same package
 123                  */
 124                 new TestGroup.Simple(initBuilder,
 125                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 126                                              EnumSet.of(MethodData.Access.PUBLIC),
 127                                              EnumSet.of(MethodData.Context.INSTANCE,
 128                                                         MethodData.Context.ABSTRACT),
 129                                              EnumSet.of(ClassData.Package.SAME)),
 130                         Template.OverrideAbstractExpectedIface,
 131                         Template.MethodrefNotEqualsExpectedIface,
 132                         Template.IgnoredAbstract,
 133                         Template.CallsiteEqualsMethodref,
 134                         Template.MethodrefSelectionResolvedIsIface,
 135                         Template.SelectionOverrideAbstract),
 136                 /* Group 22: callsite :> methodref, methodref = expected,
 137                  * expected is class, expected and callsite in the same package
 138                  */
 139                 new TestGroup.Simple(initBuilder,
 140                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 141                                              EnumSet.of(MethodData.Access.PUBLIC,
 142                                                         MethodData.Access.PROTECTED),
 143                                              EnumSet.of(MethodData.Context.INSTANCE,
 144                                                         MethodData.Context.ABSTRACT),
 145                                              EnumSet.of(ClassData.Package.SAME)),
 146                         Template.OverrideAbstractExpectedClass,
 147                         Template.MethodrefEqualsExpected,
 148                         Template.IgnoredAbstract,
 149                         Template.CallsiteSubclassMethodref,
 150                         Template.MethodrefSelectionResolvedIsClass,
 151                         Template.SelectionOverrideAbstract),
 152                 /* Group 23: callsite :>, methodref = expected,
 153                  * possibly skip different package in selection
 154                  */
 155                 new TestGroup.Simple(initBuilder,
 156                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 157                                              EnumSet.of(MethodData.Access.PACKAGE),
 158                                              EnumSet.of(MethodData.Context.INSTANCE,
 159                                                         MethodData.Context.ABSTRACT),
 160                                              EnumSet.of(ClassData.Package.SAME)),
 161                         Template.OverrideAbstractExpectedClass,
 162                         Template.MethodrefEqualsExpected,
 163                         Template.IgnoredAbstract,
 164                         Template.CallsiteSubclassMethodref,
 165                         Template.MethodrefSelectionPackageSkip,
 166                         Template.SelectionOverrideAbstract),
 167                 /* Group 24: callsite :> methodref, methodref != expected,
 168                  * expected is class, expected and callsite in the same package
 169                  */
 170                 new TestGroup.Simple(initBuilder,
 171                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 172                                              EnumSet.of(MethodData.Access.PUBLIC,
 173                                                         MethodData.Access.PROTECTED),
 174                                              EnumSet.of(MethodData.Context.INSTANCE,
 175                                                         MethodData.Context.ABSTRACT),
 176                                              EnumSet.of(ClassData.Package.SAME)),
 177                         Template.OverrideAbstractExpectedClass,
 178                         Template.MethodrefNotEqualsExpectedClass,
 179                         Template.IgnoredAbstract,
 180                         Template.CallsiteSubclassMethodref,
 181                         Template.MethodrefSelectionResolvedIsClass,
 182                         Template.SelectionOverrideAbstract),
 183                 /* Group 25: callsite :>, methodref = expected,
 184                  * possibly skip different package in selection
 185                  */
 186                 new TestGroup.Simple(initBuilder,
 187                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 188                                              EnumSet.of(MethodData.Access.PACKAGE),
 189                                              EnumSet.of(MethodData.Context.INSTANCE,
 190                                                         MethodData.Context.ABSTRACT),
 191                                              EnumSet.of(ClassData.Package.SAME)),
 192                         Template.OverrideAbstractExpectedClass,
 193                         Template.MethodrefNotEqualsExpectedClass,
 194                         Template.IgnoredAbstract,
 195                         Template.CallsiteSubclassMethodref,
 196                         Template.MethodrefSelectionPackageSkip,
 197                         Template.SelectionOverrideAbstract),
 198                 /* Group 26: callsite :> methodref, methodref != expected,
 199                  * expected is interface, expected and callsite in the same package
 200                  */
 201                 new TestGroup.Simple(initBuilder,
 202                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 203                                              EnumSet.of(MethodData.Access.PUBLIC),
 204                                              EnumSet.of(MethodData.Context.INSTANCE,
 205                                                         MethodData.Context.ABSTRACT),
 206                                              EnumSet.of(ClassData.Package.SAME)),
 207                         Template.OverrideAbstractExpectedIface,
 208                         Template.MethodrefNotEqualsExpectedIface,
 209                         Template.IgnoredAbstract,
 210                         Template.CallsiteSubclassMethodref,
 211                         Template.MethodrefSelectionResolvedIsIface,
 212                         Template.SelectionOverrideAbstract),
 213                 /* Group 27: callsite unrelated to methodref, methodref = expected,
 214                  * expected is class, expected and callsite in the same package
 215                  */
 216                 new TestGroup.Simple(initBuilder,
 217                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 218                                              EnumSet.of(MethodData.Access.PUBLIC,
 219                                                         MethodData.Access.PROTECTED),
 220                                              EnumSet.of(MethodData.Context.INSTANCE,
 221                                                         MethodData.Context.ABSTRACT),
 222                                              EnumSet.of(ClassData.Package.SAME)),
 223                         Template.OverrideAbstractExpectedClass,
 224                         Template.MethodrefEqualsExpected,
 225                         Template.IgnoredAbstract,
 226                         Template.CallsiteUnrelatedToMethodref,
 227                         Template.MethodrefSelectionResolvedIsClass,
 228                         Template.SelectionOverrideAbstract),
 229                 /* Group 28: callsite unrelated to methodref,
 230                  * methodref = expected, possibly skip different
 231                  * package in selection
 232                  */
 233                 new TestGroup.Simple(initBuilder,
 234                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 235                                              EnumSet.of(MethodData.Access.PACKAGE),
 236                                              EnumSet.of(MethodData.Context.INSTANCE,
 237                                                         MethodData.Context.ABSTRACT),
 238                                              EnumSet.of(ClassData.Package.SAME)),
 239                         Template.OverrideAbstractExpectedClass,
 240                         Template.MethodrefEqualsExpected,
 241                         Template.IgnoredAbstract,
 242                         Template.CallsiteUnrelatedToMethodref,
 243                         Template.MethodrefSelectionPackageSkip,
 244                         Template.SelectionOverrideAbstract),
 245                 /* Group 29: callsite unrelated to methodref, methodref != expected,
 246                  * expected is class, expected and callsite in the same package
 247                  */
 248                 new TestGroup.Simple(initBuilder,
 249                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 250                                              EnumSet.of(MethodData.Access.PUBLIC,
 251                                                         MethodData.Access.PROTECTED),
 252                                              EnumSet.of(MethodData.Context.INSTANCE,
 253                                                         MethodData.Context.ABSTRACT),
 254                                              EnumSet.of(ClassData.Package.SAME)),
 255                         Template.OverrideAbstractExpectedClass,
 256                         Template.MethodrefNotEqualsExpectedClass,
 257                         Template.IgnoredAbstract,
 258                         Template.CallsiteUnrelatedToMethodref,
 259                         Template.MethodrefSelectionResolvedIsClass,
 260                         Template.SelectionOverrideAbstract),
 261                 /* Group 30: callsite unrelated to methodref,
 262                  * methodref \!= expected, possibly skip different
 263                  * package in selection
 264                  */
 265                 new TestGroup.Simple(initBuilder,
 266                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 267                                              EnumSet.of(MethodData.Access.PACKAGE),
 268                                              EnumSet.of(MethodData.Context.INSTANCE,
 269                                                         MethodData.Context.ABSTRACT),
 270                                              EnumSet.of(ClassData.Package.SAME)),
 271                         Template.OverrideAbstractExpectedClass,
 272                         Template.MethodrefNotEqualsExpectedClass,
 273                         Template.IgnoredAbstract,
 274                         Template.CallsiteUnrelatedToMethodref,
 275                         Template.MethodrefSelectionPackageSkip,
 276                         Template.SelectionOverrideAbstract),
 277                 /* Group 31: callsite unrelated to methodref, methodref != expected,
 278                  * expected is interface, expected and callsite in the same package
 279                  */
 280                 new TestGroup.Simple(initBuilder,
 281                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 282                                              EnumSet.of(MethodData.Access.PUBLIC),
 283                                              EnumSet.of(MethodData.Context.INSTANCE,
 284                                                         MethodData.Context.ABSTRACT),
 285                                              EnumSet.of(ClassData.Package.SAME)),
 286                         Template.OverrideAbstractExpectedIface,
 287                         Template.MethodrefNotEqualsExpectedIface,
 288                         Template.IgnoredAbstract,
 289                         Template.CallsiteUnrelatedToMethodref,
 290                         Template.MethodrefSelectionResolvedIsIface,
 291                         Template.SelectionOverrideAbstract),
 292                 /* Group 32: callsite = methodref, methodref != expected,
 293                  * expected is class, expected and callsite not in the same package
 294                  */
 295                 new TestGroup.Simple(initBuilder,
 296                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 297                                              EnumSet.of(MethodData.Access.PUBLIC,
 298                                                         MethodData.Access.PROTECTED),
 299                                              EnumSet.of(MethodData.Context.INSTANCE,
 300                                                         MethodData.Context.ABSTRACT),
 301                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 302                         Template.OverrideAbstractExpectedClass,
 303                         Template.MethodrefNotEqualsExpectedClass,
 304                         Template.IgnoredAbstract,
 305                         Template.CallsiteEqualsMethodref,
 306                         Template.MethodrefSelectionResolvedIsClass,
 307                         Template.SelectionOverrideAbstract),
 308                 /* Group 33: callsite = methodref, methodref != expected,
 309                  * expected is interface, expected and callsite not in the same package
 310                  */
 311                 new TestGroup.Simple(initBuilder,
 312                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 313                                              EnumSet.of(MethodData.Access.PUBLIC),
 314                                              EnumSet.of(MethodData.Context.INSTANCE,
 315                                                         MethodData.Context.ABSTRACT),
 316                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 317                         Template.OverrideAbstractExpectedIface,
 318                         Template.MethodrefNotEqualsExpectedIface,
 319                         Template.IgnoredAbstract,
 320                         Template.CallsiteEqualsMethodref,
 321                         Template.MethodrefSelectionResolvedIsIface,
 322                         Template.SelectionOverrideAbstract),
 323                 /* Group 34: callsite :> methodref, methodref = expected,
 324                  * expected is class, expected and callsite not in the same package
 325                  */
 326                 new TestGroup.Simple(initBuilder,
 327                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 328                                              EnumSet.of(MethodData.Access.PUBLIC),
 329                                              EnumSet.of(MethodData.Context.INSTANCE,
 330                                                         MethodData.Context.ABSTRACT),
 331                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 332                         Template.OverrideAbstractExpectedClass,
 333                         Template.MethodrefEqualsExpected,
 334                         Template.IgnoredAbstract,
 335                         Template.CallsiteSubclassMethodref,
 336                         Template.MethodrefSelectionResolvedIsClass,
 337                         Template.SelectionOverrideAbstract),
 338 
 339                 /* Group 35: callsite :> methodref, methodref != expected,
 340                  * expected is class, expected and callsite not in the same package
 341                  */
 342                 new TestGroup.Simple(initBuilder,
 343                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 344                                              EnumSet.of(MethodData.Access.PUBLIC),
 345                                              EnumSet.of(MethodData.Context.INSTANCE,
 346                                                         MethodData.Context.ABSTRACT),
 347                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 348                         Template.OverrideAbstractExpectedClass,
 349                         Template.MethodrefNotEqualsExpectedClass,
 350                         Template.IgnoredAbstract,
 351                         Template.CallsiteSubclassMethodref,
 352                         Template.MethodrefSelectionResolvedIsClass,
 353                         Template.SelectionOverrideAbstract),
 354                 /* Group 36: callsite :> methodref, methodref != expected,
 355                  * expected is interface, expected and callsite not in the same package
 356                  */
 357                 new TestGroup.Simple(initBuilder,
 358                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 359                                              EnumSet.of(MethodData.Access.PUBLIC),
 360                                              EnumSet.of(MethodData.Context.INSTANCE,
 361                                                         MethodData.Context.ABSTRACT),
 362                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 363                         Template.OverrideAbstractExpectedIface,
 364                         Template.MethodrefNotEqualsExpectedIface,
 365                         Template.IgnoredAbstract,
 366                         Template.CallsiteSubclassMethodref,
 367                         Template.MethodrefSelectionResolvedIsIface,
 368                         Template.SelectionOverrideAbstract),
 369                 /* Group 37: callsite unrelated to methodref, methodref = expected,
 370                  * expected is class, expected and callsite not in the same package
 371                  */
 372                 new TestGroup.Simple(initBuilder,
 373                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 374                                              EnumSet.of(MethodData.Access.PUBLIC),
 375                                              EnumSet.of(MethodData.Context.INSTANCE,
 376                                                         MethodData.Context.ABSTRACT),
 377                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 378                         Template.OverrideAbstractExpectedClass,
 379                         Template.MethodrefEqualsExpected,
 380                         Template.IgnoredAbstract,
 381                         Template.CallsiteUnrelatedToMethodref,
 382                         Template.MethodrefSelectionResolvedIsClass,
 383                         Template.SelectionOverrideAbstract),
 384                 /* Group 38: callsite unrelated to methodref, methodref != expected,
 385                  * expected is class, expected and callsite not in the same package
 386                  */
 387                 new TestGroup.Simple(initBuilder,
 388                         Template.ResultCombo(EnumSet.of(Template.Kind.CLASS),
 389                                              EnumSet.of(MethodData.Access.PUBLIC),
 390                                              EnumSet.of(MethodData.Context.INSTANCE,
 391                                                         MethodData.Context.ABSTRACT),
 392                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 393                         Template.OverrideAbstractExpectedClass,
 394                         Template.MethodrefNotEqualsExpectedClass,
 395                         Template.IgnoredAbstract,
 396                         Template.CallsiteUnrelatedToMethodref,
 397                         Template.MethodrefSelectionResolvedIsClass,
 398                         Template.SelectionOverrideAbstract),
 399                 /* Group 39: callsite unrelated to methodref, methodref != expected,
 400                  * expected is interface, expected and callsite not in the same package
 401                  */
 402                 new TestGroup.Simple(initBuilder,
 403                         Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE),
 404                                              EnumSet.of(MethodData.Access.PUBLIC),
 405                                              EnumSet.of(MethodData.Context.INSTANCE,
 406                                                         MethodData.Context.ABSTRACT),
 407                                              EnumSet.of(ClassData.Package.DIFFERENT)),
 408                         Template.OverrideAbstractExpectedIface,
 409                         Template.MethodrefNotEqualsExpectedIface,
 410                         Template.IgnoredAbstract,
 411                         Template.CallsiteUnrelatedToMethodref,
 412                         Template.MethodrefSelectionResolvedIsIface,
 413                         Template.SelectionOverrideAbstract)
 414             );
 415 
 416     private InvokeVirtualSuccessTest() {
 417         super(testgroups);
 418     }
 419 
 420     public static void main(final String... args) {
 421         new InvokeVirtualSuccessTest().run();
 422     }
 423 }