/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.ambari.server.state.repository; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.lang.reflect.Field; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ambari.server.state.RepositoryType; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.commons.io.FileUtils; import org.junit.Test; /** * Tests for repository definitions. */ public class VersionDefinitionTest { private static File file = new File("src/test/resources/version_definition_test.xml"); @Test public void testLoadingString() throws Exception { String xmlString = FileUtils.readFileToString(file); VersionDefinitionXml xml = VersionDefinitionXml.load(xmlString); validateXml(xml); } @Test public void testLoadingUrl() throws Exception { VersionDefinitionXml xml = VersionDefinitionXml.load(file.toURI().toURL()); validateXml(xml); } private void validateXml(VersionDefinitionXml xml) throws Exception { assertNotNull(xml.release); assertEquals(RepositoryType.PATCH, xml.release.repositoryType); assertEquals("HDP-2.3", xml.release.stackId); assertEquals("2.3.4.1", xml.release.version); assertEquals("2.3.4.[1-9]", xml.release.compatibleWith); assertEquals("http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/", xml.release.releaseNotes); assertEquals(4, xml.manifestServices.size()); assertEquals("HDFS-271", xml.manifestServices.get(0).serviceId); assertEquals("HDFS", xml.manifestServices.get(0).serviceName); assertEquals("2.7.1", xml.manifestServices.get(0).version); assertEquals("10", xml.manifestServices.get(0).versionId); assertEquals(3, xml.availableServices.size()); assertEquals("HDFS-271", xml.availableServices.get(0).serviceIdReference); assertEquals(0, xml.availableServices.get(0).components.size()); assertEquals("HIVE-110", xml.availableServices.get(2).serviceIdReference); assertEquals(1, xml.availableServices.get(2).components.size()); assertNotNull(xml.repositoryInfo); assertEquals(2, xml.repositoryInfo.getOses().size()); assertEquals("redhat6", xml.repositoryInfo.getOses().get(0).getFamily()); assertEquals(2, xml.repositoryInfo.getOses().get(0).getRepos().size()); assertEquals("http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.0.0", xml.repositoryInfo.getOses().get(0).getRepos().get(0).getBaseUrl()); assertEquals("HDP-2.3", xml.repositoryInfo.getOses().get(0).getRepos().get(0).getRepoId()); assertEquals("HDP", xml.repositoryInfo.getOses().get(0).getRepos().get(0).getRepoName()); assertNull(xml.repositoryInfo.getOses().get(0).getPackageVersion()); } @Test public void testAllServices() throws Exception { File f = new File("src/test/resources/version_definition_test_all_services.xml"); VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); StackInfo stack = new StackInfo() { @Override public ServiceInfo getService(String name) { return null; } }; // the file does not define available services assertEquals(4, xml.manifestServices.size()); assertEquals(3, xml.getAvailableServices(stack).size()); } @Test public void testStackManifest() throws Exception { File f = new File("src/test/resources/version_definition_test_all_services.xml"); VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); StackInfo stack = new StackInfo() { private Map<String, ServiceInfo> m_services = new HashMap<String, ServiceInfo>() {{ put("HDFS", makeService("HDFS")); put("HBASE", makeService("HBASE")); put("HIVE", makeService("HIVE")); put("YARN", makeService("YARN")); }}; @Override public ServiceInfo getService(String name) { return m_services.get(name); } @Override public synchronized Collection<ServiceInfo> getServices() { return m_services.values(); } }; List<ManifestServiceInfo> stackServices = xml.getStackServices(stack); // the file does not define available services assertEquals(4, xml.manifestServices.size()); assertEquals(3, xml.getAvailableServices(stack).size()); assertEquals(4, stackServices.size()); boolean foundHdfs = false; boolean foundYarn = false; boolean foundHive = false; for (ManifestServiceInfo msi : stackServices) { if ("HDFS".equals(msi.m_name)) { foundHdfs = true; assertEquals("HDFS Display", msi.m_display); assertEquals("HDFS Comment", msi.m_comment); assertEquals(1, msi.m_versions.size()); assertEquals("2.7.1", msi.m_versions.iterator().next()); } else if ("YARN".equals(msi.m_name)) { foundYarn = true; assertEquals(1, msi.m_versions.size()); assertEquals("1.1.1", msi.m_versions.iterator().next()); } else if ("HIVE".equals(msi.m_name)) { foundHive = true; assertEquals(2, msi.m_versions.size()); assertTrue(msi.m_versions.contains("1.1.0")); assertTrue(msi.m_versions.contains("2.0.0")); } } assertTrue(foundHdfs); assertTrue(foundYarn); assertTrue(foundHive); } @Test public void testSerialization() throws Exception { File f = new File("src/test/resources/version_definition_test_all_services.xml"); VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); String xmlString = xml.toXml(); xml = VersionDefinitionXml.load(xmlString); assertNotNull(xml.release.build); assertEquals("1234", xml.release.build); } @Test public void testMerger() throws Exception { File f = new File("src/test/resources/version_definition_test_all_services.xml"); VersionDefinitionXml xml1 = VersionDefinitionXml.load(f.toURI().toURL()); VersionDefinitionXml xml2 = VersionDefinitionXml.load(f.toURI().toURL()); assertEquals(2, xml1.repositoryInfo.getOses().size()); assertEquals(2, xml2.repositoryInfo.getOses().size()); // make xml1 have only redhat6 (remove redhat7) without a package version RepositoryXml.Os target = null; for (RepositoryXml.Os os : xml1.repositoryInfo.getOses()) { if (os.getFamily().equals("redhat7")) { target = os; } } assertNotNull(target); xml1.repositoryInfo.getOses().remove(target); // make xml2 have only redhat7 (remove redhat6) with a package version target = null; for (RepositoryXml.Os os : xml2.repositoryInfo.getOses()) { if (os.getFamily().equals("redhat6")) { target = os; } else { Field field = RepositoryXml.Os.class.getDeclaredField("packageVersion"); field.setAccessible(true); field.set(os, "2_3_4_2"); } } assertNotNull(target); xml2.repositoryInfo.getOses().remove(target); xml2.release.version = "2.3.4.2"; xml2.release.build = "2468"; assertEquals(1, xml1.repositoryInfo.getOses().size()); assertEquals(1, xml2.repositoryInfo.getOses().size()); VersionDefinitionXml.Merger builder = new VersionDefinitionXml.Merger(); VersionDefinitionXml xml3 = builder.merge(); assertNull(xml3); builder.add(xml1.release.version, xml1); builder.add("", xml2); xml3 = builder.merge(); assertNotNull(xml3); assertNull("Merged definition cannot have a build", xml3.release.build); assertEquals(xml3.release.version, "2.3.4.1"); RepositoryXml.Os redhat6 = null; RepositoryXml.Os redhat7 = null; assertEquals(2, xml3.repositoryInfo.getOses().size()); for (RepositoryXml.Os os : xml3.repositoryInfo.getOses()) { if (os.getFamily().equals("redhat6")) { redhat6 = os; } else if (os.getFamily().equals("redhat7")) { redhat7 = os; } } assertNotNull(redhat6); assertNotNull(redhat7); assertNull(redhat6.getPackageVersion()); assertEquals("2_3_4_2", redhat7.getPackageVersion()); // !!! extra test to make sure it serializes xml3.toXml(); } @Test public void testLoadingBadNewLine() throws Exception { List<?> lines = FileUtils.readLines(file); // crude StringBuilder builder = new StringBuilder(); for (Object line : lines) { String lineString = line.toString().trim(); if (lineString.startsWith("<baseurl>")) { lineString = lineString.replace("<baseurl>", ""); lineString = lineString.replace("</baseurl>", ""); builder.append("<baseurl>\n"); builder.append(lineString).append('\n'); builder.append("</baseurl>\n"); } else if (lineString.startsWith("<version>")) { lineString = lineString.replace("<version>", ""); lineString = lineString.replace("</version>", ""); builder.append("<version>\n"); builder.append(lineString).append('\n'); builder.append("</version>\n"); } else { builder.append(line.toString().trim()).append('\n'); } } VersionDefinitionXml xml = VersionDefinitionXml.load(builder.toString()); validateXml(xml); } @Test public void testPackageVersion() throws Exception { File f = new File("src/test/resources/hbase_version_test.xml"); VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); String xmlString = xml.toXml(); xml = VersionDefinitionXml.load(xmlString); assertNotNull(xml.release.build); assertEquals("3396", xml.release.build); assertEquals("redhat6", xml.repositoryInfo.getOses().get(0).getFamily()); assertEquals("2_3_4_0_3396", xml.repositoryInfo.getOses().get(0).getPackageVersion()); assertNotNull(xml.getPackageVersion("redhat6")); assertEquals("2_3_4_0_3396", xml.getPackageVersion("redhat6")); assertNull(xml.getPackageVersion("suse11")); } private static ServiceInfo makeService(final String name) { return new ServiceInfo() { @Override public String getName() { return name; } @Override public String getDisplayName() { return name + " Display"; } @Override public String getVersion() { return "1.1.1"; } @Override public String getComment() { return name + " Comment"; } }; } }