001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.rest;
019
020import static org.junit.jupiter.api.Assertions.assertEquals;
021import static org.junit.jupiter.api.Assertions.assertFalse;
022import static org.junit.jupiter.api.Assertions.assertNotNull;
023import static org.junit.jupiter.api.Assertions.assertTrue;
024
025import com.fasterxml.jackson.databind.ObjectMapper;
026import java.io.ByteArrayInputStream;
027import java.io.IOException;
028import javax.xml.bind.JAXBContext;
029import javax.xml.bind.JAXBException;
030import org.apache.hadoop.hbase.HBaseTestingUtil;
031import org.apache.hadoop.hbase.rest.client.Client;
032import org.apache.hadoop.hbase.rest.client.Cluster;
033import org.apache.hadoop.hbase.rest.client.Response;
034import org.apache.hadoop.hbase.rest.model.StorageClusterVersionModel;
035import org.apache.hadoop.hbase.rest.model.VersionModel;
036import org.apache.hadoop.hbase.testclassification.MediumTests;
037import org.apache.hadoop.hbase.testclassification.RestTests;
038import org.apache.hadoop.hbase.util.Bytes;
039import org.apache.hadoop.hbase.util.VersionInfo;
040import org.junit.jupiter.api.AfterAll;
041import org.junit.jupiter.api.BeforeAll;
042import org.junit.jupiter.api.Tag;
043import org.junit.jupiter.api.Test;
044import org.slf4j.Logger;
045import org.slf4j.LoggerFactory;
046
047import org.apache.hbase.thirdparty.com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
048import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType;
049
050@Tag(RestTests.TAG)
051@Tag(MediumTests.TAG)
052public class TestVersionResource {
053
054  private static final Logger LOG = LoggerFactory.getLogger(TestVersionResource.class);
055
056  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();
057  private static final HBaseRESTTestingUtility REST_TEST_UTIL = new HBaseRESTTestingUtility();
058  private static Client client;
059  private static JAXBContext context;
060
061  @BeforeAll
062  public static void setUpBeforeClass() throws Exception {
063    TEST_UTIL.startMiniCluster();
064    REST_TEST_UTIL.startServletContainer(TEST_UTIL.getConfiguration());
065    client = new Client(new Cluster().add("localhost", REST_TEST_UTIL.getServletPort()));
066    context = JAXBContext.newInstance(VersionModel.class, StorageClusterVersionModel.class);
067  }
068
069  @AfterAll
070  public static void tearDownAfterClass() throws Exception {
071    REST_TEST_UTIL.shutdownServletContainer();
072    TEST_UTIL.shutdownMiniCluster();
073  }
074
075  private static void validate(VersionModel model) {
076    assertNotNull(model);
077    String restVersion = model.getRESTVersion();
078    assertNotNull(restVersion);
079    assertEquals(RESTServlet.VERSION_STRING, restVersion);
080    String osVersion = model.getOSVersion();
081    assertNotNull(osVersion);
082    assertTrue(osVersion.contains(System.getProperty("os.name")));
083    assertTrue(osVersion.contains(System.getProperty("os.version")));
084    assertTrue(osVersion.contains(System.getProperty("os.arch")));
085    String jvmVersion = model.getJVMVersion();
086    assertNotNull(jvmVersion);
087    assertTrue(jvmVersion.contains(System.getProperty("java.vm.vendor")));
088    assertTrue(jvmVersion.contains(System.getProperty("java.version")));
089    assertTrue(jvmVersion.contains(System.getProperty("java.vm.version")));
090    assertNotNull(model.getServerVersion());
091    String jerseyVersion = model.getJerseyVersion();
092    assertNotNull(jerseyVersion);
093    // TODO: fix when we actually get a jersey version
094    // assertEquals(jerseyVersion, ServletContainer.class.getPackage().getImplementationVersion());
095
096    String version = model.getVersion();
097    assertNotNull(version);
098    assertEquals(VersionInfo.getVersion(), version);
099    String revision = model.getRevision();
100    assertNotNull(revision);
101    assertEquals(VersionInfo.getRevision(), revision);
102  }
103
104  @Test
105  public void testGetStargateVersionText() throws IOException {
106    Response response = client.get("/version", Constants.MIMETYPE_TEXT);
107    assertEquals(200, response.getCode());
108    assertEquals(Constants.MIMETYPE_TEXT, response.getHeader("content-type"));
109    String body = Bytes.toString(response.getBody());
110    assertFalse(body.isEmpty());
111    assertTrue(body.contains(RESTServlet.VERSION_STRING));
112    assertTrue(body.contains(System.getProperty("java.vm.vendor")));
113    assertTrue(body.contains(System.getProperty("java.version")));
114    assertTrue(body.contains(System.getProperty("java.vm.version")));
115    assertTrue(body.contains(System.getProperty("os.name")));
116    assertTrue(body.contains(System.getProperty("os.version")));
117    assertTrue(body.contains(System.getProperty("os.arch")));
118    // TODO: fix when we actually get a jersey version
119    // assertTrue(body.contains(ServletContainer.class.getPackage().getImplementationVersion()));
120  }
121
122  @Test
123  public void testGetStargateVersionXML() throws IOException, JAXBException {
124    Response response = client.get("/version", Constants.MIMETYPE_XML);
125    assertEquals(200, response.getCode());
126    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
127    VersionModel model = (VersionModel) context.createUnmarshaller()
128      .unmarshal(new ByteArrayInputStream(response.getBody()));
129    validate(model);
130    LOG.info("success retrieving Stargate version as XML");
131  }
132
133  @Test
134  public void testGetStargateVersionJSON() throws IOException {
135    Response response = client.get("/version", Constants.MIMETYPE_JSON);
136    assertEquals(200, response.getCode());
137    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
138    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(VersionModel.class,
139      MediaType.APPLICATION_JSON_TYPE);
140    VersionModel model = mapper.readValue(response.getBody(), VersionModel.class);
141    validate(model);
142    LOG.info("success retrieving Stargate version as JSON");
143  }
144
145  @Test
146  public void testGetStargateVersionPB() throws IOException {
147    Response response = client.get("/version", Constants.MIMETYPE_PROTOBUF);
148    assertEquals(200, response.getCode());
149    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));
150    VersionModel model = new VersionModel();
151    model.getObjectFromMessage(response.getBody());
152    validate(model);
153    response = client.get("/version", Constants.MIMETYPE_PROTOBUF_IETF);
154    assertEquals(200, response.getCode());
155    assertEquals(Constants.MIMETYPE_PROTOBUF_IETF, response.getHeader("content-type"));
156    model = new VersionModel();
157    model.getObjectFromMessage(response.getBody());
158    validate(model);
159  }
160
161  @Test
162  public void testGetStorageClusterVersionText() throws IOException {
163    Response response = client.get("/version/cluster", Constants.MIMETYPE_TEXT);
164    assertEquals(200, response.getCode());
165    assertEquals(Constants.MIMETYPE_TEXT, response.getHeader("content-type"));
166  }
167
168  @Test
169  public void testGetStorageClusterVersionXML() throws IOException, JAXBException {
170    Response response = client.get("/version/cluster", Constants.MIMETYPE_XML);
171    assertEquals(200, response.getCode());
172    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
173    StorageClusterVersionModel clusterVersionModel = (StorageClusterVersionModel) context
174      .createUnmarshaller().unmarshal(new ByteArrayInputStream(response.getBody()));
175    assertNotNull(clusterVersionModel);
176    assertNotNull(clusterVersionModel.getVersion());
177    LOG.info("success retrieving storage cluster version as XML");
178  }
179
180  @Test
181  public void testGetStorageClusterVersionJSON() throws IOException {
182    Response response = client.get("/version/cluster", Constants.MIMETYPE_JSON);
183    assertEquals(200, response.getCode());
184    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
185    ObjectMapper mapper = new JacksonJaxbJsonProvider()
186      .locateMapper(StorageClusterVersionModel.class, MediaType.APPLICATION_JSON_TYPE);
187    StorageClusterVersionModel clusterVersionModel =
188      mapper.readValue(response.getBody(), StorageClusterVersionModel.class);
189    assertNotNull(clusterVersionModel);
190    assertNotNull(clusterVersionModel.getVersion());
191    LOG.info("success retrieving storage cluster version as JSON");
192  }
193}