/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java

https://github.com/metlos/RHQ-old · Java · 335 lines · 220 code · 53 blank · 62 comment · 46 complexity · d23796527b9733851dba9643e27354d3 MD5 · raw file

  1. /*
  2. * RHQ Management Platform
  3. * Copyright (C) 2005-2008 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation version 2 of the License.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. package org.rhq.enterprise.server.content.test;
  20. import java.io.File;
  21. import java.io.FileOutputStream;
  22. import java.io.InputStream;
  23. import org.testng.annotations.Test;
  24. import org.rhq.core.domain.content.Architecture;
  25. import org.rhq.core.domain.content.Package;
  26. import org.rhq.core.domain.content.PackageBits;
  27. import org.rhq.core.domain.content.PackageBitsBlob;
  28. import org.rhq.core.domain.content.PackageType;
  29. import org.rhq.core.domain.content.PackageVersion;
  30. import org.rhq.core.domain.content.composite.LoadedPackageBitsComposite;
  31. import org.rhq.core.domain.resource.Resource;
  32. import org.rhq.core.util.MessageDigestGenerator;
  33. import org.rhq.enterprise.server.content.ContentManagerLocal;
  34. import org.rhq.enterprise.server.content.ContentUIManagerLocal;
  35. import org.rhq.enterprise.server.test.AbstractEJB3Test;
  36. import org.rhq.enterprise.server.test.TransactionCallback;
  37. import org.rhq.enterprise.server.util.LookupUtil;
  38. import org.rhq.enterprise.server.util.SessionTestHelper;
  39. /**
  40. * Test case for general {@link org.rhq.enterprise.server.content.ContentUIManagerBean} tests. Any tests that would
  41. * require a large DB state prior to running are split off into their own test classes.
  42. *
  43. * @author Jason Dobies
  44. */
  45. public class ContentUIManagerBeanTest extends AbstractEJB3Test {
  46. private static final boolean ENABLE_TESTS = true;
  47. private ContentUIManagerLocal contentUIManager;
  48. private ContentManagerLocal contentManager;
  49. // Setup --------------------------------------------
  50. @Override
  51. protected void beforeMethod() throws Exception {
  52. contentUIManager = LookupUtil.getContentUIManager();
  53. contentManager = LookupUtil.getContentManager();
  54. }
  55. // Test Cases --------------------------------------------
  56. @Test(enabled = ENABLE_TESTS)
  57. public void testPackageBits() throws Throwable {
  58. executeInTransaction(new TransactionCallback() {
  59. public void execute() throws Exception {
  60. LoadedPackageBitsComposite composite;
  61. try {
  62. Resource resource = SessionTestHelper.createNewResource(em, "testPkgBitsResource");
  63. PackageType pkgType = new PackageType("testPkgBitsPT", resource.getResourceType());
  64. org.rhq.core.domain.content.Package pkg = new Package("testPkgBitsP", pkgType);
  65. Architecture arch = new Architecture("testPkgArch");
  66. PackageVersion pkgVer = new PackageVersion(pkg, "1", arch);
  67. em.persist(pkgType);
  68. em.persist(pkg);
  69. em.persist(arch);
  70. em.persist(pkgVer);
  71. em.flush();
  72. // test that no bits are available right now
  73. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  74. assert composite != null;
  75. assert composite.getPackageVersionId() == pkgVer.getId();
  76. assert composite.getPackageBitsId() == null;
  77. assert !composite.isPackageBitsAvailable();
  78. assert !composite.isPackageBitsInDatabase();
  79. // pretend we loaded the bits, but we stored them somewhere other then the DB
  80. PackageBits packageBits = createPackageBits();
  81. pkgVer.setPackageBits(packageBits);
  82. pkgVer = em.merge(pkgVer);
  83. em.flush();
  84. // test that the bits are available, but are not stored in the DB
  85. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  86. assert composite != null;
  87. assert composite.getPackageVersionId() == pkgVer.getId();
  88. assert composite.getPackageBitsId() == packageBits.getId();
  89. assert composite.isPackageBitsAvailable();
  90. assert !composite.isPackageBitsInDatabase();
  91. // let's make sure there really is no data in the DB
  92. packageBits = em.find(PackageBits.class, packageBits.getId());
  93. assert packageBits != null;
  94. assert packageBits.getBlob().getBits() == null;
  95. // now lets store some bits in the DB
  96. final String DATA = "testPackageBits data";
  97. PackageBitsBlob packageBitsBlob = em.find(PackageBitsBlob.class, packageBits.getId());
  98. packageBitsBlob.setBits(DATA.getBytes());
  99. em.merge(packageBitsBlob);
  100. em.flush();
  101. // test that the bits are available and stored in the DB
  102. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  103. assert composite != null;
  104. assert composite.getPackageVersionId() == pkgVer.getId();
  105. assert composite.getPackageBitsId() == packageBits.getId();
  106. assert composite.isPackageBitsAvailable();
  107. assert composite.isPackageBitsInDatabase();
  108. // let's make sure the data really is in the DB
  109. packageBits = em.find(PackageBits.class, packageBits.getId());
  110. assert packageBits != null;
  111. assert DATA.equals(new String(packageBits.getBlob().getBits()));
  112. ////////////////////////////////////////////////////
  113. // create another package version and test with that
  114. ////////////////////////////////////////////////////
  115. PackageVersion pkgVer2 = new PackageVersion(pkg, "2", arch);
  116. em.persist(pkgVer2);
  117. em.flush();
  118. // first make sure the query still gets the right answer for the first pkgVer
  119. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  120. assert composite != null;
  121. assert composite.getPackageVersionId() == pkgVer.getId();
  122. assert composite.getPackageBitsId() == packageBits.getId();
  123. assert composite.isPackageBitsAvailable();
  124. assert composite.isPackageBitsInDatabase();
  125. // test that no bits are available right now
  126. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer2.getId());
  127. assert composite != null;
  128. assert composite.getPackageVersionId() == pkgVer2.getId();
  129. assert composite.getPackageBitsId() == null;
  130. assert !composite.isPackageBitsAvailable();
  131. assert !composite.isPackageBitsInDatabase();
  132. // pretend we loaded the bits, but we stored them somewhere other then the DB
  133. PackageBits packageBits2 = createPackageBits();
  134. pkgVer2.setPackageBits(packageBits2);
  135. pkgVer2 = em.merge(pkgVer2);
  136. em.flush();
  137. // make sure the query still gets the right answer for the first pkgVer
  138. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  139. assert composite != null;
  140. assert composite.getPackageVersionId() == pkgVer.getId();
  141. assert composite.getPackageBitsId() == packageBits.getId();
  142. assert composite.isPackageBitsAvailable();
  143. assert composite.isPackageBitsInDatabase();
  144. // test that the bits are available, but are not stored in the DB
  145. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer2.getId());
  146. assert composite != null;
  147. assert composite.getPackageVersionId() == pkgVer2.getId();
  148. assert composite.getPackageBitsId() == packageBits2.getId();
  149. assert composite.isPackageBitsAvailable();
  150. assert !composite.isPackageBitsInDatabase();
  151. // let's make sure there really is no data in the DB
  152. packageBits2 = em.find(PackageBits.class, packageBits2.getId());
  153. assert packageBits2 != null;
  154. assert packageBits2.getBlob().getBits() == null;
  155. // now lets store some bits in the DB
  156. final String DATA2 = "testPackageBits more data";
  157. packageBits2.getBlob().setBits(DATA2.getBytes());
  158. em.merge(packageBits2.getBlob());
  159. em.flush();
  160. // make sure the query still gets the right answer for the first pkgVer
  161. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  162. assert composite != null;
  163. assert composite.getPackageVersionId() == pkgVer.getId();
  164. assert composite.getPackageBitsId() == packageBits.getId();
  165. assert composite.isPackageBitsAvailable();
  166. assert composite.isPackageBitsInDatabase();
  167. // test that the bits are available and stored in the DB
  168. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer2.getId());
  169. assert composite != null;
  170. assert composite.getPackageVersionId() == pkgVer2.getId();
  171. assert composite.getPackageBitsId() == packageBits2.getId();
  172. assert composite.isPackageBitsAvailable();
  173. assert composite.isPackageBitsInDatabase();
  174. // let's make sure the data really is in the DB
  175. packageBits2 = em.find(PackageBits.class, packageBits2.getId());
  176. assert packageBits2 != null;
  177. assert DATA2.equals(new String(packageBits2.getBlob().getBits()));
  178. } catch (Throwable t) {
  179. t.printStackTrace();
  180. throw new RuntimeException(t);
  181. }
  182. }
  183. });
  184. }
  185. @Test(enabled = ENABLE_TESTS)
  186. public void testPackageBitsBlobStream() throws Throwable {
  187. executeInTransaction(new TransactionCallback() {
  188. public void execute() throws Exception {
  189. LoadedPackageBitsComposite composite;
  190. try {
  191. Resource resource = SessionTestHelper.createNewResource(em, "testPkgBitsLargeResource");
  192. PackageType pkgType = new PackageType("testPkgBitsLargePT", resource.getResourceType());
  193. org.rhq.core.domain.content.Package pkg = new Package("testPkgBitsLargeP", pkgType);
  194. Architecture arch = new Architecture("testPkgLargeArch");
  195. PackageVersion pkgVer = new PackageVersion(pkg, "1", arch);
  196. em.persist(pkgType);
  197. em.persist(pkg);
  198. em.persist(arch);
  199. em.persist(pkgVer);
  200. em.flush();
  201. // test that no bits are available right now
  202. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  203. assert composite != null;
  204. assert composite.getPackageVersionId() == pkgVer.getId();
  205. assert composite.getPackageBitsId() == null;
  206. assert !composite.isPackageBitsAvailable();
  207. assert !composite.isPackageBitsInDatabase();
  208. // pretend we loaded the bits, but we stored them somewhere other then the DB
  209. PackageBits packageBits = createPackageBits();
  210. pkgVer.setPackageBits(packageBits);
  211. pkgVer = em.merge(pkgVer);
  212. em.flush();
  213. // test that the bits are available, but are not stored in the DB
  214. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  215. assert composite != null;
  216. assert composite.getPackageVersionId() == pkgVer.getId();
  217. assert composite.getPackageBitsId() == packageBits.getId();
  218. assert composite.isPackageBitsAvailable();
  219. assert !composite.isPackageBitsInDatabase();
  220. // let's make sure there really is no data in the DB
  221. packageBits = em.find(PackageBits.class, packageBits.getId());
  222. assert packageBits != null;
  223. assert packageBits.getBlob().getBits() == null;
  224. // now lets store some bits in the DB using PreparedStatements and BLOB mechanism
  225. // to simulate large file transfers where streaming is used instead of reading entire
  226. // contents into memory every time.
  227. // destination once pulled from db
  228. File tempDir = getTempDir();
  229. if (!tempDir.exists()) {
  230. assertTrue("Unable to mkdirs " + tempDir + " for test.", tempDir.mkdirs());
  231. }
  232. File retrieved = new File(tempDir, "pulled.jar");
  233. if (retrieved.exists()) {
  234. assertTrue("Unable to delete " + retrieved.getPath() + " for test cleanup.", retrieved.delete());
  235. }
  236. //any jar should be fine. Use canned jar
  237. InputStream originalBinaryStream = this.getClass().getClassLoader()
  238. .getResourceAsStream("binary-blob-sample.jar");
  239. String originalDigest = new MessageDigestGenerator(MessageDigestGenerator.SHA_256)
  240. .calcDigestString(originalBinaryStream);
  241. originalBinaryStream.close();
  242. originalBinaryStream = this.getClass().getClassLoader()
  243. .getResourceAsStream("binary-blob-sample.jar");
  244. contentManager.updateBlobStream(originalBinaryStream, packageBits, null);
  245. packageBits = em.find(PackageBits.class, packageBits.getId());
  246. // test that the bits are available and stored in the DB: Reading the Blob
  247. composite = contentUIManager.getLoadedPackageBitsComposite(pkgVer.getId());
  248. assert composite != null;
  249. assert composite.getPackageVersionId() == pkgVer.getId();
  250. assert composite.getPackageBitsId() == packageBits.getId();
  251. assert composite.isPackageBitsAvailable();
  252. assert composite.isPackageBitsInDatabase();
  253. FileOutputStream outputStream = new FileOutputStream(retrieved);
  254. contentManager.writeBlobOutToStream(outputStream, packageBits, false);
  255. //Check that db content equal to file system content
  256. String newDigest = new MessageDigestGenerator(MessageDigestGenerator.SHA_256)
  257. .calcDigestString(retrieved);
  258. assertEquals("Uploaded and retrieved digests differ:", originalDigest, newDigest);
  259. } catch (Throwable t) {
  260. t.printStackTrace();
  261. throw new RuntimeException(t);
  262. }
  263. }
  264. });
  265. }
  266. private PackageBits createPackageBits() {
  267. PackageBits bits = null;
  268. PackageBitsBlob blob = null;
  269. // We have to work backwards to avoid constraint violations. PackageBits requires a PackageBitsBlob,
  270. // so create and persist that first, getting the ID
  271. blob = new PackageBitsBlob();
  272. em.persist(blob);
  273. // Now create the PackageBits entity and assign the Id and blob. Note, do not persist the
  274. // entity, the row already exists. Just perform and flush the update.
  275. bits = new PackageBits();
  276. bits.setId(blob.getId());
  277. bits.setBlob(blob);
  278. em.flush();
  279. // return the new PackageBits and associated PackageBitsBlob
  280. return bits;
  281. }
  282. }