/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/assignment/trunk/assignment-impl/impl/src/test/org/sakaiproject/assignment/impl/AssignmentServiceTest.java $ * $Id: AssignmentServiceTest.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.assignment.impl; import java.util.Random; import java.lang.StringBuilder; import java.lang.Runtime; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.sakaiproject.entity.api.Entity; import org.sakaiproject.util.Blob; import org.sakaiproject.util.StringUtil; ///import junit.framework.Assert; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class AssignmentServiceTest extends TestCase { private static final Log log = LogFactory.getLog(AssignmentServiceTest.class); // test interation number int testNumber = 5; // specify the total number of users int userNumber = 200; // attachment text size in kB private int attachmentSize = 3000; // attachment id String attachmentId = null; // attachment reference String attachmentReference = null; // test zip bunction of the JVM boolean testZipFunction = false; String bigAttachmentContentString = null; private String generateBigTestString(int sizeKB) { // auto generate string with size specified StringBuilder buffer = new StringBuilder(); int realSize = sizeKB * 1024; for (int i = 0; i < realSize; i++) { buffer.append("1"); } return buffer.toString(); } protected void setUp() throws Exception { bigAttachmentContentString = generateBigTestString(attachmentSize); // set up the test attachment object /*ResourcePropertiesEdit pEdit = ContentHostingService.newResourceProperties(); pEdit.addProperty(ResourceProperties.PROP_DISPLAY_NAME, "test attachment"); ContentResource attachment = ContentHostingService.addAttachmentResource("test attachment", "text/html", generateBigTestString(3000).getBytes(), pEdit); attachmentId = attachment.getId(); attachmentReference = attachment.getReference();*/ /*// Connect to the authz service assignmentService = (BaseAssignmentService) getService(AssignmentService.class.getName()); Assert.assertNotNull(assignmentService); try { // test AssignmentContent object AssignmentContentEdit contentTest = assignmentService.addAssignmentContent("test-context"); contentReference = contentTest.getReference(); assignmentService.commitEdit(contentTest); // test Assignment object AssignmentEdit assignmentTest = assignmentService.addAssignment("test-context"); assignmentTest.setContentReference(contentReference); assignmentTest.setTitle("Test Assignment"); assignmentReference = assignmentTest.getReference(); assignmentService.commitEdit(assignmentTest); for (int userIndex = 0; userIndex < userNumber; userIndex++) { // populate the submission list try { AssignmentSubmissionEdit edit = assignmentService.addSubmission("test-context", "test-assignment"); String reference = edit.getReference(); // specify the submission text size in KB edit.setSubmittedText(generateBigTestString(submissionTextSize)); edit.setHonorPledgeFlag(true); edit.setSubmitted(true); User u = UserDirectoryService.addUser("test_user" + userIndex, "test_user" + userIndex, "first name " + userIndex, "last name " + userIndex, "testEmail@test.com", "testpassword", "registered", ContentHostingService.newResourceProperties()); edit.addSubmitter (u); edit.setAssignment(assignmentTest); // add attachments edit.addSubmittedAttachment(EntityManager.newReference(attachmentReference)); assignmentService.commitEdit(edit); submissionList.add(assignmentService.getSubmission(reference)); } catch (Exception e) { log.warn(e.toString()); } } } catch (Exception e) { log.warn(e.toString()); }*/ } public void tearDown() throws Exception { log.debug("Tearing down an AuthzIntegrationTest test"); /*// Remove the assignment, submission objects created for testing for (int i = 0; i < submissionList.size(); i++) { AssignmentSubmission s = (AssignmentSubmission) submissionList.get(i); assignmentService.removeSubmission(assignmentService.editSubmission(s.getReference())); } assignmentService.removeAssignment(assignmentService.editAssignment(assignmentReference)); assignmentService.removeAssignmentContent(assignmentService.editAssignmentContent(contentReference)); // remove all users generated for (int userIndex = 0; userIndex < userNumber; userIndex++) { UserDirectoryService.removeUser(UserDirectoryService.editUser("test_user" + userIndex)); }*/ // remove the attachment resouce object created for testing //ContentHostingService.removeResource(ContentHostingService.editResource(attachmentId)); //ContentHostingService.removeCollection(ContentHostingService.editCollection(ContentHostingService.getResource(attachmentId).getContainingCollection().getId())); } protected void zipWithFlushing(boolean flushing) { String assignmentTitle = "Test Assignment Title"; Blob b = new Blob(); try { ZipOutputStream out = new ZipOutputStream(b.outputStream()); // create the folder structor - named after the assignment's title String root = assignmentTitle + Entity.SEPARATOR; // submission text of size 2KB String submittedText = generateBigTestString(2); // Create the ZIP file String submittersName = ""; for (int count =0; count < userNumber; count++) { submittersName = root; String submittersString = "test user " + count; if (StringUtil.trimToNull(submittersString) != null) { submittersName = submittersName.concat(StringUtil.trimToNull(submittersString)); try { submittersName = submittersName.concat("/"); // create the folder structure - named after the submitter's name // create the text file only when a text submission is allowed String entryName = submittersName + submittersString + "_submissionText.html"; ZipEntry textEntry = new ZipEntry(entryName); out.putNextEntry(textEntry); out.write(submittedText.getBytes()); out.closeEntry(); // create the attachment file(s) // buffered stream input InputStream content = new ByteArrayInputStream(bigAttachmentContentString.getBytes()); byte data[] = new byte[1024 * 10]; BufferedInputStream bContent = new BufferedInputStream(content, data.length); ZipEntry attachmentEntry = new ZipEntry(submittersName + "Test Attachment"); out.putNextEntry(attachmentEntry); int bCount = -1; while ((bCount = bContent.read(data, 0, data.length)) != -1) { out.write(data, 0, bCount); } out.closeEntry(); content.close(); // flush or not if (flushing) { out.flush(); } } catch (IOException e) { log.debug(this + ": --IOException: Problem in creating the attachment file: submittersName=" + submittersName + " attachment reference=" + attachmentReference); } } } // for // clean up out.finish(); out.close(); } catch (IOException e) { log.debug(this + ": --IOException unable to create the zip file for assignment " + assignmentTitle); } } /** * * test the zip routine without/with flushing for 5 times * */ public void testZipSubmissionsWithoutFlushing() { if( testZipFunction ) { System.out.println("student number = " + userNumber); System.out.println("attachment size = " + attachmentSize + "KB"); System.gc(); for (int index = 1; index <= testNumber; index++) { Random ran = new Random(); boolean flushing = ran.nextBoolean(); Runtime r = Runtime.getRuntime(); System.out.println("with flushing = " + flushing); long mBefore = r.freeMemory(); long tBefore = System.currentTimeMillis(); zipWithFlushing(flushing); long mAfter = r.freeMemory(); long tAfter = System.currentTimeMillis(); System.out.println("free memory before invoke " + mBefore + " after " + mAfter); System.out.println("minute time used " + (tAfter-tBefore)/(1000.0*60.0)); System.out.println("percent " + (mBefore-mAfter)* 100/(mBefore*1.0)); System.out.println("*************"); // gc System.gc(); } } } }