1 /*
2  * Copyright (c) 2017, 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.
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 8178067 8192007 8182765
27  * @summary tests the module's services, such as provides and uses
28  * @modules jdk.javadoc/jdk.javadoc.internal.api
29  *          jdk.javadoc/jdk.javadoc.internal.tool
30  *          jdk.compiler/com.sun.tools.javac.api
31  *          jdk.compiler/com.sun.tools.javac.main
32  * @library ../lib /tools/lib
33  * @build toolbox.ToolBox toolbox.ModuleBuilder JavadocTester
34  * @run main TestModuleServices
35  */
36 
37 import java.nio.file.Files;
38 import java.nio.file.Path;
39 import java.nio.file.Paths;
40 
41 import toolbox.*;
42 
43 public class TestModuleServices extends JavadocTester {
44 
45     public final ToolBox tb;
main(String... args)46     public static void main(String... args) throws Exception {
47         TestModuleServices tester = new TestModuleServices();
48         tester.runTests(m -> new Object[] { Paths.get(m.getName()) });
49     }
50 
TestModuleServices()51     public TestModuleServices() {
52         tb = new ToolBox();
53     }
54 
55     @Test
checkModuleServicesDescription(Path base)56     public void checkModuleServicesDescription(Path base) throws Exception {
57         Path src = Files.createDirectories(base.resolve("src"));
58         ModuleBuilder mb = new ModuleBuilder(tb, "moduleService")
59                 .comment("This module exports a package containing the declaration of a service type.")
60                 .exports("pkgService")
61                 .classes("/**A Package that has a service.*/ package pkgService;")
62                 .classes("package pkgService; /**A service Interface for service providers.*/ "
63                         + "public interface Service {\n"
64                         + "    /**\n"
65                         + "     * A test method for the service.\n"
66                         + "     */\n"
67                         + "    void testMethod1();\n"
68                         + "    /**\n"
69                         + "     * Another test method for the service.\n"
70                         + "     */\n"
71                         + "    void testMethod2();\n"
72                         + "}");
73         mb.write(src);
74         mb = new ModuleBuilder(tb, "moduleServiceProvider")
75                 .comment("This module provides an implementation of a service.\n" +
76                         "@provides pkgService.Service Provides a service whose name is ServiceProvider.")
77                 .requires("moduleService")
78                 .provides("pkgService.Service", "pkgServiceProvider.ServiceProvider")
79                 .classes("/**A Package that has a service provider.*/ package pkgServiceProvider;")
80                 .classes("package pkgServiceProvider;\n"
81                         + "public class ServiceProvider implements pkgService.Service {\n"
82                         + "    /**\n"
83                         + "     * {@inheritDoc}\n"
84                         + "     */\n"
85                         + "    public void testMethod1() {}\n"
86                         + "    /**\n"
87                         + "     * This is an internal implementation so the documentation will not be seen.\n"
88                         + "     */\n"
89                         + "    public void testMethod2() {}\n"
90                         + "}");
91         mb.write(src);
92         mb = new ModuleBuilder(tb, "moduleServiceUser")
93                 .comment("This module uses a service defined in another module.\n"
94                         + "@uses pkgService.Service If no other provider is found, a default internal implementation will be used.")
95                 .requires("moduleService")
96                 .uses("pkgService.Service")
97                 .classes("/**A Package that has a service user.*/ package pkgServiceUser;")
98                 .classes("package pkgServiceUser;\n"
99                         + "/**\n"
100                         + " * A service user class.\n"
101                         + " */\n"
102                         + "public class ServiceUser {\n"
103                         + "}");
104         mb.write(src);
105         mb = new ModuleBuilder(tb, "moduleServiceUserNoDescription")
106                 .comment("This is another module that uses a service defined in another module.\n"
107                         + "@uses pkgService.Service")
108                 .requires("moduleService")
109                 .uses("pkgService.Service")
110                 .classes("/**A Package that has a service user with no description.*/ package pkgServiceUserNoDescription;")
111                 .classes("package pkgServiceUserNoDescription;\n"
112                         + "/**\n"
113                         + " * A service user class.\n"
114                         + " */\n"
115                         + "public class ServiceUserNoDescription {\n"
116                         + "}");
117         mb.write(src);
118 
119         javadoc("-d", base.resolve("out").toString(),
120                 "-quiet",
121                 "-noindex",
122                 "--module-source-path", src.toString(),
123                 "--module", "moduleService,moduleServiceProvider,moduleServiceUser,moduleServiceUserNoDescription",
124                 "pkgService", "moduleServiceProvider/pkgServiceProvider", "moduleServiceUser/pkgServiceUser",
125                 "moduleServiceUserNoDescription/pkgServiceUserNoDescription");
126         checkExit(Exit.OK);
127 
128         checkOutput("moduleServiceProvider/module-summary.html", true,
129                 "<tr class=\"altColor\">\n"
130                 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" "
131                 + "title=\"interface in pkgService\">Service</a></th>\n"
132                 + "<td class=\"colLast\">\n"
133                 + "<div class=\"block\">Provides a service whose name is ServiceProvider.</div>\n"
134                 + "</td>\n"
135                 + "</tr>");
136         checkOutput("moduleServiceUser/module-summary.html", true,
137                 "<tr class=\"altColor\">\n"
138                 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" title=\"interface in pkgService\">Service</a></th>\n"
139                 + "<td class=\"colLast\">\n"
140                 + "<div class=\"block\">If no other provider is found, a default internal implementation will be used.</div>\n"
141                 + "</td>\n"
142                 + "</tr>");
143         checkOutput("moduleServiceUserNoDescription/module-summary.html", true,
144                 "<tr class=\"altColor\">\n"
145                 + "<th class=\"colFirst\" scope=\"row\"><a href=\"../moduleService/pkgService/Service.html\" title=\"interface in pkgService\">Service</a></th>\n"
146                 + "<td class=\"colLast\">\n"
147                 + "<div class=\"block\">A service Interface for service providers.</div>\n"
148                 + "</td>\n"
149                 + "</tr>");
150         checkOutput("moduleServiceProvider/module-summary.html", false,
151                 "A service Interface for service providers.");
152         checkOutput("moduleServiceUser/module-summary.html", false,
153                 "A service Interface for service providers.");
154     }
155 
156     @Test
checkUsesNoApiTagModuleModeDefault(Path base)157     public void checkUsesNoApiTagModuleModeDefault(Path base) throws Exception {
158         ModuleBuilder mb = new ModuleBuilder(tb, "m")
159                 .comment("module m.\n@provides p1.A abc") // bogus tag
160                 .uses("p1.A")
161                 .uses("p1.B")
162                 .exports("p1")
163                 .classes("package p1; public class A {}")
164                 .classes("package p1; public class B {}");
165                 mb.write(base);
166 
167         javadoc("-d", base.toString() + "/out",
168                 "-quiet",
169                 "--module-source-path", base.toString(),
170                 "--module", "m");
171         checkExit(Exit.OK);
172 
173         checkOutput("m/module-summary.html", false,
174                 "<h3>Services</h3>");
175     }
176 
177     @Test
checkUsesNoApiTagModuleModeAll(Path base)178     public void checkUsesNoApiTagModuleModeAll(Path base) throws Exception {
179         ModuleBuilder mb = new ModuleBuilder(tb, "m")
180                 .uses("p1.A")
181                 .uses("p1.B")
182                 .exports("p1")
183                 .classes("package p1; public class A {}")
184                 .classes("package p1; public class B {}");
185         mb.write(base);
186 
187         javadoc("-d", base.toString() + "/out",
188                 "-quiet",
189                 "--show-module-contents", "all",
190                 "--module-source-path", base.toString(),
191                 "--module", "m");
192         checkExit(Exit.OK);
193 
194         checkOutput("m/module-summary.html", true,
195                 "<h3>Services</h3>");
196 
197         checkOutput("m/module-summary.html", true,
198                 "<table class=\"usesSummary\">\n" +
199                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
200                 "<tr>\n" +
201                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
202                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
203                 "</tr>\n" +
204                 "<tbody>\n" +
205                 "<tr class=\"altColor\">\n" +
206                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" +
207                 "<td class=\"colLast\">&nbsp;</td>\n" +
208                 "</tr>\n" +
209                 "<tr class=\"rowColor\">\n" +
210                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/B.html\" title=\"class in p1\">B</a></th>\n" +
211                 "<td class=\"colLast\">&nbsp;</td>\n" +
212                 "</tr>\n" +
213                 "</tbody>\n" +
214                 "</table>\n");
215 
216         javadoc("-d", base.toString() + "/out-html4",
217                 "-html4",
218                 "-quiet",
219                 "--show-module-contents", "all",
220                 "--module-source-path", base.toString(),
221                 "--module", "m");
222         checkExit(Exit.OK);
223 
224         checkOutput("m/module-summary.html", true,
225                 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" +
226                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
227                 "<tr>\n" +
228                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
229                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
230                 "</tr>\n" +
231                 "<tbody>\n" +
232                 "<tr class=\"altColor\">\n" +
233                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" +
234                 "<td class=\"colLast\">&nbsp;</td>\n" +
235                 "</tr>\n" +
236                 "<tr class=\"rowColor\">\n" +
237                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/B.html\" title=\"class in p1\">B</a></th>\n" +
238                 "<td class=\"colLast\">&nbsp;</td>\n" +
239                 "</tr>\n" +
240                 "</tbody>\n" +
241                 "</table>\n");
242     }
243 
244     @Test
checkUsesWithApiTagModuleModeDefault(Path base)245     public void checkUsesWithApiTagModuleModeDefault(Path base) throws Exception {
246         ModuleBuilder mb = new ModuleBuilder(tb, "m")
247                 .comment("module m.\n@uses p1.A")
248                 .uses("p1.A")
249                 .uses("p1.B")
250                 .exports("p1")
251                 .classes("package p1; public class A {}")
252                 .classes("package p1; public class B {}");
253         mb.write(base);
254 
255         javadoc("-d", base.toString() + "/out",
256                 "-quiet",
257                 "--module-source-path", base.toString(),
258                 "--module", "m");
259         checkExit(Exit.OK);
260 
261         checkOutput("m/module-summary.html", true,
262                 "<h3>Services</h3>");
263 
264         checkOutput("m/module-summary.html", true,
265                 "<table class=\"usesSummary\">\n" +
266                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
267                 "<tr>\n" +
268                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
269                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
270                 "</tr>\n" +
271                 "<tbody>\n" +
272                 "<tr class=\"altColor\">\n" +
273                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" +
274                 "<td class=\"colLast\">&nbsp;</td>\n" +
275                 "</tr>\n" +
276                 "</tbody>\n" +
277                 "</table>\n");
278 
279         javadoc("-d", base.toString() + "/out-html4",
280                 "-html4",
281                 "-quiet",
282                 "--module-source-path", base.toString(),
283                 "--module", "m");
284         checkExit(Exit.OK);
285 
286         checkOutput("m/module-summary.html", true,
287                 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" +
288                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
289                 "<tr>\n" +
290                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
291                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
292                 "</tr>\n" +
293                 "<tbody>\n" +
294                 "<tr class=\"altColor\">\n" +
295                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"class in p1\">A</a></th>\n" +
296                 "<td class=\"colLast\">&nbsp;</td>\n" +
297                 "</tr>\n" +
298                 "</tbody>\n" +
299                 "</table>\n");
300     }
301 
302     @Test
checkProvidesNoApiTagModuleModeDefault(Path base)303     public void checkProvidesNoApiTagModuleModeDefault(Path base) throws Exception {
304         ModuleBuilder mb = new ModuleBuilder(tb, "m")
305                 .comment("module m.\n@uses p1.A")
306                 .provides("p1.A", "p1.B")
307                 .exports("p1")
308                 .classes("package p1; public interface A {}")
309                 .classes("package p1; public class B implements A {}")
310                 .provides("p2.A", "p2.B")
311                 .exports("p2")
312                 .classes("package p2; public interface A {}")
313                 .classes("package p2; public class B implements A {}");
314         mb.write(base);
315 
316         javadoc("-d", base.toString() + "/out",
317                 "-quiet",
318                 "--module-source-path", base.toString(),
319                 "--module", "m");
320 
321         checkExit(Exit.OK);
322 
323         checkOutput("m/module-summary.html", false,
324                 "<h3>Services</h3>");
325     }
326 
327     @Test
checkProvidesNoApiTagModuleModeAll(Path base)328     public void checkProvidesNoApiTagModuleModeAll(Path base) throws Exception {
329         ModuleBuilder mb = new ModuleBuilder(tb, "m")
330                 .comment("module m.\n@uses p1.A") // bogus uses tag
331                 .provides("p1.A", "p1.B")
332                 .exports("p1")
333                 .classes("package p1; public interface A {}")
334                 .classes("package p1; public class B implements A {}")
335                 .provides("p2.A", "p2.B")
336                 .exports("p2")
337                 .classes("package p2; public interface A {}")
338                 .classes("package p2; public class B implements A {}");
339         mb.write(base);
340 
341         javadoc("-d", base.toString() + "/out",
342                 "-quiet",
343                 "--show-module-contents", "all",
344                 "--module-source-path", base.toString(),
345                 "--module", "m");
346 
347         checkExit(Exit.OK);
348 
349         checkOutput("m/module-summary.html", true,
350                 "<h3>Services</h3>");
351 
352         checkOutput("m/module-summary.html", true,
353                 "<table class=\"providesSummary\">\n" +
354                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
355                 "<tr>\n" +
356                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
357                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
358                 "</tr>\n" +
359                 "<tbody>\n" +
360                 "<tr class=\"altColor\">\n" +
361                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
362                 "<td class=\"colLast\">&nbsp;<br>(<span class=\"implementationLabel\">Implementation(s):</span>&nbsp;<a href=\"p1/B.html\" title=\"class in p1\">B</a>)</td>\n" +
363                 "</tr>\n" +
364                 "<tr class=\"rowColor\">\n" +
365                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/A.html\" title=\"interface in p2\">A</a></th>\n" +
366                 "<td class=\"colLast\">&nbsp;<br>(<span class=\"implementationLabel\">Implementation(s):</span>&nbsp;<a href=\"p2/B.html\" title=\"class in p2\">B</a>)</td>\n" +
367                 "</tr>\n" +
368                 "</tbody>\n");
369 
370         javadoc("-d", base.toString() + "/out-html4",
371                 "-html4",
372                 "-quiet",
373                 "--show-module-contents", "all",
374                 "--module-source-path", base.toString(),
375                 "--module", "m");
376 
377         checkExit(Exit.OK);
378 
379         checkOutput("m/module-summary.html", true,
380                 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" +
381                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
382                 "<tr>\n" +
383                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
384                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
385                 "</tr>\n" +
386                 "<tbody>\n" +
387                 "<tr class=\"altColor\">\n" +
388                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
389                 "<td class=\"colLast\">&nbsp;<br>(<span class=\"implementationLabel\">Implementation(s):</span>&nbsp;<a href=\"p1/B.html\" title=\"class in p1\">B</a>)</td>\n" +
390                 "</tr>\n" +
391                 "<tr class=\"rowColor\">\n" +
392                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/A.html\" title=\"interface in p2\">A</a></th>\n" +
393                 "<td class=\"colLast\">&nbsp;<br>(<span class=\"implementationLabel\">Implementation(s):</span>&nbsp;<a href=\"p2/B.html\" title=\"class in p2\">B</a>)</td>\n" +
394                 "</tr>\n" +
395                 "</tbody>\n");
396     }
397 
398     @Test
checkProvidesWithApiTagModuleModeDefault(Path base)399     public void checkProvidesWithApiTagModuleModeDefault(Path base) throws Exception {
400         ModuleBuilder mb = new ModuleBuilder(tb, "m")
401                 .comment("module m.\n@provides p1.A abc")
402                 .provides("p1.A", "p1.B")
403                 .exports("p1")
404                 .classes("package p1; public interface A {}")
405                 .classes("package p1; public class B implements A {}")
406                 .provides("p2.A", "p2.B")
407                 .exports("p2")
408                 .classes("package p2; public interface A {}")
409                 .classes("package p2; public class B implements A {}");
410         mb.write(base);
411 
412         javadoc("-d", base.toString() + "/out",
413                 "-quiet",
414                 "--module-source-path", base.toString(),
415                 "--module", "m");
416 
417         checkExit(Exit.OK);
418 
419         checkOutput("m/module-summary.html", true,
420                 "<h3>Services</h3>");
421 
422         checkOutput("m/module-summary.html", true,
423                 "<table class=\"providesSummary\">\n" +
424                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
425                 "<tr>\n" +
426                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
427                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
428                 "</tr>\n" +
429                 "<tbody>\n" +
430                 "<tr class=\"altColor\">\n" +
431                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
432                 "<td class=\"colLast\">\n" +
433                 "<div class=\"block\">abc</div>\n</td>\n" +
434                 "</tr>\n" +
435                 "</tbody>\n" +
436                 "</table>\n");
437 
438         javadoc("-d", base.toString() + "/out-html4",
439                 "-html4",
440                 "-quiet",
441                 "--module-source-path", base.toString(),
442                 "--module", "m");
443 
444         checkExit(Exit.OK);
445 
446         checkOutput("m/module-summary.html", true,
447                 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" +
448                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
449                 "<tr>\n" +
450                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
451                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
452                 "</tr>\n" +
453                 "<tbody>\n" +
454                 "<tr class=\"altColor\">\n" +
455                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
456                 "<td class=\"colLast\">\n" +
457                 "<div class=\"block\">abc</div>\n</td>\n" +
458                 "</tr>\n" +
459                 "</tbody>\n" +
460                 "</table>\n");
461     }
462 
463     @Test
checkUsesProvidesWithApiTagsModeDefault(Path base)464     public void checkUsesProvidesWithApiTagsModeDefault(Path base) throws Exception {
465         ModuleBuilder mb = new ModuleBuilder(tb, "m")
466                 .comment("module m.\n@provides p1.A abc\n@uses p2.B def")
467                 .provides("p1.A", "p1.B")
468                 .exports("p1")
469                 .classes("package p1; public interface A {}")
470                 .classes("package p1; public class B implements A {}")
471                 .provides("p2.A", "p2.B")
472                 .uses("p2.B")
473                 .exports("p2")
474                 .classes("package p2; public interface A {}")
475                 .classes("package p2; public class B implements A {}");
476         mb.write(base);
477 
478         javadoc("-d", base.toString() + "/out",
479                 "-quiet",
480                 "--module-source-path", base.toString(),
481                 "--module", "m");
482 
483         checkExit(Exit.OK);
484 
485         checkOutput("m/module-summary.html", true,
486                 "<h3>Services</h3>");
487 
488         checkOutput("m/module-summary.html", true,
489                 "<table class=\"providesSummary\">\n" +
490                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
491                 "<tr>\n" +
492                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
493                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
494                 "</tr>\n" +
495                 "<tbody>\n" +
496                 "<tr class=\"altColor\">\n" +
497                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
498                 "<td class=\"colLast\">\n" +
499                 "<div class=\"block\">abc</div>\n</td>\n" +
500                 "</tr>\n" +
501                 "</tbody>\n" +
502                 "</table>",
503                 "<table class=\"usesSummary\">\n" +
504                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
505                 "<tr>\n" +
506                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
507                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
508                 "</tr>\n" +
509                 "<tbody>\n" +
510                 "<tr class=\"altColor\">\n" +
511                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/B.html\" title=\"class in p2\">B</a></th>\n" +
512                 "<td class=\"colLast\">\n" +
513                 "<div class=\"block\">def</div>\n</td>\n" +
514                 "</tr>\n" +
515                 "</tbody>\n" +
516                 "</table>\n");
517 
518         javadoc("-d", base.toString() + "/out-html4",
519                 "-html4",
520                 "-quiet",
521                 "--module-source-path", base.toString(),
522                 "--module", "m");
523 
524         checkExit(Exit.OK);
525 
526         checkOutput("m/module-summary.html", true,
527                 "<table class=\"providesSummary\" summary=\"Provides table, listing types, and an explanation\">\n" +
528                 "<caption><span>Provides</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
529                 "<tr>\n" +
530                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
531                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
532                 "</tr>\n" +
533                 "<tbody>\n" +
534                 "<tr class=\"altColor\">\n" +
535                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p1/A.html\" title=\"interface in p1\">A</a></th>\n" +
536                 "<td class=\"colLast\">\n" +
537                 "<div class=\"block\">abc</div>\n</td>\n" +
538                 "</tr>\n" +
539                 "</tbody>\n" +
540                 "</table>",
541                 "<table class=\"usesSummary\" summary=\"Uses table, listing types, and an explanation\">\n" +
542                 "<caption><span>Uses</span><span class=\"tabEnd\">&nbsp;</span></caption>\n" +
543                 "<tr>\n" +
544                 "<th class=\"colFirst\" scope=\"col\">Type</th>\n" +
545                 "<th class=\"colLast\" scope=\"col\">Description</th>\n" +
546                 "</tr>\n" +
547                 "<tbody>\n" +
548                 "<tr class=\"altColor\">\n" +
549                 "<th class=\"colFirst\" scope=\"row\"><a href=\"p2/B.html\" title=\"class in p2\">B</a></th>\n" +
550                 "<td class=\"colLast\">\n" +
551                 "<div class=\"block\">def</div>\n</td>\n" +
552                 "</tr>\n" +
553                 "</tbody>\n" +
554                 "</table>\n");
555     }
556 
557 }
558