/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.kafka.common.internals;
import org.apache.kafka.common.TopicPartition;
import org.junit.Test;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class PartitionStatesTest {
@Test
public void testSet() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
LinkedHashMap<TopicPartition, String> expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 2), "baz 2");
expected.put(new TopicPartition("baz", 3), "baz 3");
checkState(states, expected);
states.set(new LinkedHashMap<TopicPartition, String>());
checkState(states, new LinkedHashMap<TopicPartition, String>());
}
private LinkedHashMap<TopicPartition, String> createMap() {
LinkedHashMap<TopicPartition, String> map = new LinkedHashMap<>();
map.put(new TopicPartition("foo", 2), "foo 2");
map.put(new TopicPartition("blah", 2), "blah 2");
map.put(new TopicPartition("blah", 1), "blah 1");
map.put(new TopicPartition("baz", 2), "baz 2");
map.put(new TopicPartition("foo", 0), "foo 0");
map.put(new TopicPartition("baz", 3), "baz 3");
return map;
}
private void checkState(PartitionStates<String> states, LinkedHashMap<TopicPartition, String> expected) {
assertEquals(expected.keySet(), states.partitionSet());
assertEquals(expected.size(), states.size());
List<PartitionStates.PartitionState<String>> statesList = new ArrayList<>();
for (Map.Entry<TopicPartition, String> entry : expected.entrySet()) {
statesList.add(new PartitionStates.PartitionState<>(entry.getKey(), entry.getValue()));
assertTrue(states.contains(entry.getKey()));
}
assertEquals(statesList, states.partitionStates());
}
@Test
public void testMoveToEnd() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
states.moveToEnd(new TopicPartition("baz", 2));
LinkedHashMap<TopicPartition, String> expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("baz", 2), "baz 2");
checkState(states, expected);
states.moveToEnd(new TopicPartition("foo", 2));
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("baz", 2), "baz 2");
expected.put(new TopicPartition("foo", 2), "foo 2");
checkState(states, expected);
// no-op
states.moveToEnd(new TopicPartition("foo", 2));
checkState(states, expected);
// partition doesn't exist
states.moveToEnd(new TopicPartition("baz", 5));
checkState(states, expected);
// topic doesn't exist
states.moveToEnd(new TopicPartition("aaa", 2));
checkState(states, expected);
}
@Test
public void testUpdateAndMoveToEnd() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
states.updateAndMoveToEnd(new TopicPartition("foo", 0), "foo 0 updated");
LinkedHashMap<TopicPartition, String> expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 2), "baz 2");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("foo", 0), "foo 0 updated");
checkState(states, expected);
states.updateAndMoveToEnd(new TopicPartition("baz", 2), "baz 2 updated");
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("foo", 0), "foo 0 updated");
expected.put(new TopicPartition("baz", 2), "baz 2 updated");
checkState(states, expected);
// partition doesn't exist
states.updateAndMoveToEnd(new TopicPartition("baz", 5), "baz 5 new");
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("foo", 0), "foo 0 updated");
expected.put(new TopicPartition("baz", 2), "baz 2 updated");
expected.put(new TopicPartition("baz", 5), "baz 5 new");
checkState(states, expected);
// topic doesn't exist
states.updateAndMoveToEnd(new TopicPartition("aaa", 2), "aaa 2 new");
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 2), "foo 2");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 3), "baz 3");
expected.put(new TopicPartition("foo", 0), "foo 0 updated");
expected.put(new TopicPartition("baz", 2), "baz 2 updated");
expected.put(new TopicPartition("baz", 5), "baz 5 new");
expected.put(new TopicPartition("aaa", 2), "aaa 2 new");
checkState(states, expected);
}
@Test
public void testPartitionValues() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
List<String> expected = new ArrayList<>();
expected.add("foo 2");
expected.add("foo 0");
expected.add("blah 2");
expected.add("blah 1");
expected.add("baz 2");
expected.add("baz 3");
assertEquals(expected, states.partitionStateValues());
}
@Test
public void testClear() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
states.clear();
checkState(states, new LinkedHashMap<TopicPartition, String>());
}
@Test
public void testRemove() {
PartitionStates<String> states = new PartitionStates<>();
LinkedHashMap<TopicPartition, String> map = createMap();
states.set(map);
states.remove(new TopicPartition("foo", 2));
LinkedHashMap<TopicPartition, String> expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("blah", 1), "blah 1");
expected.put(new TopicPartition("baz", 2), "baz 2");
expected.put(new TopicPartition("baz", 3), "baz 3");
checkState(states, expected);
states.remove(new TopicPartition("blah", 1));
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("baz", 2), "baz 2");
expected.put(new TopicPartition("baz", 3), "baz 3");
checkState(states, expected);
states.remove(new TopicPartition("baz", 3));
expected = new LinkedHashMap<>();
expected.put(new TopicPartition("foo", 0), "foo 0");
expected.put(new TopicPartition("blah", 2), "blah 2");
expected.put(new TopicPartition("baz", 2), "baz 2");
checkState(states, expected);
}
}