/******************************************************************************* * Copyright (c) 2007, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.debug.tests.launching; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Preferences; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jdt.debug.tests.AbstractDebugTest; /** * Tests for the new capability of getting the file encoding for a launch configuration given a variety of * scenarios * @since 3.4 */ @SuppressWarnings("deprecation") public class ConfigurationEncodingTests extends AbstractDebugTest { /** * Constructor * @param name */ public ConfigurationEncodingTests(String name) { super(name); } /** * convenience method to the the preference store for the <code>ResourcesPlugin</code> */ protected Preferences getResourcesPreferences() { return ResourcesPlugin.getPlugin().getPluginPreferences(); } /** * Returns the default workbench encoding * @return the default workbench encoding */ protected String getDefaultEncoding() { return getResourcesPreferences().getDefaultString(ResourcesPlugin.PREF_ENCODING); } /** * Tests that if no encoding is set on the configuration and there is no encoding changes to the workspace pref * than the encoding retrieved for the configuration matches the system encoding */ public void testGetSystemDefaultEncoding() throws CoreException { String oldencoding = ResourcesPlugin.getEncoding(); String oldsystemencoding = System.getProperty("file.encoding"); try { getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, getDefaultEncoding()); System.setProperty("file.encoding", "UTF-16BE"); ILaunchConfiguration config = getLaunchConfiguration("LaunchHistoryTest"); assertTrue("the configuration could not be found", config != null); assertTrue("there should be no encoding set on the configuration", config.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null) == null); String encoding = getLaunchManager().getEncoding(config); assertTrue("The configuration encoding should not be null", encoding != null); assertTrue("The configuration encoding should match the file system encoding", encoding.equals(System.getProperty("file.encoding"))); } finally { //ensure old encoding is restored getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding)); System.setProperty("file.encoding", oldsystemencoding); } } /** * Tests that if a specific encoding is set for the workspace and there is no encoding set on the configuration * than the returned encoding matches the workspace pref */ public void testGetSpecificWorkbenchEncoding() throws CoreException { String oldencoding = ResourcesPlugin.getEncoding(); try { getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, "UTF-16"); ILaunchConfiguration config = getLaunchConfiguration("LaunchHistoryTest"); assertTrue("the configuration could not be found", config != null); assertTrue("there should be no encoding set on the configuration", config.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null) == null); String encoding = getLaunchManager().getEncoding(config); assertTrue("The configuration encoding should not be null", encoding != null); assertTrue("The configuration encoding should match the workbench preference system encoding", encoding.equals("UTF-16")); } finally { //ensure old encoding is restored getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding)); } } /** * Tests that if a specific encoding is set on the configuration itself that that is the encoding returned */ public void testGetSpecificConfigurationEncoding() throws CoreException { String oldencoding = ResourcesPlugin.getEncoding(); ILaunchConfiguration config = getLaunchConfiguration("LaunchHistoryTest"); assertTrue("the configuration could not be found", config != null); IResource[] oldmapped = config.getMappedResources(); ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy(); try { getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, getDefaultEncoding()); copy.setAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, "UTF-16"); copy.doSave(); assertTrue("there should be an encoding set on the configuration", config.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null) != null); String encoding = getLaunchManager().getEncoding(config); assertTrue("The configuration encoding should not be null", encoding != null); assertTrue("The configuration encoding should match the file system encoding", encoding.equals("UTF-16")); copy.setAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null); copy.setMappedResources(null); copy.doSave(); } finally { //ensure old encoding is restored getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding)); //ensure old resource mappings are restored copy.setMappedResources(oldmapped); copy.doSave(); } } /** * Tests that if there is no specified encoding for the config itself, and there is a mapped resource, * the encoding will come from the mapped resource (if a specific one is set) */ public void testGetSpecificResourceEncoding() throws CoreException { String oldencoding = ResourcesPlugin.getEncoding(); ILaunchConfiguration config = getLaunchConfiguration("LaunchHistoryTest"); assertTrue("the configuration could not be found", config != null); assertTrue("there should be no encoding set on the configuration", config.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null) == null); IResource[] oldmapped = config.getMappedResources(); ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy(); try { getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, "UTF-16LE"); IFile res = (IFile) getResource("MigrationTests.java"); assertTrue("the resource MigrationTests.java should not be null", res != null); copy.setMappedResources(new IResource[] {res}); copy.doSave(); res.setCharset("UTF-8", null); String encoding = getLaunchManager().getEncoding(config); assertTrue("The configuration encoding should not be null", encoding != null); assertTrue("The configuration encoding should match the file system encoding", encoding.equals(res.getCharset())); } finally { //ensure old encoding is restored getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding)); //ensure old mapped resource is restored copy.setMappedResources(oldmapped); copy.doSave(); } } /** * Tests that if there is no specific encoding set on the config and there is more than one mapped resource, * the first mapped resource is used to derive the encoding */ public void testGetSpecificResourcesEncoding() throws CoreException { String oldencoding = ResourcesPlugin.getEncoding(); IFile res = (IFile) getResource("MigrationTests.java"), res2 = (IFile) getResource("MigrationTests2.java"); String resCharset = res.getCharset(); String res2Charset = res2.getCharset(); ILaunchConfiguration config = getLaunchConfiguration("LaunchHistoryTest"); assertTrue("the configuration could not be found", config != null); assertTrue("there should be no encoding set on the configuration", config.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null) == null); IResource[] oldmapped = config.getMappedResources(); ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy(); try { getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, "UTF-16LE"); assertTrue("the resource MigrationTests.java should not be null", res != null); assertTrue("the resource MigrationTests2.java should not be null", res2 != null); copy.setMappedResources(new IResource[] {res, res2}); copy.doSave(); res.setCharset("UTF-16BE", null); res2.setCharset("UTF-8", null); String encoding = getLaunchManager().getEncoding(config); assertTrue("The configuration encoding should not be null", encoding != null); assertTrue("The configuration encoding should match the file system encoding", encoding.equals(res.getCharset())); copy.setMappedResources(null); copy.doSave(); } finally { //ensure old encoding is restored getResourcesPreferences().setValue(ResourcesPlugin.PREF_ENCODING, (oldencoding == null ? getDefaultEncoding() : oldencoding)); res.setCharset(resCharset, null); res2.setCharset(res2Charset, null); //ensure old mapping is restored copy.setMappedResources(oldmapped); copy.doSave(); } } }