/*
* Copyright 2013 the original author or authors.
*
* 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 org.springframework.xd.analytics.metrics;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.xd.analytics.metrics.core.FieldValueCounter;
import org.springframework.xd.analytics.metrics.core.FieldValueCounterRepository;
/**
* Base tests for various implementations of {@link FieldValueCounterRepository}.
*
* @author Eric Bottard
* @author Mark Pollack
*/
public abstract class AbstractFieldValueCounterRepositoryTests {
@Autowired
protected FieldValueCounterRepository fieldValueCounterRepository;
private final String tickersFieldValueCounterName = "tickersFieldValueCounter";
private final String mentionsFieldValueCounterName = "mentionsFieldValueCounter";
@Test
public void testCrud() {
FieldValueCounter counter = new FieldValueCounter(tickersFieldValueCounterName);
// Test with initial save
FieldValueCounter fvTickersCounter = fieldValueCounterRepository.save(counter);
assertThat(fieldValueCounterRepository.findOne(fvTickersCounter.getName()), notNullValue());
fieldValueCounterRepository.increment(tickersFieldValueCounterName, "VMW");
Map<String, Double> counts = fieldValueCounterRepository.findOne(tickersFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("VMW"), equalTo(1.0));
fieldValueCounterRepository.increment(tickersFieldValueCounterName, "VMW");
counts = fieldValueCounterRepository.findOne(tickersFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("VMW"), equalTo(2.0));
//Check that we can save back another value.
fvTickersCounter.getFieldValueCount().put("VMW", 1.0D);
fieldValueCounterRepository.save(counter);
counts = fieldValueCounterRepository.findOne(tickersFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("VMW"), equalTo(1.0));
//Increment again to prepare for decrement test below
fieldValueCounterRepository.increment(tickersFieldValueCounterName, "VMW");
fieldValueCounterRepository.increment(tickersFieldValueCounterName, "ORCL");
counts = fieldValueCounterRepository.findOne(tickersFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("ORCL"), equalTo(1.0));
// Test without prior save
fieldValueCounterRepository.increment(mentionsFieldValueCounterName, "mama");
counts = fieldValueCounterRepository.findOne(mentionsFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("mama"), equalTo(1.0));
fieldValueCounterRepository.increment(mentionsFieldValueCounterName, "mama");
counts = fieldValueCounterRepository.findOne(mentionsFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("mama"), equalTo(2.0));
fieldValueCounterRepository.increment(mentionsFieldValueCounterName, "papa");
counts = fieldValueCounterRepository.findOne(mentionsFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("papa"), equalTo(1.0));
fieldValueCounterRepository.decrement(tickersFieldValueCounterName, "VMW");
counts = fieldValueCounterRepository.findOne(tickersFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("VMW"), equalTo(1.0));
fieldValueCounterRepository.decrement(mentionsFieldValueCounterName, "mama");
counts = fieldValueCounterRepository.findOne(mentionsFieldValueCounterName).getFieldValueCount();
assertThat(counts.get("mama"), equalTo(1.0));
}
@Test(expected = IllegalArgumentException.class)
public void testDeleteNullString() {
fieldValueCounterRepository.delete((String) null);
}
@Test(expected = IllegalArgumentException.class)
public void testDeleteNullGauge() {
fieldValueCounterRepository.delete((FieldValueCounter) null);
}
@Test(expected = IllegalArgumentException.class)
public void testFindOneNullCounter() {
fieldValueCounterRepository.findOne(null);
}
@Test
public void testCrud2() {
String myFVCounter = "myFVCounter";
String yourFVCounter = "yourFVCounter";
Map<String, Double> fieldValueCount = new HashMap<String, Double>();
fieldValueCount.put("elephant", 1.0);
fieldValueCount.put("pig", 1.0);
FieldValueCounter c1 = new FieldValueCounter(myFVCounter, fieldValueCount);
FieldValueCounter myCounter = fieldValueCounterRepository.save(c1);
assertThat(myCounter.getName(), is(myFVCounter));
// Create and save a Counter named 'yourCounter'
fieldValueCount = new HashMap<String, Double>();
fieldValueCount.put("turtle", 5.0);
fieldValueCount.put("fish", 6.0);
fieldValueCount.put("bird", 7.0);
FieldValueCounter c2 = new FieldValueCounter(yourFVCounter, fieldValueCount);
FieldValueCounter yourCounter = fieldValueCounterRepository.save(c2);
assertThat(yourCounter.getName(), is(yourFVCounter));
// Retrieve by name
FieldValueCounter result = fieldValueCounterRepository.findOne(myFVCounter);
assertThat(result, is(notNullValue()));
assertThat(result.getName(), equalTo(myCounter.getName()));
assertThat(result.getFieldValueCount().size(), equalTo(2));
fieldValueCount = result.getFieldValueCount();
assertThat(fieldValueCount.get("elephant"), equalTo(1.0));
assertThat(fieldValueCount.get("pig"), equalTo(1.0));
result = fieldValueCounterRepository.findOne(yourCounter.getName());
assertThat(result.getName(), equalTo(yourCounter.getName()));
assertThat(result.getFieldValueCount().size(), equalTo(3));
fieldValueCount = result.getFieldValueCount();
assertThat(fieldValueCount.get("turtle"), equalTo(5.0));
assertThat(fieldValueCount.get("fish"), equalTo(6.0));
assertThat(fieldValueCount.get("bird"), equalTo(7.0));
List<FieldValueCounter> counters = (List<FieldValueCounter>) fieldValueCounterRepository.findAll();
assertThat(counters.size(), equalTo(2));
fieldValueCounterRepository.delete(myCounter);
assertThat(fieldValueCounterRepository.findOne(myFVCounter), is(nullValue()));
fieldValueCounterRepository.delete(yourCounter.getName());
assertThat(fieldValueCounterRepository.findOne(yourFVCounter), is(nullValue()));
counters = (List<FieldValueCounter>) fieldValueCounterRepository.findAll();
assertThat(counters.size(), equalTo(0));
}
}