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.
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 /* @test
25  * @bug 8200530
26  * @summary Test Attributes newline
27  */
28 
29 import java.util.jar.Manifest;
30 import java.util.jar.Attributes;
31 import java.util.jar.Attributes.Name;
32 import java.io.ByteArrayInputStream;
33 import java.util.Map;
34 
35 import static java.nio.charset.StandardCharsets.UTF_8;
36 
37 public class TestAttrsNL {
38 
main(String[] args)39     public static void main(String[] args) throws Throwable {
40 
41         String manifestStr =
42             "Manifest-Version: 1.0\r\n" +
43             "Created-By: 11 (Oracle Corporation)\r\n" +
44             "key1: value1\r\n" +
45             "key2: value2\r\n END\r\n" +
46             "key3: value3\r\n \r\n" +
47             "key4: value4\r\n" +
48             "\r\n\r\n" +
49             "Name: Hello\r\n" +
50             "key11: value11\r\n" +
51             "key22: value22\r\n END\r\n" +
52             "key33: value33\r\n \r\n" +
53             "key44: value44\r\n";
54 
55         Map<Name, String> mainAttrsExped = Map.of(
56                 new Name("Manifest-Version"), "1.0",
57                 new Name("Created-By"), "11 (Oracle Corporation)",
58                 new Name("key1"), "value1",
59                 new Name("key2"), "value2END",
60                 new Name("key3"), "value3",
61                 new Name("key4"), "value4"
62         );
63 
64         Map<Name, String> attrsExped = Map.of(
65                 new Name("key11"), "value11",
66                 new Name("key22"), "value22END",
67                 new Name("key33"), "value33",
68                 new Name("key44"), "value44"
69         );
70 
71         test(new Manifest(new ByteArrayInputStream(manifestStr.getBytes(UTF_8))),
72              mainAttrsExped, attrsExped);
73 
74         test(new Manifest(new ByteArrayInputStream(
75                     manifestStr.replaceAll("\r\n", "\r").getBytes(UTF_8))),
76              mainAttrsExped, attrsExped);
77 
78         test(new Manifest(new ByteArrayInputStream(
79                     manifestStr.replaceAll("\r\n", "\n").getBytes(UTF_8))),
80              mainAttrsExped, attrsExped);
81 
82         // mixed
83         manifestStr =
84             "Manifest-Version: 1.0\r\n" +
85             "Created-By: 11 (Oracle Corporation)\n" +
86             "key1: value1\r" +
87             "key2: value2\r\n END\r" +
88             "key3: value3\n \r\n" +
89             "key4: value4\r" +
90             "\r\n\n" +
91             "Name: Hello\r\n" +
92             "key11: value11\r" +
93             "key22: value22\n END\r\n" +
94             "key33: value33\r \n" +
95             "key44: value44\n";
96         test(new Manifest(new ByteArrayInputStream(manifestStr.getBytes(UTF_8))),
97              mainAttrsExped, attrsExped);
98 
99 
100     }
101 
test(Manifest m, Map<Name, String> mainAttrsExped, Map<Name, String> attrsExped)102     private static void test(Manifest m,
103                              Map<Name, String> mainAttrsExped,
104                              Map<Name, String> attrsExped) {
105         Attributes mainAttrs = m.getMainAttributes();
106         mainAttrsExped.forEach( (k, v) -> {
107             if (!mainAttrs.containsKey(k) || !mainAttrs.get(k).equals(v)) {
108                 System.out.printf(" containsKey(%s) : %b%n", k, mainAttrs.containsKey(k));
109                 System.out.printf("         get(%s) : %s%n", k, mainAttrs.get(k));
110                 throw new RuntimeException("expected attr: k=<" + k + ">, v=<" + v + ">");
111             }
112         });
113 
114         Attributes attrs = m.getAttributes("Hello");
115         attrs.forEach( (k, v) -> {
116             if (!attrs.containsKey(k) || !attrs.get(k).equals(v)) {
117                 System.out.printf(" containsKey(%s) : %b%n", k, attrs.containsKey(k));
118                 System.out.printf("         get(%s) : %s%n", k, attrs.get(k));
119                 throw new RuntimeException("expected attr: k=<" + k + ">, v=<" + v + ">");
120             }
121         });
122     }
123 }
124