/* * RHQ Management Platform * Copyright (C) 2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.plugins.drift.mongodb.dao; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Random; import com.google.code.morphia.Datastore; import com.google.code.morphia.Morphia; import com.mongodb.BasicDBObject; import com.mongodb.Mongo; import com.mongodb.gridfs.GridFS; import com.mongodb.gridfs.GridFSDBFile; import com.mongodb.gridfs.GridFSInputFile; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.rhq.core.util.MessageDigestGenerator; import org.rhq.core.util.stream.StreamUtil; import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet; import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSetEntry; import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile; import static org.apache.commons.io.IOUtils.write; import static org.rhq.core.util.file.FileUtil.purge; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; public class FileDAOTest { // Tests need to be disabled when committed/pushed to the remote repo until we get // mongodb installed on the hudson slave static final boolean ENABLED = false; Mongo connection; Morphia morphia; Datastore ds; FileDAO dao; private File dataDir; private GridFS gridFS; private Random random; private MessageDigestGenerator digestGenerator; @BeforeClass public void initDB() throws Exception { connection = new Mongo("127.0.0.1"); morphia = new Morphia() .map(MongoDBChangeSet.class) .map(MongoDBChangeSetEntry.class) .map(MongoDBFile.class); ds = morphia.createDatastore(connection, "rhqtest"); gridFS = new GridFS(connection.getDB("rhqtest")); dataDir = new File("target", getClass().getSimpleName()); if (dataDir.exists()) { purge(dataDir, false); } dataDir.mkdirs(); random = new Random(); digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256); dao = new FileDAO(connection.getDB("rhqtest")); } @BeforeMethod public void clearCollections() { gridFS.remove(new BasicDBObject()); } @Test(enabled = ENABLED) public void findFile() throws Exception { File file = createRandomFile(); String hash = sha256(file); GridFSInputFile inputFile = gridFS.createFile(new FileInputStream(file)); inputFile.put("_id", hash); inputFile.save(); InputStream dbInputStream = dao.findOne(hash); assertNotNull(dbInputStream, "Expected to find file with name " + hash); File actualFile = new File(dataDir, "findFile.actual"); StreamUtil.copy(dbInputStream, new FileOutputStream(actualFile), true); assertTrue(actualFile.exists(), "Expected to find file " + actualFile.getPath()); } @Test(enabled = ENABLED) public void saveAndFindFile() throws Exception { File file = createRandomFile(); String hash = file.getName(); dao.save(file); InputStream dbInputStream = dao.findOne(hash); assertNotNull(dbInputStream, "Expected to find file with name " + hash); File actualFile = new File(dataDir, "saveAndFindFile.actual"); StreamUtil.copy(dbInputStream, new FileOutputStream(actualFile), true); assertTrue(actualFile.exists(), "Expected to find file " + actualFile.getPath()); } private File createRandomFile() throws Exception { byte[] bytes = new byte[32]; random.nextBytes(bytes); File file = new File(dataDir, sha256(bytes)); FileOutputStream stream = new FileOutputStream(file); write(bytes, stream); stream.close(); return file; } protected String sha256(byte[] bytes) { try { return digestGenerator.calcDigestString(bytes); } catch (IOException e) { throw new RuntimeException("Failed to calculate SHA-256 hash", e); } } protected String sha256(File file) { try { return digestGenerator.calcDigestString(file); } catch (IOException e) { throw new RuntimeException("Failed to calculate SHA-256 hash for " + file.getPath(), e); } } }