/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.compiler; import io.cloudslang.lang.entities.SlangSystemPropertyConstant; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class SlangSourceTest { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Rule public ExpectedException exception = ExpectedException.none(); private static final String content = "file_content"; private static final Extension extension = Extension.SL; private static final String nameWithoutExtension = "file_name"; private static final String name = nameWithoutExtension + FilenameUtils.EXTENSION_SEPARATOR_STR + extension.getValue(); private void assertSourceEquals(String nameSuffix, Extension expectedExtension) throws IOException { String name = nameWithoutExtension + nameSuffix; File file = folder.newFile(name); FileUtils.writeStringToFile(file, content); SlangSource source = SlangSource.fromFile(file); Assert.assertEquals(content, source.getContent()); Assert.assertEquals(name, source.getName()); Assert.assertEquals(expectedExtension, source.getFileExtension()); Assert.assertTrue(source.getFilePath().endsWith(name)); } private void assertSourceEquals(URI fileUri, Extension expectedExtension) throws IOException { SlangSource source = SlangSource.fromFile(fileUri); Assert.assertEquals(content, source.getContent()); Assert.assertEquals(name, source.getName()); Assert.assertEquals(expectedExtension, source.getFileExtension()); Assert.assertTrue(source.getFilePath().endsWith(name)); } private void assertSourceEquals(byte[] bytes, String name) throws IOException { SlangSource source = SlangSource.fromBytes(bytes, name); Assert.assertEquals(content, source.getContent()); Assert.assertEquals(name, source.getName()); } @Test public void testFromFileYamlSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YAML.getValue() + "." + Extension.SL.getValue(), Extension.SL); } @Test public void testFromFileYamlYmlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YAML.getValue() + "." + Extension.YML.getValue(), Extension.YML); } @Test public void testFromFileYmlSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YML.getValue() + "." + Extension.SL.getValue(), Extension.SL); } @Test public void testFromFileYmlSlYamlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YML.getValue() + "." + Extension.SL_YAML.getValue(), Extension.SL_YAML); } @Test public void testFromFileYmlSlYmlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YML.getValue() + "." + Extension.SL_YML.getValue(), Extension.SL_YML); } @Test public void testFromFileSlPropSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.SL.getValue() + "." + Extension.PROP_SL.getValue(), Extension.PROP_SL); } @Test public void testFromFilePropSlSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.PROP_SL.getValue() + "." + Extension.SL.getValue(), Extension.SL); } @Test public void testFromFileSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.SL.getValue(), Extension.SL); } @Test public void testFromFileSlYamlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.SL_YAML.getValue(), Extension.SL_YAML); } @Test public void testFromFileSlYmlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.SL_YML.getValue(), Extension.SL_YML); } @Test public void testFromFilePropSlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.PROP_SL.getValue(), Extension.PROP_SL); } @Test public void testFromFileYamlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YAML.getValue(), Extension.YAML); } @Test public void testFromFileYmlExtension() throws Exception { assertSourceEquals(nameWithoutExtension + "." + Extension.YML.getValue(), Extension.YML); } @Test public void testWhenPassingDirectoryShouldThrowException() throws Exception { File tempFolder = folder.newFolder(); exception.expect(IllegalArgumentException.class); exception.expectMessage("directories"); exception.expectMessage(tempFolder.getName()); SlangSource.fromFile(tempFolder); } @Test public void testWhenThereIsProblemReadingTheFileThrowException() throws Exception { File file = mock(File.class); when(file.getName()).thenReturn(name); when(file.isFile()).thenReturn(true); when(file.getPath()).thenThrow((Class) IOException.class); exception.expect(RuntimeException.class); exception.expectMessage("reading"); exception.expectMessage(file.getName()); SlangSource.fromFile(file); } @Test public void testWhenPassingNullFileThrowException() throws Exception { exception.expect(NullPointerException.class); exception.expectMessage("null"); SlangSource.fromFile((File) null); } @Test public void testFromFileUri() throws Exception { File file = folder.newFile(name); FileUtils.writeStringToFile(file, content); assertSourceEquals(file.toURI(), extension); } @Test public void testFromFileUnicode() throws Exception { // In this scenario, the source file is encoded using the default encoding (UTF-8) final String sourceString = "ÈûÜ噂閏없다哱嘰ЕеЖ lœuvre àît André Citroën"; final String filename = name + "_utf8"; File file = folder.newFile(filename); FileUtils.writeStringToFile(file, sourceString, "UTF-8"); // Make sure UTF-8 is the default encoding for reading Slang sources SlangSource result = SlangSource.fromFile(file); Assert.assertEquals(sourceString, result.getContent()); Assert.assertEquals(filename, result.getName()); } @Test public void testFromFileOverrideEncoding() throws Exception { // In this scenario, the source file is encoded using a single-byte Western European encoding // (instead of UTF-8) final String sourceString = "André Citroën"; final String filename = name + "_fr"; File file = folder.newFile(filename); FileUtils.writeStringToFile(file, sourceString, "ISO-8859-1"); // Make sure we can override the default encoding (UTF-8) with a system property System.setProperty("cslang.encoding", "ISO-8859-1"); SlangSource result = SlangSource.fromFile(file); System.clearProperty("cslang.encoding"); Assert.assertEquals(sourceString, result.getContent()); Assert.assertEquals(filename, result.getName()); } @Test public void testFromBytes() throws Exception { assertSourceEquals(content.getBytes(getCharset()), name); } @Test public void testFromBytesUnicode() throws Exception { // In this scenario, the source file is encoded using the default encoding (UTF-8) final String sourceString = "ÈûÜ噂閏없다哱嘰ЕеЖ lœuvre àît André Citroën"; final byte[] sourceFile = sourceString.getBytes("UTF-8"); // Make sure UTF-8 is the default encoding for reading Slang sources SlangSource result = SlangSource.fromBytes(sourceFile, name); Assert.assertEquals(sourceString, result.getContent()); Assert.assertEquals(name, result.getName()); } @Test public void testFromBytesOverrideEncoding() throws Exception { // In this scenario, the source file is encoded using a single-byte Western European encoding // (instead of UTF-8) final String sourceString = "André Citroën"; final byte[] sourceFile = sourceString.getBytes("ISO-8859-1"); // Make sure we can override the default encoding (UTF-8) with a system property System.setProperty("cslang.encoding", "ISO-8859-1"); SlangSource result = SlangSource.fromBytes(sourceFile, name); System.clearProperty("cslang.encoding"); Assert.assertEquals(sourceString, result.getContent()); Assert.assertEquals(name, result.getName()); } @Test public void testFromBytesWithExtension() throws Exception { String name = SlangSourceTest.name + "." + Extension.SL.getValue(); assertSourceEquals(content.getBytes(getCharset()), name); } private Charset getCharset() { String cslangEncoding = System.getProperty(SlangSystemPropertyConstant.CSLANG_ENCODING.getValue()); return StringUtils.isEmpty(cslangEncoding) ? StandardCharsets.UTF_8 : Charset.forName(cslangEncoding); } }