/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.test.utiltests;
import android.os.Environment;
import android.test.InstrumentationTestCase;
import android.util.Log;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.content.Project;
import org.catrobat.catroid.content.SingleSprite;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.io.StorageHandler;
import org.catrobat.catroid.test.utils.TestUtils;
import org.catrobat.catroid.utils.UtilFile;
import org.catrobat.catroid.utils.Utils;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;
public class UtilFileTest extends InstrumentationTestCase {
private static final String TAG = UtilFileTest.class.getSimpleName();
private static final String CATROID_DIRECTORY = Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/Pocket Code";
private File testDirectory;
private File subDirectory;
private File file1;
private File file2;
private String projectName = "project1";
@Override
protected void setUp() throws Exception {
super.setUp();
UtilFile.deleteDirectory(new File(CATROID_DIRECTORY + "/testDirectory"));
TestUtils.deleteTestProjects(projectName);
testDirectory = new File(CATROID_DIRECTORY + "/testDirectory");
testDirectory.mkdir();
file1 = new File(testDirectory.getAbsolutePath() + "/file1");
file1.createNewFile();
subDirectory = new File(testDirectory.getAbsolutePath() + "/subDirectory");
subDirectory.mkdir();
file2 = new File(subDirectory.getAbsolutePath() + "/file2");
file2.createNewFile();
}
@Override
protected void tearDown() throws Exception {
UtilFile.deleteDirectory(testDirectory);
TestUtils.deleteTestProjects(projectName);
super.tearDown();
}
public void testDeleteDirectory() {
UtilFile.deleteDirectory(testDirectory);
assertFalse("File in subdirectory still exists after call to deleteDirectory", file2.exists());
assertFalse("Subdirectory in test directory still exists after call to deleteDirectory", subDirectory.exists());
assertFalse("File in test directory still exists after call to deleteDirectory", file1.exists());
assertFalse("Test directory still exists after call to deleteDirectory", testDirectory.exists());
}
public void testFileSize() throws IOException {
for (int i = 0; i < 2; i++) {
UtilFile.saveFileToProject("testDirectory", "testScene", i + "testsound.mp3",
org.catrobat.catroid.test.R.raw.longtestsound, getInstrumentation().getContext(),
UtilFile.FileType.TYPE_SOUND_FILE);
}
double expectedSizeInKilobytes = 84.2;
assertEquals("Unexpected file size String", String.format(Locale.getDefault(), "%.1f KB", expectedSizeInKilobytes),
UtilFile.getSizeAsString(testDirectory));
for (int i = 2; i < 48; i++) {
UtilFile.saveFileToProject("testDirectory", "testScene", i + "testsound.mp3",
org.catrobat.catroid.test.R.raw.longtestsound, getInstrumentation().getContext(),
UtilFile.FileType.TYPE_SOUND_FILE);
}
DecimalFormat decimalFormat = new DecimalFormat("#.0");
String expected = decimalFormat.format(2.0) + " MB";
assertEquals("Unexpected file size String", expected, UtilFile.getSizeAsString(testDirectory));
PrintWriter printWriter = null;
File testFile = new File(Utils.buildPath(testDirectory.getAbsolutePath(), "catroid.txt"));
try {
testFile.createNewFile();
printWriter = new PrintWriter(testFile);
printWriter.print("catroid");
} catch (IOException e) {
Log.e(TAG, "File handling error", e);
} finally {
if (printWriter != null) {
printWriter.close();
}
}
assertEquals("Unexpected Filesize!", "7 Byte", UtilFile.getSizeAsString(testFile));
UtilFile.deleteDirectory(testDirectory);
}
public void testGetProjectNames() {
Project project = new Project(null, projectName);
ProjectManager.getInstance().setProject(project);
Sprite sprite = new SingleSprite("new sprite");
project.getDefaultScene().addSprite(sprite);
StorageHandler.getInstance().saveProject(project);
File catroidDirectoryFile = new File(CATROID_DIRECTORY);
File project1Directory = new File(catroidDirectoryFile + "/" + projectName);
List<String> projectList = UtilFile.getProjectNames(catroidDirectoryFile);
assertTrue("project1 should be in Projectlist - is a valid Catroid project",
projectList.contains(project1Directory.getName()));
assertFalse("testDirectory should not be in Projectlist - not a Catroid project",
projectList.contains(testDirectory.getName()));
}
public void testEncodeAndDecodeSpecialCharsForFileSystem() {
String projectName1 = ".*\"/:<>?\\|%";
String projectName1Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName1);
assertEquals("String projectName1 encoded not equal!", ".%2A%22%2F%3A%3C%3E%3F%5C%7C%25", projectName1Encoded);
assertEquals("String projectName1 decoded not equal!", projectName1, UtilFile.decodeSpecialCharsForFileSystem(projectName1Encoded));
String projectName2 = "../*\"/:<>?\\|";
String projectName2Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName2);
assertEquals("String projectName2 encoded not equal!", "..%2F%2A%22%2F%3A%3C%3E%3F%5C%7C", projectName2Encoded);
assertEquals("String projectName2 decoded not equal!", projectName2, UtilFile.decodeSpecialCharsForFileSystem(projectName2Encoded));
String projectName3 = "./*T?E\"S/T:T<E>S?T\\T\\E|S%";
String projectName3Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName3);
assertEquals("String projectName3 encoded not equal!", ".%2F%2AT%3FE%22S%2FT%3AT%3CE%3ES%3FT%5CT%5CE%7CS%25", projectName3Encoded);
assertEquals("String projectName3 decoded not equal!", projectName3, UtilFile.decodeSpecialCharsForFileSystem(projectName3Encoded));
String projectName4 = ".";
String projectName4Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName4);
assertEquals("String projectName4 encoded not equal!", "%2E", projectName4Encoded);
assertEquals("String projectName4 decoded not equal!", projectName4, UtilFile.decodeSpecialCharsForFileSystem(projectName4Encoded));
String projectName5 = "..";
String projectName5Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName5);
assertEquals("String projectName5 encoded not equal!", "%2E%2E", projectName5Encoded);
assertEquals("String projectName5 decoded not equal!", projectName5, UtilFile.decodeSpecialCharsForFileSystem(projectName5Encoded));
String projectName6 = "../*T?E\"S/T:%22T<E>S?T\\T\\E|S%äö|üß";
String projectName6Encoded = UtilFile.encodeSpecialCharsForFileSystem(projectName6);
assertEquals("String projectName6 encoded not equal!", "..%2F%2AT%3FE%22S%2FT%3A%2522T%3CE%3ES%3FT%5CT%5CE%7CS%25äö%7Cüß", projectName6Encoded);
assertEquals("String projectName6 decoded not equal!", projectName6, UtilFile.decodeSpecialCharsForFileSystem(projectName6Encoded));
}
}