1 /*
   2  * Copyright (c) 2018, 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package openjdk.jcov.filter.simplemethods;
  26 
  27 import org.testng.annotations.Test;
  28 
  29 import static org.testng.Assert.assertFalse;
  30 import static org.testng.Assert.assertTrue;
  31 import static org.testng.Assert.fail;
  32 
  33 import java.io.IOException;
  34 import java.net.URISyntaxException;
  35 import java.nio.file.Files;
  36 import java.nio.file.Path;
  37 import java.util.Arrays;
  38 
  39 public class MainTest {
  40 
  41     @Test
  42     public void testJRTFS() throws IOException, URISyntaxException {
  43         Path getters = Files.createTempFile("getters", ".lst");
  44         System.out.println("testJRTFS output file: " + getters.toAbsolutePath().toString());
  45         Scanner.main(new String[]{
  46                 "--getters", getters.toAbsolutePath().toString(),
  47                 "--include", "java.util",
  48                 "jrt:/"
  49         });
  50         assertTrue(Files.lines(getters).anyMatch(l -> l.equals("java/util/ArrayList#size()I")));
  51         assertTrue(Files.lines(getters).noneMatch(l -> l.equals("java/io/File#getPath()Ljava/lang/String;")));
  52         Files.delete(getters);
  53     }
  54 
  55     @Test
  56     public void testJRTFSNoJavaUtil() throws IOException, URISyntaxException {
  57         Path getters = Files.createTempFile("throwers", ".lst");
  58         System.out.println("testJRTFSNoJavaUtil output file: " + getters.toAbsolutePath().toString());
  59         Scanner.main(new String[]{
  60                 "--throwers", getters.toAbsolutePath().toString(),
  61                 "--exclude", "java.util",
  62                 "jrt:/"
  63         });
  64         assertTrue(Files.lines(getters).noneMatch(l -> l.equals("java/util/AbstractList#add(ILjava/lang/Object;)V")));
  65         assertTrue(Files.lines(getters).anyMatch("java/io/InputStream#reset()V"::equals));
  66         Files.delete(getters);
  67     }
  68 
  69     @Test
  70     public void testDir() throws IOException, URISyntaxException {
  71         String dir = System.getProperty("test.classes");
  72         Path delegators = Files.createTempFile("delegators", ".lst");
  73         System.out.println("testDir output file: " + delegators.toAbsolutePath().toString());
  74         Scanner.main(new String[]{
  75                 "--delegators", delegators.toAbsolutePath().toString(),
  76                 "file://" + dir
  77         });
  78         assertTrue(Files.lines(delegators).anyMatch(l ->
  79                 l.equals(DelegatorsTest.class.getName().replace('.', '/') + "#foo(I)I")));
  80         Files.delete(delegators);
  81     }
  82 
  83     @Test
  84     public void testJAR() throws IOException, URISyntaxException {
  85         String jar = System.getProperty("test.jar");
  86         Path setters = Files.createTempFile("setters", ".lst");
  87         System.out.println("testJAR output file: " + setters.toAbsolutePath().toString());
  88         Scanner.main(new String[]{
  89                 "--setters", setters.toAbsolutePath().toString(),
  90                 "jar:file:" + jar});
  91         assertTrue(Files.lines(setters).anyMatch(l ->
  92                 l.equals(SettersTest.class.getName().replace('.', '/') + "#setField(I)V")));
  93     }
  94 
  95     @Test(expectedExceptions = RuntimeException.class, expectedExceptionsMessageRegExp = "Unknown filter.*")
  96     public void testWrongFilter() throws IOException, URISyntaxException {
  97             Scanner.main(new String[]{
  98                     "--a-non-existing-filter", "a_file",
  99                     "file:///a/path"});
 100     }
 101 
 102     public void testNoFilter() throws IOException, URISyntaxException {
 103         try {
 104             Scanner.main(new String[]{
 105                     "file:///a/path"});
 106             fail("No RuntimeException when no filters specified");
 107         } catch (RuntimeException e) {
 108             assertTrue(Arrays.stream(Scanner.Filter.values()).map(f -> "--" + f.name())
 109                     .allMatch(f -> e.getMessage().contains(f)), "Incorrect error message: " + e.getMessage());
 110         }
 111     }
 112 }