/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* Licensed 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 com.linkedin.pinot.server.api.resources;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.linkedin.pinot.common.restlet.resources.TableSegments;
import com.linkedin.pinot.common.restlet.resources.TablesList;
import com.linkedin.pinot.core.indexsegment.IndexSegment;
import com.linkedin.pinot.core.segment.index.SegmentMetadataImpl;
import java.util.List;
import javax.ws.rs.core.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
public class TablesResourceTest {
ResourceTestHelper testHelper = new ResourceTestHelper();
@BeforeClass
public void setupTest()
throws Exception {
testHelper.setup();
}
@AfterClass
public void teardownTest()
throws Exception {
testHelper.tearDown();
}
@Test
public void getTables()
throws Exception {
Response response =
testHelper.target.path("/tables").request().get(Response.class);
String responseBody = response.readEntity(String.class);
TablesList tablesList =
new ObjectMapper().readValue(responseBody, TablesList.class);
assertNotNull(tablesList);
List<String> tables = tablesList.getTables();
assertNotNull(tables);
assertEquals(tables.size(), 1);
assertEquals(tables.get(0), ResourceTestHelper.DEFAULT_TABLE_NAME);
final String secondTable = "secondTable";
testHelper.addTable(secondTable);
IndexSegment secondSegment = testHelper.setupSegment(secondTable, ResourceTestHelper.DEFAULT_AVRO_DATA_FILE, "2");
tablesList = testHelper.target.path("/tables").request().get(TablesList.class);
assertNotNull(tablesList);
assertNotNull(tablesList.getTables());
assertEquals(tablesList.getTables().size(), 2);
assertTrue(tablesList.getTables().contains(ResourceTestHelper.DEFAULT_TABLE_NAME));
assertTrue(tablesList.getTables().contains(secondTable));
}
@Test
public void getSegments()
throws Exception {
{
TableSegments tableSegments =
testHelper.target.path("/tables/" + ResourceTestHelper.DEFAULT_TABLE_NAME + "/segments").request()
.get(TableSegments.class);
assertNotNull(tableSegments);
assertNotNull(tableSegments.getSegments());
assertEquals(tableSegments.getSegments().size(), 1);
assertEquals(tableSegments.getSegments().get(0), testHelper.indexSegment.getSegmentName());
IndexSegment secondSegment = testHelper
.setupSegment(ResourceTestHelper.DEFAULT_TABLE_NAME, ResourceTestHelper.DEFAULT_AVRO_DATA_FILE, "2");
tableSegments = testHelper.target.path("/tables/" + ResourceTestHelper.DEFAULT_TABLE_NAME + "/segments").request()
.get(TableSegments.class);
assertNotNull(tableSegments);
assertNotNull(tableSegments.getSegments());
assertEquals(tableSegments.getSegments().size(), 2);
assertTrue(tableSegments.getSegments().contains(testHelper.indexSegment.getSegmentName()));
assertTrue(tableSegments.getSegments().contains(secondSegment.getSegmentName()));
}
{
// No such table
Response response = testHelper.target.path("/tables/noSuchTable/segments").request().get(Response.class);
assertNotNull(response);
assertEquals(response.getStatus(), Response.Status.NOT_FOUND.getStatusCode());
}
}
@Test
public void testSegmentMetadata()
throws JSONException {
final String urlFormat = "/tables/%s/segments/%s/metadata";
{
String response = testHelper.target.path(String.format(urlFormat, ResourceTestHelper.DEFAULT_TABLE_NAME,
testHelper.indexSegment.getSegmentMetadata().getName())).request().get(String.class);
JSONObject jsonMeta = new JSONObject(response);
SegmentMetadataImpl segmentMeta = (SegmentMetadataImpl) testHelper.indexSegment.getSegmentMetadata();
assertEquals(jsonMeta.getString("segmentName"), segmentMeta.getName());
assertEquals(jsonMeta.getString("crc"), segmentMeta.getCrc());
assertEquals(jsonMeta.getLong("creationTimeMillis"), segmentMeta.getIndexCreationTime());
assertEquals(jsonMeta.getString("paddingCharacter"), String.valueOf(segmentMeta.getPaddingCharacter()));
assertEquals(jsonMeta.getLong("refreshTimeMillis"), segmentMeta.getRefreshTime());
assertEquals(jsonMeta.getLong("pushTimeMillis"), segmentMeta.getPushTime());
assertTrue(jsonMeta.has("pushTimeReadable"));
assertTrue(jsonMeta.has("refreshTimeReadable"));
assertTrue(jsonMeta.has("startTimeReadable"));
assertTrue(jsonMeta.has("endTimeReadable"));
assertTrue(jsonMeta.has("creationTimeReadable"));
assertEquals(jsonMeta.getLong("startTimeMillis"), segmentMeta.getTimeInterval().getStartMillis());
assertEquals(jsonMeta.getLong("endTimeMillis"), segmentMeta.getTimeInterval().getEndMillis());
JSONArray columns = jsonMeta.getJSONArray("columns");
assertEquals(columns.length(), 0);
}
{
Response response = testHelper.target.path(String.format(urlFormat, ResourceTestHelper.DEFAULT_TABLE_NAME,
testHelper.indexSegment.getSegmentMetadata().getName()))
.queryParam("columns", "column1")
.queryParam("columns", "column2")
.request().get();
System.out.println(response.getStatus());
JSONObject jsonMeta = new JSONObject(response.readEntity(String.class));
JSONArray columns = jsonMeta.getJSONArray("columns");
assertEquals(columns.length(), 2);
}
{
String response = testHelper.target.path(String.format(urlFormat, ResourceTestHelper.DEFAULT_TABLE_NAME,
testHelper.indexSegment.getSegmentMetadata().getName()))
.queryParam("columns", "*")
.request().get(String.class);
JSONObject jsonMeta = new JSONObject(response);
JSONArray columns = jsonMeta.getJSONArray("columns");
assertEquals(columns.length(),
((SegmentMetadataImpl) testHelper.indexSegment.getSegmentMetadata()).getAllColumns().size());
}
{
Response response = testHelper.target.path(String
.format(urlFormat, "UNKNOWN_TABLE", testHelper.indexSegment.getSegmentMetadata().getName()))
.request().get(Response.class);
assertEquals(response.getStatus(), Response.Status.NOT_FOUND.getStatusCode());
}
{
Response response = testHelper.target
.path(String.format(urlFormat, ResourceTestHelper.DEFAULT_TABLE_NAME, "UNKNOWN_SEGMENT"))
.request().get(Response.class);
assertEquals(response.getStatus(), Response.Status.NOT_FOUND.getStatusCode());
}
}
}