// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.server; import com.google.appinventor.common.testutils.TestUtils; import com.google.appinventor.server.storage.StorageIo; import com.google.appinventor.server.storage.StorageIoInstanceHolder; import com.google.appinventor.shared.rpc.UploadResponse; import com.google.appinventor.shared.rpc.project.UserProject; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidProjectNode; import junitx.framework.ListAssert; import java.io.File; import java.io.FileInputStream; import java.util.List; /** * Test FileImporterImpl. * * @author lizlooney@google.com (Liz Looney) */ public class FileImporterImplTest extends LocalDatastoreTestCase { private static final String USER_ID = "12345678"; private static final String USER_EMAIL_ADDRESS = "joeuser@gmail.com"; // This project name matches what is in Project1.zip and ProjectWithAssets.zip private static final String PROJECT_NAME_1 = "project1"; // This project name does not match what is in Project1.zip. private static final String PROJECT_NAME_2 = "project2"; private StorageIo storageIo; private FileImporter fileImporter; public static final String TESTING_SOURCE_PATH = TestUtils.APP_INVENTOR_ROOT_DIR + "/appengine/tests/com/google/appinventor/server/"; @Override protected void setUp() throws Exception { super.setUp(); storageIo = StorageIoInstanceHolder.INSTANCE; // Create user with given parameters storageIo.getUser(USER_ID, USER_EMAIL_ADDRESS); fileImporter = new FileImporterImpl(); } private UserProject importProjectArchive(String zipFileName, String projectName) throws Exception { String projectZip = TESTING_SOURCE_PATH + zipFileName; File zip = new File(projectZip); assertTrue(zip.exists()); return fileImporter.importProject(USER_ID, projectName, new FileInputStream(zip)); } public void testImportProject() throws Exception { UserProject userProject = importProjectArchive("Project1.zip", PROJECT_NAME_1); assertNotNull(userProject); assertEquals(PROJECT_NAME_1, userProject.getProjectName()); assertEquals("YoungAndroid", userProject.getProjectType()); long projectId = userProject.getProjectId(); ListAssert.assertContains(storageIo.getProjects(USER_ID), projectId); assertEquals(PROJECT_NAME_1, storageIo.getProjectName(USER_ID, projectId)); assertEquals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, storageIo.getProjectType(USER_ID, projectId)); List<String> projectSourceFiles = storageIo.getProjectSourceFiles(USER_ID, projectId); ListAssert.assertContains(projectSourceFiles, "youngandroidproject/project.properties"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.blk"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.scm"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.yail"); } public void testImportProject_withAssets() throws Exception { UserProject userProject = importProjectArchive("ProjectWithAssets.zip", PROJECT_NAME_1); assertNotNull(userProject); assertEquals(PROJECT_NAME_1, userProject.getProjectName()); assertEquals("YoungAndroid", userProject.getProjectType()); long projectId = userProject.getProjectId(); ListAssert.assertContains(storageIo.getProjects(USER_ID), projectId); assertEquals(PROJECT_NAME_1, storageIo.getProjectName(USER_ID, projectId)); assertEquals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, storageIo.getProjectType(USER_ID, projectId)); List<String> projectSourceFiles = storageIo.getProjectSourceFiles(USER_ID, projectId); ListAssert.assertContains(projectSourceFiles, "youngandroidproject/project.properties"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.blk"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.scm"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project1/Screen1.yail"); ListAssert.assertContains(projectSourceFiles, "assets/kitty.png"); ListAssert.assertContains(projectSourceFiles, "assets/meow.mp3"); } public void testProjectNameUsed() throws Exception { UserProject userProject = importProjectArchive("Project1.zip", PROJECT_NAME_2); assertNotNull(userProject); assertEquals(PROJECT_NAME_2, userProject.getProjectName()); assertEquals("YoungAndroid", userProject.getProjectType()); long projectId = userProject.getProjectId(); ListAssert.assertContains(storageIo.getProjects(USER_ID), projectId); assertEquals(PROJECT_NAME_2, storageIo.getProjectName(USER_ID, projectId)); assertEquals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, storageIo.getProjectType(USER_ID, projectId)); List<String> projectSourceFiles = storageIo.getProjectSourceFiles(USER_ID, projectId); ListAssert.assertContains(projectSourceFiles, "youngandroidproject/project.properties"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project2/Screen1.blk"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project2/Screen1.scm"); ListAssert.assertContains(projectSourceFiles, "src/appinventor/ai_joeuser/project2/Screen1.yail"); } public void testImportProject_withoutProjectHistory() throws Exception { String zipFileName = "Project1.zip"; String projectZip = TESTING_SOURCE_PATH + zipFileName; File zip = new File(projectZip); assertTrue(zip.exists()); String projectName = "MyProject"; UserProject userProject = fileImporter.importProject(USER_ID, projectName, new FileInputStream(zip), null); assertNotNull(userProject); assertEquals("YoungAndroid", userProject.getProjectType()); long projectId = userProject.getProjectId(); ListAssert.assertContains(storageIo.getProjects(USER_ID), projectId); assertEquals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, storageIo.getProjectType(USER_ID, projectId)); List<String> projectSrcFiles = storageIo.getProjectSourceFiles(USER_ID, projectId); ListAssert.assertContains(projectSrcFiles, "youngandroidproject/project.properties"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.blk"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.scm"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.yail"); } public void testImportProject_withProjectHistory() throws Exception { String zipFileName = "Project1.zip"; String projectZip = TESTING_SOURCE_PATH + zipFileName; File zip = new File(projectZip); assertTrue(zip.exists()); String projectName = "MyProject"; UserProject userProject = fileImporter.importProject(USER_ID, projectName, new FileInputStream(zip), "HISTORY"); assertNotNull(userProject); assertEquals("YoungAndroid", userProject.getProjectType()); long projectId = userProject.getProjectId(); ListAssert.assertContains(storageIo.getProjects(USER_ID), projectId); assertEquals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, storageIo.getProjectType(USER_ID, projectId)); assertEquals("HISTORY", storageIo.getProjectHistory(USER_ID, projectId)); List<String> projectSrcFiles = storageIo.getProjectSourceFiles(USER_ID, projectId); ListAssert.assertContains(projectSrcFiles, "youngandroidproject/project.properties"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.blk"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.scm"); ListAssert.assertContains(projectSrcFiles, "src/appinventor/ai_joeuser/" + projectName + "/Screen1.yail"); } public void testEmptyZip() throws Exception { try { UserProject userProject = importProjectArchive("EmptyZip.zip", PROJECT_NAME_1); fail(); } catch (FileImporterException e) { assertEquals(UploadResponse.Status.NOT_PROJECT_ARCHIVE, e.uploadResponse.getStatus()); } } public void testBuggyZip() throws Exception { try { UserProject userProject = importProjectArchive("Buggy.zip", PROJECT_NAME_1); fail(); } catch (FileImporterException e) { assertEquals(UploadResponse.Status.NOT_PROJECT_ARCHIVE, e.uploadResponse.getStatus()); } } public void testNotAValidProjectArchive() throws Exception { try { UserProject userProject = importProjectArchive("NotAValidProjectArchive.zip", PROJECT_NAME_1); fail(); } catch (FileImporterException e) { assertEquals(UploadResponse.Status.NOT_PROJECT_ARCHIVE, e.uploadResponse.getStatus()); } } }