1 /*
   2  * Copyright (c) 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 8141492
  27  * @summary Test the search feature of javadoc.
  28  * @author bpatel
  29  * @library ../lib
  30  * @modules jdk.javadoc
  31  * @build JavadocTester
  32  * @run main TestSearch
  33  */
  34 
  35 public class TestSearch extends JavadocTester {
  36 
  37     public static void main(String... args) throws Exception {
  38         TestSearch tester = new TestSearch();
  39         tester.runTests();
  40     }
  41 
  42     @Test
  43     void test1() {
  44         javadoc("-d", "out-1", "-sourcepath", "-use", testSrc("UnnamedPkgClass.java"));
  45         checkExit(Exit.OK);
  46         checkSearchOutput("UnnamedPkgClass.html", true);
  47         checkJqueryAndImageFiles(true);
  48         checkFiles(false,
  49                 "package-search-index.zip",
  50                 "tag-search-index.zip");
  51         checkFiles(true,
  52                 "member-search-index.zip",
  53                 "type-search-index.zip");
  54     }
  55 
  56     @Test
  57     void test2() {
  58         javadoc("-d", "out-2", "-Xdoclint:none", "-sourcepath", testSrc,
  59                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
  60         checkExit(Exit.OK);
  61         checkInvalidUsageIndexTag();
  62         checkSearchOutput(true);
  63         checkSingleIndex(true);
  64         checkJqueryAndImageFiles(true);
  65         checkFiles(true,
  66                 "member-search-index.zip",
  67                 "package-search-index.zip",
  68                 "tag-search-index.zip",
  69                 "type-search-index.zip");
  70     }
  71 
  72     @Test
  73     void test3() {
  74         javadoc("-d", "out-3", "-noindex", "-Xdoclint:none",
  75                 "-sourcepath", testSrc,
  76                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
  77         checkExit(Exit.OK);
  78         checkSearchOutput(false);
  79         checkJqueryAndImageFiles(false);
  80         checkFiles(false,
  81                 "member-search-index.zip",
  82                 "package-search-index.zip",
  83                 "tag-search-index.zip",
  84                 "type-search-index.zip",
  85                 "index-all.html");
  86     }
  87 
  88     @Test
  89     void test4() {
  90         javadoc("-d", "out-4", "-html5", "-Xdoclint:none",
  91                 "-sourcepath", testSrc,
  92                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
  93         checkExit(Exit.OK);
  94         checkSearchOutput(true);
  95         checkSingleIndex(true);
  96         checkJqueryAndImageFiles(true);
  97         checkFiles(true,
  98                 "member-search-index.zip",
  99                 "package-search-index.zip",
 100                 "tag-search-index.zip",
 101                 "type-search-index.zip");
 102     }
 103 
 104     @Test
 105     void test5() {
 106         javadoc("-d", "out-5", "-noindex", "-html5", "-Xdoclint:none",
 107                 "-sourcepath", testSrc,
 108                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
 109         checkExit(Exit.OK);
 110         checkSearchOutput(false);
 111         checkJqueryAndImageFiles(false);
 112         checkFiles(false,
 113                 "member-search-index.zip",
 114                 "package-search-index.zip",
 115                 "tag-search-index.zip",
 116                 "type-search-index.zip",
 117                 "index-all.html");
 118     }
 119 
 120     @Test
 121     void test6() {
 122         javadoc("-d", "out-6", "-nocomment", "-Xdoclint:none",
 123                 "-sourcepath", testSrc,
 124                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
 125         checkExit(Exit.OK);
 126         checkSearchOutput(true);
 127         checkIndexNoComment();
 128         checkJqueryAndImageFiles(true);
 129         checkFiles(true,
 130                 "member-search-index.zip",
 131                 "package-search-index.zip",
 132                 "tag-search-index.zip",
 133                 "type-search-index.zip");
 134     }
 135 
 136     @Test
 137     void test7() {
 138         javadoc("-d", "out-7", "-nodeprecated", "-Xdoclint:none",
 139                 "-sourcepath", testSrc,
 140                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
 141         checkExit(Exit.OK);
 142         checkSearchOutput(true);
 143         checkIndexNoDeprecated();
 144         checkJqueryAndImageFiles(true);
 145         checkFiles(true,
 146                 "member-search-index.zip",
 147                 "package-search-index.zip",
 148                 "tag-search-index.zip",
 149                 "type-search-index.zip");
 150     }
 151 
 152     @Test
 153     void test8() {
 154         javadoc("-d", "out-8", "-splitindex", "-Xdoclint:none", "-sourcepath", testSrc,
 155                 "-use", "pkg", "pkg1", "pkg2", "pkg3");
 156         checkExit(Exit.OK);
 157         checkInvalidUsageIndexTag();
 158         checkSearchOutput(true);
 159         checkSplitIndex();
 160         checkJqueryAndImageFiles(true);
 161         checkFiles(true,
 162                 "member-search-index.zip",
 163                 "package-search-index.zip",
 164                 "tag-search-index.zip",
 165                 "type-search-index.zip");
 166     }
 167 
 168     @Test
 169     void test9() {
 170         javadoc("-d", "out-9", "-sourcepath", testSrc, "-javafx", "-package",
 171                 "-use", "pkgfx", "pkg3");
 172         checkExit(Exit.OK);
 173         checkSearchOutput(true);
 174         checkJavaFXOutput();
 175         checkJqueryAndImageFiles(true);
 176         checkFiles(false,
 177                 "tag-search-index.zip");
 178         checkFiles(true,
 179                 "member-search-index.zip",
 180                 "package-search-index.zip",
 181                 "type-search-index.zip");
 182     }
 183 
 184     void checkSearchOutput(boolean expectedOutput) {
 185         checkSearchOutput("overview-summary.html", expectedOutput);
 186     }
 187 
 188     void checkSearchOutput(String fileName, boolean expectedOutput) {
 189         // Test for search related markup
 190         checkOutput(fileName, expectedOutput,
 191                 "<link rel=\"stylesheet\" type=\"text/css\" href=\"jquery/jquery-ui.css\" title=\"Style\">\n",
 192                 "<script type=\"text/javascript\" src=\"jquery/jszip/dist/jszip.min.js\"></script>\n",
 193                 "<script type=\"text/javascript\" src=\"jquery/jszip-utils/dist/jszip-utils.min.js\"></script>\n",
 194                 "<!--[if IE]>\n",
 195                 "<script type=\"text/javascript\" src=\"jquery/jszip-utils/dist/jszip-utils-ie.min.js\"></script>\n",
 196                 "<![endif]-->\n",
 197                 "<script type=\"text/javascript\" src=\"jquery/jquery-1.10.2.js\"></script>\n",
 198                 "<script type=\"text/javascript\" src=\"jquery/jquery-ui.js\"></script>",
 199                 "var pathtoroot = \"./\";loadScripts(document, 'script');",
 200                 "<ul class=\"navListSearch\">\n",
 201                 "<li><span>SEARCH:&nbsp;</span>\n",
 202                 "<input type=\"text\" id=\"search\" value=\" \" disabled=\"disabled\">\n",
 203                 "<input type=\"reset\" id=\"reset\" value=\" \" disabled=\"disabled\">\n");
 204         checkOutput(fileName, true,
 205                 "<div class=\"fixedNav\">");
 206     }
 207 
 208     void checkSingleIndex(boolean expectedOutput) {
 209         // Test for search tags markup in index file.
 210         checkOutput("index-all.html", expectedOutput,
 211                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#phrasewithspaces\">"
 212                         + "phrase with spaces</a></span> - Search tag in pkg</dt>",
 213                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#searchphrase\">"
 214                         + "search phrase</a></span> - Search tag in pkg1.RegClass</dt>",
 215                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#SearchWordWithDescription\">"
 216                         + "SearchWordWithDescription</a></span> - Search tag in pkg1.RegClass.CONSTANT_FIELD_1</dt>",
 217                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestAnnotationType.html#searchphrasewithdescdeprecated\">"
 218                         + "search phrase with desc deprecated</a></span> - Search tag in pkg2.TestAnnotationType</dt>",
 219                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestClass.html#SearchTagDeprecatedClass\">"
 220                         + "SearchTagDeprecatedClass</a></span> - Search tag in pkg2.TestClass</dt>",
 221                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestEnum.html#searchphrasedeprecated\">"
 222                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 223                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestEnum.html#searchphrasedeprecated\">"
 224                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 225                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 226                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>",
 227                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 228                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>",
 229                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#SingleWord\">"
 230                         + "SingleWord</a></span> - Search tag in pkg</dt>",
 231                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/AnotherClass.ModalExclusionType.html"
 232                         + "#nested%7B@indexnested_tag_test%7D\">nested {@index nested_tag_test}</a></span> - "
 233                         + "Search tag in pkg.AnotherClass.ModalExclusionType.NO_EXCLUDE</dt>",
 234                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/AnotherClass.ModalExclusionType.html"
 235                         + "#html-span-see-/span-\">html &lt;span&gt; see &lt;/span&gt;</a></span> - Search "
 236                         + "tag in pkg.AnotherClass.ModalExclusionType.APPLICATION_EXCLUDE</dt>",
 237                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/AnotherClass.html#quoted\">quoted</a>"
 238                         + "</span> - Search tag in pkg.AnotherClass.CONSTANT1</dt>");
 239         checkOutput("index-all.html", true,
 240                 "<div class=\"block\"><span class=\"deprecationComment\">class_test1 passes. Search tag"
 241                         + " <a id=\"SearchTagDeprecatedClass\">SearchTagDeprecatedClass</a></span></div>",
 242                 "<div class=\"block\"><span class=\"deprecationComment\">error_test3 passes. Search tag for\n"
 243                         + " method <a id=\"SearchTagDeprecatedMethod\">SearchTagDeprecatedMethod</a></span></div>");
 244     }
 245 
 246     void checkSplitIndex() {
 247         // Test for search tags markup in split index file.
 248         checkOutput("index-files/index-12.html", true,
 249                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg1/RegClass.html#searchphrase\">"
 250                         + "search phrase</a></span> - Search tag in pkg1.RegClass</dt>",
 251                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg1/RegClass.html#SearchWordWithDescription\">"
 252                         + "SearchWordWithDescription</a></span> - Search tag in pkg1.RegClass.CONSTANT_FIELD_1</dt>",
 253                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestAnnotationType.html#searchphrasewithdescdeprecated\">"
 254                         + "search phrase with desc deprecated</a></span> - Search tag in pkg2.TestAnnotationType</dt>",
 255                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestClass.html#SearchTagDeprecatedClass\">"
 256                         + "SearchTagDeprecatedClass</a></span> - Search tag in pkg2.TestClass</dt>",
 257                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestEnum.html#searchphrasedeprecated\">"
 258                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 259                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestEnum.html#searchphrasedeprecated\">"
 260                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 261                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 262                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>",
 263                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 264                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>",
 265                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg/package-summary.html#SingleWord\">"
 266                         + "SingleWord</a></span> - Search tag in pkg</dt>");
 267         checkOutput("index-files/index-9.html", true,
 268                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg/package-summary.html#phrasewithspaces\">"
 269                         + "phrase with spaces</a></span> - Search tag in pkg</dt>");
 270         checkOutput("index-files/index-8.html", true,
 271                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg/AnotherClass.ModalExclusionType.html"
 272                         + "#nested%7B@indexnested_tag_test%7D\">nested {@index nested_tag_test}</a></span> - "
 273                         + "Search tag in pkg.AnotherClass.ModalExclusionType.NO_EXCLUDE</dt>");
 274         checkOutput("index-files/index-5.html", true,
 275                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg/AnotherClass.ModalExclusionType.html"
 276                         + "#html-span-see-/span-\">html &lt;span&gt; see &lt;/span&gt;</a></span> - Search "
 277                         + "tag in pkg.AnotherClass.ModalExclusionType.APPLICATION_EXCLUDE</dt>");
 278         checkOutput("index-files/index-10.html", true,
 279                 "<dt><span class=\"searchTagLink\"><a href=\"../pkg/AnotherClass.html#quoted\">quoted</a>"
 280                         + "</span> - Search tag in pkg.AnotherClass.CONSTANT1</dt>");
 281     }
 282 
 283     void checkIndexNoComment() {
 284         // Test for search tags markup in index file when javadoc is executed with -nocomment.
 285         checkOutput("index-all.html", false,
 286                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#phrasewithspaces\">"
 287                         + "phrase with spaces</a></span> - Search tag in pkg</dt>",
 288                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#searchphrase\">"
 289                         + "search phrase</a></span> - Search tag in pkg1.RegClass</dt>",
 290                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#SearchWordWithDescription\">"
 291                         + "SearchWordWithDescription</a></span> - Search tag in pkg1.RegClass.CONSTANT_FIELD_1</dt>",
 292                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestAnnotationType.html#searchphrasewithdescdeprecated\">"
 293                         + "search phrase with desc deprecated</a></span> - Search tag in pkg2.TestAnnotationType</dt>",
 294                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestClass.html#SearchTagDeprecatedClass\">"
 295                         + "SearchTagDeprecatedClass</a></span> - Search tag in pkg2.TestClass</dt>",
 296                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#SingleWord\">"
 297                         + "SingleWord</a></span> - Search tag in pkg</dt>",
 298                 "<div class=\"block\"><span class=\"deprecationComment\">class_test1 passes. Search tag"
 299                         + " <a id=\"SearchTagDeprecatedClass\">SearchTagDeprecatedClass</a></span></div>",
 300                 "<div class=\"block\"><span class=\"deprecationComment\">error_test3 passes. Search tag for\n"
 301                         + " method <a id=\"SearchTagDeprecatedMethod\">SearchTagDeprecatedMethod</a></span></div>");
 302         checkOutput("index-all.html", true,
 303                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestEnum.html#searchphrasedeprecated\">"
 304                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 305                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 306                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>");
 307     }
 308 
 309     void checkIndexNoDeprecated() {
 310         // Test for search tags markup in index file when javadoc is executed using -nodeprecated.
 311         checkOutput("index-all.html", true,
 312                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#phrasewithspaces\">"
 313                         + "phrase with spaces</a></span> - Search tag in pkg</dt>",
 314                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#searchphrase\">"
 315                         + "search phrase</a></span> - Search tag in pkg1.RegClass</dt>",
 316                 "<dt><span class=\"searchTagLink\"><a href=\"pkg1/RegClass.html#SearchWordWithDescription\">"
 317                         + "SearchWordWithDescription</a></span> - Search tag in pkg1.RegClass.CONSTANT_FIELD_1</dt>",
 318                 "<dt><span class=\"searchTagLink\"><a href=\"pkg/package-summary.html#SingleWord\">"
 319                         + "SingleWord</a></span> - Search tag in pkg</dt>");
 320         checkOutput("index-all.html", false,
 321                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestAnnotationType.html#searchphrasewithdescdeprecated\">"
 322                         + "search phrase with desc deprecated</a></span> - Search tag in pkg2.TestAnnotationType</dt>",
 323                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestClass.html#SearchTagDeprecatedClass\">"
 324                         + "SearchTagDeprecatedClass</a></span> - Search tag in pkg2.TestClass</dt>",
 325                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestEnum.html#searchphrasedeprecated\">"
 326                         + "search phrase deprecated</a></span> - Search tag in pkg2.TestEnum.ONE</dt>",
 327                 "<dt><span class=\"searchTagLink\"><a href=\"pkg2/TestError.html#SearchTagDeprecatedMethod\">"
 328                         + "SearchTagDeprecatedMethod</a></span> - Search tag in pkg2.TestError</dt>",
 329                 "<div class=\"block\"><span class=\"deprecationComment\">class_test1 passes. Search tag"
 330                         + " <a id=\"SearchTagDeprecatedClass\">SearchTagDeprecatedClass</a></span></div>",
 331                 "<div class=\"block\"><span class=\"deprecationComment\">error_test3 passes. Search tag for\n"
 332                         + " method <a id=\"SearchTagDeprecatedMethod\">SearchTagDeprecatedMethod</a></span></div>");
 333     }
 334 
 335     void checkJavaFXOutput() {
 336         checkOutput("index-all.html", false, "test treat as private");
 337     }
 338 
 339     void checkInvalidUsageIndexTag() {
 340         checkOutput(Output.WARNING, true,
 341                 "AnotherClass.java:33: warning - invalid usage of @index tag.",
 342                 "AnotherClass.java:38: warning - invalid usage of @index tag.",
 343                 "AnotherClass.java:43: warning - invalid usage of @index tag.",
 344                 "AnotherClass.java:75: warning - invalid usage of @index tag.");
 345     }
 346 
 347     void checkJqueryAndImageFiles(boolean expectedOutput) {
 348         checkFiles(expectedOutput,
 349                 "search.js",
 350                 "jquery/jquery-1.10.2.js",
 351                 "jquery/jquery-ui.js",
 352                 "jquery/jquery-ui.css",
 353                 "jquery/jquery-ui.min.js",
 354                 "jquery/jquery-ui.min.css",
 355                 "jquery/jquery-ui.structure.min.css",
 356                 "jquery/jquery-ui.structure.css",
 357                 "jquery/external/jquery/jquery.js",
 358                 "jquery/jszip/dist/jszip.js",
 359                 "jquery/jszip/dist/jszip.min.js",
 360                 "jquery/jszip-utils/dist/jszip-utils.js",
 361                 "jquery/jszip-utils/dist/jszip-utils.min.js",
 362                 "jquery/jszip-utils/dist/jszip-utils-ie.js",
 363                 "jquery/jszip-utils/dist/jszip-utils-ie.min.js",
 364                 "jquery/images/ui-bg_flat_0_aaaaaa_40x100.png",
 365                 "jquery/images/ui-icons_454545_256x240.png",
 366                 "jquery/images/ui-bg_glass_95_fef1ec_1x400.png",
 367                 "jquery/images/ui-bg_glass_75_dadada_1x400.png",
 368                 "jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png",
 369                 "jquery/images/ui-icons_888888_256x240.png",
 370                 "jquery/images/ui-icons_2e83ff_256x240.png",
 371                 "jquery/images/ui-bg_glass_65_ffffff_1x400.png",
 372                 "jquery/images/ui-icons_cd0a0a_256x240.png",
 373                 "jquery/images/ui-bg_glass_55_fbf9ee_1x400.png",
 374                 "jquery/images/ui-icons_222222_256x240.png",
 375                 "jquery/images/ui-bg_glass_75_e6e6e6_1x400.png",
 376                 "jquery/images/ui-bg_flat_75_ffffff_40x100.png",
 377                 "resources/x.png",
 378                 "resources/glass.png");
 379     }
 380 }