1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.lang;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayOutputStream;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.PrintStream;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Map;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Properties;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SystemTest extends junit.framework.TestCase {
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static boolean flag = false;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static boolean ranFinalize = false;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#setIn(java.io.InputStream)
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setInLjava_io_InputStream() {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		InputStream orgIn = System.in;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		InputStream in = new ByteArrayInputStream(new byte[0]);
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setIn(in);
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("in not set", System.in == in);
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setIn(orgIn);
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#setOut(java.io.PrintStream)
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setOutLjava_io_PrintStream() {
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		PrintStream orgOut = System.out;
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		PrintStream out = new PrintStream(new ByteArrayOutputStream());
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setOut(out);
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("out not set", System.out == out);
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setOut(orgOut);
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#setErr(java.io.PrintStream)
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setErrLjava_io_PrintStream() {
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		PrintStream orgErr = System.err;
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		PrintStream err = new PrintStream(new ByteArrayOutputStream());
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setErr(err);
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("err not set", System.err == err);
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setErr(orgErr);
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#arraycopy(java.lang.Object, int,
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 *        java.lang.Object, int, int)
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_arraycopyLjava_lang_ObjectILjava_lang_ObjectII() {
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.System.arraycopy(java.lang.Object,
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// int, java.lang.Object, int, int)
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Integer a[] = new Integer[20];
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Integer b[] = new Integer[20];
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int i = 0;
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		while (i < a.length) {
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			a[i] = new Integer(i);
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			++i;
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.arraycopy(a, 0, b, 0, a.length);
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (i = 0; i < a.length; i++)
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue("Copied elements incorrectly", a[i].equals(b[i]));
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		/* Non primitive array types don't need to be identical */
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String[] source1 = new String[] { "element1" };
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Object[] dest1 = new Object[1];
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.arraycopy(source1, 0, dest1, 0, dest1.length);
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Invalid copy 1", dest1[0] == source1[0]);
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		char[][] source = new char[][] { { 'H', 'e', 'l', 'l', 'o' },
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				{ 'W', 'o', 'r', 'l', 'd' } };
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		char[][] dest = new char[2][];
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.arraycopy(source, 0, dest, 0, dest.length);
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Invalid copy 2", dest[0] == source[0]
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				&& dest[1] == source[1]);
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#currentTimeMillis()
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_currentTimeMillis() {
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method long java.lang.System.currentTimeMillis()
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                long firstRead = System.currentTimeMillis();
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        Thread.sleep(150);
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (InterruptedException e) {
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                long secondRead = System.currentTimeMillis();
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue("Incorrect times returned: " + firstRead + ", "
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + secondRead, firstRead < secondRead);
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#exit(int)
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_exitI() {
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.System.exit(int)
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Tested in destructive test: Test_System_Exit ???
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#getProperties()
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getProperties() {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.util.Properties java.lang.System.getProperties()
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Properties p = System.getProperties();
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Ensure spec'ed properties are non-null. See System.getProperties()
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// spec.
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String[] props = { "java.version", "java.vendor", "java.vendor.url",
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.home", "java.vm.specification.version",
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.vm.specification.vendor", "java.vm.specification.name",
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.vm.version", "java.vm.vendor", "java.vm.name",
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.specification.name", "java.specification.vendor",
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.specification.name", "java.class.version",
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"java.class.path", "java.ext.dirs", "os.name", "os.arch",
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"os.version", "file.separator", "path.separator",
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"line.separator", "user.name", "user.home", "user.dir", };
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (int i = 0; i < props.length; i++) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertNotNull(props[i], System.getProperty(props[i]));
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#getProperty(java.lang.String)
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getPropertyLjava_lang_String() {
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.String
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.getProperty(java.lang.String)
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean is8859_1 = true;
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String encoding = System.getProperty("file.encoding");
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] bytes = new byte[128];
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		char[] chars = new char[128];
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (int i = 0; i < bytes.length; i++) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			bytes[i] = (byte) (i + 128);
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			chars[i] = (char) (i + 128);
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String charResult = new String(bytes);
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] byteResult = new String(chars).getBytes();
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (charResult.length() == 128 && byteResult.length == 128) {
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			for (int i = 0; i < bytes.length; i++) {
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				if (charResult.charAt(i) != (char) (i + 128)
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes						|| byteResult[i] != (byte) (i + 128))
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					is8859_1 = false;
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} else
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			is8859_1 = false;
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String[] possibles = new String[] { "ISO8859_1", "8859_1", "ISO8859-1",
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"ISO-8859-1", "ISO_8859-1", "ISO_8859-1:1978", "ISO-IR-100",
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"LATIN1", "CSISOLATIN1" };
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean found8859_1 = false;
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (int i = 0; i < possibles.length; i++) {
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (possibles[i].equals(encoding)) {
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				found8859_1 = true;
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				break;
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Wrong encoding: " + encoding, !is8859_1 || found8859_1);
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.lang.System#getProperty(java.lang.String)
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Tests that there are no extra path separator in boot class path.
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression test for HARMONY-3298
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getProperty_bootClassPath() {
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String bootClassPath = System.getProperty("org.apache.harmony.boot.class.path");
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (bootClassPath == null) {
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bootClassPath = System.getProperty("sun.boot.class.path");
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (bootClassPath != null
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                && (bootClassPath.indexOf(File.pathSeparator + File.pathSeparator) >= 0)) {
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Boot class path contains extra path separator: " + bootClassPath);
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#getProperty(java.lang.String, java.lang.String)
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getPropertyLjava_lang_StringLjava_lang_String() {
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.String
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.getProperty(java.lang.String, java.lang.String)
2072a68e06b23ceb5b401d5bc784e6882e71c662caeElliott Hughes		assertTrue(!System.getProperty("java.version", "99999").equals("99999"));
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals("Failed to return correct property value", "bogus", System
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.getProperty("bogus.prop", "bogus"));
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#setProperty(java.lang.String, java.lang.String)
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setPropertyLjava_lang_StringLjava_lang_String() {
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.String
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.setProperty(java.lang.String, java.lang.String)
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertNull("Failed to return null", System.setProperty("testing",
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"value1"));
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to return old value", System.setProperty("testing",
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				"value2") == "value1");
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to find value",
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				System.getProperty("testing") == "value2");
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean exception = false;
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.setProperty("", "default");
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			exception = true;
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Expected IllegalArgumentException", exception);
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#getSecurityManager()
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_getSecurityManager() {
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method java.lang.SecurityManager
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.getSecurityManager()
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertNull("Returned incorrect SecurityManager", System
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.getSecurityManager());
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#identityHashCode(java.lang.Object)
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_identityHashCodeLjava_lang_Object() {
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method int
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.identityHashCode(java.lang.Object)
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Object o = new Object();
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		String s = "Gabba";
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals("Nonzero returned for null",
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				0, System.identityHashCode(null));
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Nonequal has returned for Object", System
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.identityHashCode(o) == o.hashCode());
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Same as usual hash returned for String", System
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.identityHashCode(s) != s.hashCode());
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#runFinalization()
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_runFinalization() {
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void java.lang.System.runFinalization()
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		flag = true;
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		createInstance();
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int count = 10;
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// the gc below likely bogosifies the test, but will have to do for
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// the moment
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		while (!ranFinalize && count-- > 0) {
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.gc();
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.runFinalization();
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue("Failed to run finalization", ranFinalize);
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#runFinalizersOnExit(boolean)
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@SuppressWarnings("deprecation")
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_runFinalizersOnExitZ() {
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Can we call the method at least?
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.runFinalizersOnExit(false);
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @tests java.lang.System#setProperties(java.util.Properties)
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_setPropertiesLjava_util_Properties() {
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Test for method void
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// java.lang.System.setProperties(java.util.Properties)
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Properties orgProps = System.getProperties();
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		java.util.Properties tProps = new java.util.Properties();
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tProps.put("test.prop", "this is a test property");
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		tProps.put("bogus.prop", "bogus");
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.setProperties(tProps);
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertEquals("Failed to set properties", "this is a test property", System.getProperties()
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					.getProperty("test.prop"));
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} finally {
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// restore the original properties
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.setProperties(orgProps);
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //Regression Test for Harmony-2356
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEnvUnmodifiable() {
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map map = System.getenv();
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.containsKey(null);
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerExcepiton.");
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.containsKey(new Integer(10));
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ClassCastException.");
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassCastException e) {
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.containsValue(null);
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerExcepiton.");
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.containsValue(new Integer(10));
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ClassCastException.");
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassCastException e) {
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.get(null);
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw NullPointerExcepiton.");
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.get(new Integer(10));
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw ClassCastException.");
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassCastException e) {
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.put(null, "AAA");
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationExcepiton.");
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.put("AAA", new Integer(10));
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException.");
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.put("AAA", "BBB");
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException.");
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.clear();
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOperationException.");
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            map.remove(null);
3842a68e06b23ceb5b401d5bc784e6882e71c662caeElliott Hughes            // Android isn't as strict about requiring this exception; no modification takes place anyway
3852a68e06b23ceb5b401d5bc784e6882e71c662caeElliott Hughes            // fail("Should throw UnsupportedOperationException.");
3862a68e06b23ceb5b401d5bc784e6882e71c662caeElliott Hughes        } catch (UnsupportedOperationException expected) {
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@Override
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() {
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		flag = false;
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ranFinalize = false;
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected SystemTest createInstance() {
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return new SystemTest("FT");
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@Override
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void finalize() {
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (flag)
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ranFinalize = true;
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public SystemTest() {
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public SystemTest(String name) {
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		super(name);
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
414