/*
* Copyright 2015 Evgeny Dolganov (evgenij.dolganov@gmail.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 och.service.props;
import static och.util.Util.*;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
import och.junit.AssertExt;
import och.service.props.impl.MapProps;
import och.service.props.impl.NetPropsClient;
import och.service.props.impl.NetPropsServer;
import och.service.props.net.GetUpdateResp;
import och.util.concurrent.ExecutorsUtil;
import org.junit.Test;
@SuppressWarnings("rawtypes")
public class NetPropsTest extends AssertExt {
String host = "localhost";
int port = 11011;
int maxThreads = 10;
@Test
public void test_wait_conn_to_init() throws Exception{
String secureKey = "DSF@s";
MapProps serverProps = new MapProps(map("1", "1", "2", "2"));
NetPropsServer server = new NetPropsServer(port, maxThreads, secureKey, serverProps);
try {
System.setProperty(NetPropsClient.CONFIG_SLEEP_TO_INIT_RETRY, "10");
System.setProperty(NetPropsClient.CONFIG_RETRY_COUNT, "30");
Future<Map<String, String>> f = ExecutorsUtil.newSingleThreadExecutor("test").submit(()->{
NetPropsClient client = new NetPropsClient(host, port, secureKey, true);
return client.getProps().toMap();
});
Thread.sleep(100);
server.runAsync();
//проверка, что в итоге данные получили
assertEquals(map("1", "1", "2", "2"), f.get());
//проверка новых пропертей после старта сервера
NetPropsClient client1 = new NetPropsClient(host, port, secureKey, true);
assertEquals(map("1", "1", "2", "2"), client1.getProps().toMap());
}finally {
System.setProperty(NetPropsClient.CONFIG_SLEEP_TO_INIT_RETRY, "");
System.setProperty(NetPropsClient.CONFIG_RETRY_COUNT, "");
server.shutdownWait();
}
}
@Test
public void test_net() throws Exception{
String secureKey = "fjfj!!edf";
MapProps serverProps = new MapProps(map("1", "1", "2", "2"));
NetPropsServer server = new NetPropsServer(port, maxThreads, secureKey, serverProps);
server.runAsync();
try {
NetPropsClient client1 = new NetPropsClient(host, port, secureKey, false);
NetPropsClient client2 = new NetPropsClient(host, port, secureKey, false, 50);
Set[] eventsKey1 = {null};
Set[] eventsKey2 = {null};
client1.getProps().addChangedListener((keys) -> eventsKey1[0] = keys);
client2.getProps().addChangedListener((keys) -> eventsKey2[0] = keys);
//load
{
assertEquals(map("1", "1", "2", "2"), client1.getProps().toMap());
assertEquals(map("1", "1", "2", "2"), client2.getProps().toMap());
}
//updates
{
serverProps.putVal("3", "3");
client1.updateFromNetIfNeed();
assertEquals(map("1", "1", "2", "2", "3", "3"), client1.getProps().toMap());
Thread.sleep(100);
assertEquals(map("1", "1", "2", "2", "3", "3"), client2.getProps().toMap());
assertEquals(set("3"), eventsKey1[0]);
assertEquals(set("3"), eventsKey2[0]);
}
//removes
{
serverProps.putVal("3", (String)null);
client1.updateFromNetIfNeed();
assertEquals(map("1", "1", "2", "2"), client1.getProps().toMap());
serverProps.putVal("3", "3");
client1.updateFromNetIfNeed();
assertEquals(map("1", "1", "2", "2", "3", "3"), client1.getProps().toMap());
}
//full updates after reload
{
//reload server
server.shutdownWait();
serverProps.removeVal("1");
server = new NetPropsServer(port, maxThreads, secureKey, serverProps);
server.runAsync();
//неудавшийся релоад с потерей соединения
assertFalse(client1.updateFromNetIfNeed());
assertEquals(map("1", "1", "2", "2", "3", "3"), client1.getProps().toMap());
//удачный релоад
assertTrue(client1.updateFromNetIfNeed());
assertEquals(map("2", "2", "3", "3"), client1.getProps().toMap());
Thread.sleep(100);
assertEquals(map("2", "2", "3", "3"), client2.getProps().toMap());
assertEquals(set("1", "2", "3"), eventsKey1[0]);
assertEquals(set("1", "2", "3"), eventsKey2[0]);
//неверный ключ убирает обновления
{
client1.setSecureKey("some-wrong");
serverProps.putVal("4", "4");
assertFalse(client1.updateFromNetIfNeed());
assertEquals(map("2", "2", "3", "3"), client1.getProps().toMap());
client1.setSecureKey(secureKey);
assertTrue(client1.updateFromNetIfNeed());
assertEquals(map("2", "2", "3", "3", "4", "4"), client1.getProps().toMap());
}
//отсуствие обновлений
eventsKey1[0] = null;
client1.updateFromNetIfNeed();
assertEquals(null, eventsKey1[0]);
}
client1.shutdown();
client2.shutdown();
}finally {
server.shutdownWait();
}
}
@Test
public void test_getUpdates(){
MapProps props = new MapProps(map("1", "1", "2", "2"));
NetPropsServer server = new NetPropsServer(0, 1, "test", props);
long delta1 = server.getDelta();
//old client
{
GetUpdateResp resp = server.getUpdateResp(delta1 - 1);
assertEquals(true, resp.full);
assertEquals(delta1, resp.delta);
assertEquals(map("1", "1", "2", "2"), resp.updated);
}
props.putVal("1", "0");
long delta2 = server.getDelta();
assertFalse(delta1 == delta2);
{
GetUpdateResp resp = server.getUpdateResp(delta1 - 1);
assertEquals(true, resp.full);
assertEquals(delta2, resp.delta);
assertEquals(map("1", "0", "2", "2"), resp.updated);
}
{
GetUpdateResp resp = server.getUpdateResp(delta1);
assertEquals(false, resp.full);
assertEquals(delta2, resp.delta);
assertEquals(map("1", "0"), resp.updated);
}
{
GetUpdateResp resp = server.getUpdateResp(delta2);
assertEquals(null, resp);
}
props.putVal("3", "3");
long delta3 = server.getDelta();
assertFalse(delta2 == delta3);
{
GetUpdateResp resp = server.getUpdateResp(delta1 - 1);
assertEquals(true, resp.full);
assertEquals(delta3, resp.delta);
assertEquals(map("1", "0", "2", "2", "3", "3"), resp.updated);
}
{
GetUpdateResp resp = server.getUpdateResp(delta1);
assertEquals(false, resp.full);
assertEquals(delta3, resp.delta);
assertEquals(map("1", "0", "3", "3"), resp.updated);
}
{
GetUpdateResp resp = server.getUpdateResp(delta2);
assertEquals(false, resp.full);
assertEquals(delta3, resp.delta);
assertEquals(map("3", "3"), resp.updated);
}
{
GetUpdateResp resp = server.getUpdateResp(delta3);
assertEquals(null, resp);
}
}
}