1   /*
2    * Copyright 2010 The Apache Software Foundation
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package org.apache.hadoop.hbase.rest;
22  
23  import java.io.ByteArrayInputStream;
24  import java.io.IOException;
25  
26  import javax.xml.bind.JAXBContext;
27  import javax.xml.bind.JAXBException;
28  
29  import org.apache.hadoop.hbase.HBaseTestingUtility;
30  import org.apache.hadoop.hbase.MediumTests;
31  import org.apache.hadoop.hbase.rest.client.Client;
32  import org.apache.hadoop.hbase.rest.client.Cluster;
33  import org.apache.hadoop.hbase.rest.client.Response;
34  import org.apache.hadoop.hbase.rest.model.StorageClusterVersionModel;
35  import org.apache.hadoop.hbase.rest.model.VersionModel;
36  import org.apache.hadoop.hbase.util.Bytes;
37  
38  import static org.junit.Assert.*;
39  
40  import org.junit.AfterClass;
41  import org.junit.BeforeClass;
42  import org.junit.Test;
43  
44  import com.sun.jersey.spi.container.servlet.ServletContainer;
45  import org.junit.experimental.categories.Category;
46  
47  @Category(MediumTests.class)
48  public class TestVersionResource {
49    private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
50    private static final HBaseRESTTestingUtility REST_TEST_UTIL = 
51      new HBaseRESTTestingUtility();
52    private static Client client;
53    private static JAXBContext context;
54  
55    @BeforeClass
56    public static void setUpBeforeClass() throws Exception {
57      TEST_UTIL.startMiniCluster();
58      REST_TEST_UTIL.startServletContainer(TEST_UTIL.getConfiguration());
59      client = new Client(new Cluster().add("localhost", 
60        REST_TEST_UTIL.getServletPort()));
61      context = JAXBContext.newInstance(
62        VersionModel.class,
63        StorageClusterVersionModel.class);
64    }
65  
66    @AfterClass
67    public static void tearDownAfterClass() throws Exception {
68      REST_TEST_UTIL.shutdownServletContainer();
69      TEST_UTIL.shutdownMiniCluster();
70    }
71  
72    private static void validate(VersionModel model) {
73      assertNotNull(model);
74      assertNotNull(model.getRESTVersion());
75      assertEquals(model.getRESTVersion(), RESTServlet.VERSION_STRING);
76      String osVersion = model.getOSVersion(); 
77      assertNotNull(osVersion);
78      assertTrue(osVersion.contains(System.getProperty("os.name")));
79      assertTrue(osVersion.contains(System.getProperty("os.version")));
80      assertTrue(osVersion.contains(System.getProperty("os.arch")));
81      String jvmVersion = model.getJVMVersion();
82      assertNotNull(jvmVersion);
83      assertTrue(jvmVersion.contains(System.getProperty("java.vm.vendor")));
84      assertTrue(jvmVersion.contains(System.getProperty("java.version")));
85      assertTrue(jvmVersion.contains(System.getProperty("java.vm.version")));
86      assertNotNull(model.getServerVersion());
87      String jerseyVersion = model.getJerseyVersion();
88      assertNotNull(jerseyVersion);
89      assertEquals(jerseyVersion, ServletContainer.class.getPackage()
90        .getImplementationVersion());
91    }
92  
93    @Test
94    public void testGetStargateVersionText() throws IOException {
95      Response response = client.get("/version", Constants.MIMETYPE_TEXT);
96      assertTrue(response.getCode() == 200);
97      assertEquals(Constants.MIMETYPE_TEXT, response.getHeader("content-type"));
98      String body = Bytes.toString(response.getBody());
99      assertTrue(body.length() > 0);
100     assertTrue(body.contains(RESTServlet.VERSION_STRING));
101     assertTrue(body.contains(System.getProperty("java.vm.vendor")));
102     assertTrue(body.contains(System.getProperty("java.version")));
103     assertTrue(body.contains(System.getProperty("java.vm.version")));
104     assertTrue(body.contains(System.getProperty("os.name")));
105     assertTrue(body.contains(System.getProperty("os.version")));
106     assertTrue(body.contains(System.getProperty("os.arch")));
107     assertTrue(body.contains(ServletContainer.class.getPackage()
108       .getImplementationVersion()));
109   }
110 
111   @Test
112   public void testGetStargateVersionXML() throws IOException, JAXBException {
113     Response response = client.get("/version", Constants.MIMETYPE_XML);
114     assertTrue(response.getCode() == 200);
115     assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
116     VersionModel model = (VersionModel)
117       context.createUnmarshaller().unmarshal(
118         new ByteArrayInputStream(response.getBody()));
119     validate(model);
120   }
121 
122   @Test
123   public void testGetStargateVersionJSON() throws IOException {
124     Response response = client.get("/version", Constants.MIMETYPE_JSON);
125     assertTrue(response.getCode() == 200);
126     assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
127   }
128 
129   @Test
130   public void testGetStargateVersionPB() throws IOException {
131     Response response = client.get("/version", Constants.MIMETYPE_PROTOBUF);
132     assertTrue(response.getCode() == 200);
133     assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));
134     VersionModel model = new VersionModel();
135     model.getObjectFromMessage(response.getBody());
136     validate(model);
137     response = client.get("/version", Constants.MIMETYPE_PROTOBUF_IETF);
138     assertTrue(response.getCode() == 200);
139     assertEquals(Constants.MIMETYPE_PROTOBUF_IETF, response.getHeader("content-type"));
140     model = new VersionModel();
141     model.getObjectFromMessage(response.getBody());
142     validate(model);
143   }
144 
145   @Test
146   public void testGetStorageClusterVersionText() throws IOException {
147     Response response = client.get("/version/cluster", Constants.MIMETYPE_TEXT);
148     assertTrue(response.getCode() == 200);
149     assertEquals(Constants.MIMETYPE_TEXT, response.getHeader("content-type"));
150   }
151 
152   @Test
153   public void testGetStorageClusterVersionXML() throws IOException,
154       JAXBException {
155     Response response = client.get("/version/cluster",Constants.MIMETYPE_XML);
156     assertTrue(response.getCode() == 200);
157     assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
158     StorageClusterVersionModel clusterVersionModel = 
159       (StorageClusterVersionModel)
160         context.createUnmarshaller().unmarshal(
161           new ByteArrayInputStream(response.getBody()));
162     assertNotNull(clusterVersionModel);
163     assertNotNull(clusterVersionModel.getVersion());
164   }
165 
166   @Test
167   public void doTestGetStorageClusterVersionJSON() throws IOException {
168     Response response = client.get("/version/cluster", Constants.MIMETYPE_JSON);
169     assertTrue(response.getCode() == 200);
170     assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
171   }
172 
173   @org.junit.Rule
174   public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
175     new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
176 }
177