/*
*
* * Copyright 2016 Axibase Corporation or its affiliates. All Rights Reserved.
* *
* * Licensed under the Apache License, Version 2.0 (the "License").
* * You may not use this file except in compliance with the License.
* * A copy of the License is located at
* *
* * https://www.axibase.com/atsd/axibase-apache-2.0.pdf
* *
* * or in the "license" file accompanying this file. This file 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.axibase.tsd.client.data;
import com.axibase.tsd.RerunRule;
import com.axibase.tsd.client.AtsdServerException;
import com.axibase.tsd.client.DataService;
import com.axibase.tsd.client.HttpClientManager;
import com.axibase.tsd.model.data.Property;
import com.axibase.tsd.model.data.command.BatchResponse;
import com.axibase.tsd.model.data.command.GetPropertiesQuery;
import com.axibase.tsd.model.data.filters.DeletePropertyFilter;
import com.axibase.tsd.network.PlainCommand;
import com.axibase.tsd.network.PropertyInsertCommand;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import static com.axibase.tsd.TestUtil.*;
import static junit.framework.Assert.*;
public class PropertyTest {
private Logger logger = LoggerFactory.getLogger(Property.class);
private DataService dataService;
private HttpClientManager httpClientManager;
@Rule
public RerunRule rerunRule = new RerunRule();
@Before
public void setUp() throws Exception {
httpClientManager = buildHttpClientManager();
httpClientManager.setCheckPeriodMillis(1000);
dataService = new DataService();
dataService.setHttpClientManager(httpClientManager);
waitWorkingServer(httpClientManager);
}
@After
public void tearDown() throws Exception {
httpClientManager.close();
}
@Test
public void testRetrievePropertiesByPropertiesQuery() throws Exception {
final String entityName = buildVariablePrefix() + "entity";
final String propertyTypeName = buildVariablePrefix() + "type";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(propertyTypeName, entityName, key, tags);
if (dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.insertProperties(property));
}
assertFalse(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
GetPropertiesQuery getPropertiesQuery = new GetPropertiesQuery(propertyTypeName, entityName)
.setKey(key);
List<Property> properties = dataService.retrieveProperties(getPropertiesQuery);
assertFalse(properties.isEmpty());
logger.info(properties.toString());
assertEquals(entityName, properties.get(0).getEntityName());
assertEquals(propertyTypeName, properties.get(0).getType());
assertEquals(key, properties.get(0).getKey());
}
@Test
public void testRetrievePropertiesByEntityNameAndPropertyTypeName() throws Exception {
final String entityName = buildVariablePrefix() + "entity";
final String propertyTypeName = buildVariablePrefix() + "property-type";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
if (dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.insertProperties(new Property(propertyTypeName, entityName, key, tags)));
}
List properties = dataService.retrieveProperties(entityName, propertyTypeName);
assertFalse(properties.isEmpty());
assertTrue(properties.get(0) instanceof Property);
assertEquals(1, properties.size());
assertEquals(entityName, ((Property) properties.get(0)).getEntityName());
assertEquals(propertyTypeName, ((Property) properties.get(0)).getType());
}
@Test
public void testInsertProperties() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "type";
final String entityName = buildVariablePrefix() + "entity";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(propertyTypeName, entityName, key, tags);
if (!dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.deleteProperties(new DeletePropertyFilter(propertyTypeName, entityName)));
}
assertTrue(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
property.setTags(tags);
assertTrue(dataService.insertProperties(property));
List properties = dataService.retrieveProperties(entityName, propertyTypeName);
assertFalse(properties.isEmpty());
assertEquals(1, properties.size());
assertTrue(properties.get(0) instanceof Property);
logger.info("debug start");
logger.info(properties.toString());
logger.info("debug end");
assertEquals(key, ((Property) properties.get(0)).getKey());
assertEquals(tags, ((Property) properties.get(0)).getTags());
}
@Test
public void testInsertPropertiesWithoutTags() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "typeName";
final String entityName = buildVariablePrefix() + "entity";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Property property = new Property(propertyTypeName, entityName, key, null);
if (!dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.deleteProperties(new DeletePropertyFilter(propertyTypeName, entityName)));
}
assertTrue(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
assertFalse(dataService.insertProperties(property));
assertTrue(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
}
@Test(expected = AtsdServerException.class)
public void testInsertPropertiesWithoutEntity() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "typeName";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(propertyTypeName, null, key, tags);
if (!dataService.retrieveProperties(new GetPropertiesQuery(propertyTypeName, null)).isEmpty()) {
assertTrue(dataService.deleteProperties(new DeletePropertyFilter(propertyTypeName, null)));
}
assertTrue(dataService.retrieveProperties(new GetPropertiesQuery(propertyTypeName, null)).isEmpty());
try {
dataService.insertProperties(property);
fail();
} catch (IllegalArgumentException e) {
//ok
}
assertTrue(dataService.retrieveProperties(new GetPropertiesQuery(propertyTypeName, null)).isEmpty());
}
@Test(expected = AtsdServerException.class)
public void testInsertPropertiesWithoutPropertyType() throws Exception {
final String entityName = buildVariablePrefix() + "entityName";
Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(null, entityName, key, tags);
List<Property> oldProperties = dataService.retrieveProperties(new GetPropertiesQuery(null, entityName));
if (!oldProperties.isEmpty()) {
List<DeletePropertyFilter> batchPropertyCommands = new ArrayList<>();
for (Property prop : oldProperties) {
batchPropertyCommands.add(new DeletePropertyFilter(prop.getType(), prop.getEntityName()));
}
assertTrue(dataService.deleteProperties(batchPropertyCommands));
}
assertTrue(dataService.retrieveProperties(new GetPropertiesQuery(null, entityName)).isEmpty());
try {
dataService.insertProperties(property);
fail();
} catch (IllegalArgumentException e) {
//ok
}
assertTrue(dataService.retrieveProperties(new GetPropertiesQuery(null, entityName)).isEmpty());
}
@Test
public void testBatchDeletePropertiesNoTime() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "property-type";
final String entityName = buildVariablePrefix() + "entity";
final Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(propertyTypeName, entityName, key, tags);
if (dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.insertProperties(property));
}
assertFalse(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
DeletePropertyFilter filter = new DeletePropertyFilter(propertyTypeName, entityName);
filter.setKey(key);
assertTrue(dataService.deleteProperties(filter));
assertTrue(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
}
@Test
public void testBatchDeletePropertiesTimestamp() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "property-type";
final String entityName = buildVariablePrefix() + "entity";
final Map<String, String> key = new HashMap<>();
key.put("key1", "key1-val");
key.put("key2", "key2-val");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "tag1-val");
tags.put("tag2", "tag2-val");
Property property = new Property(propertyTypeName, entityName, key, tags);
if (dataService.retrieveProperties(entityName, propertyTypeName).isEmpty()) {
assertTrue(dataService.insertProperties(property));
}
assertFalse(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
DeletePropertyFilter filter = new DeletePropertyFilter(propertyTypeName, entityName);
filter.setKey(key);
assertTrue(dataService.deleteProperties(filter));
assertTrue(dataService.retrieveProperties(entityName, propertyTypeName).isEmpty());
}
@Test
public void testSendBatch() throws Exception {
final String propertyTypeName = buildVariablePrefix() + "property-type";
final String entityName = buildVariablePrefix() + "entity";
final long st = System.currentTimeMillis();
final ArrayList<PlainCommand> commands = new ArrayList<>();
commands.add(new PropertyInsertCommand(entityName, propertyTypeName, st, Collections.<String, String>emptyMap(), Collections.singletonMap("prop1", "value1")));
commands.add(new PropertyInsertCommand(entityName, propertyTypeName, st+1, Collections.singletonMap("key1", "value1"), Collections.singletonMap("prop1", "value1")));
final BatchResponse batchResponse = dataService.sendBatch(commands);
assertTrue(batchResponse.getResult().getFail() == 0);
Thread.sleep(WAIT_TIME);
final GetPropertiesQuery getPropertiesQuery = new GetPropertiesQuery(propertyTypeName, entityName);
getPropertiesQuery.setStartTime(st);
getPropertiesQuery.setEndTime(st + 2);
final List<Property> propertyResults = dataService.retrieveProperties(getPropertiesQuery);
assertEquals(2, propertyResults.size());
}
}