package games.strategy.engine.vault;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import games.strategy.debug.ClientLogger;
import games.strategy.engine.message.ChannelMessenger;
import games.strategy.engine.message.unifiedmessenger.UnifiedMessenger;
import games.strategy.net.ClientMessenger;
import games.strategy.net.IMessenger;
import games.strategy.net.IServerMessenger;
import games.strategy.net.MacFinder;
import games.strategy.net.Node;
import games.strategy.net.ServerMessenger;
import games.strategy.test.TestUtil;
/**
* Comment(KG): This test is broken, If you run each test individually they all work, but when running all test in the
* class some will fail.
* This is because the lifecycle of the UnifiedMessenger (and internal classes such as NIOReader/Writer) are broken.
* The UnifiedMessenger will create a new ThreadPool with each instantiation, and this pool is never shutdown.
*/
public class VaultTest {
private static int SERVER_PORT = -1;
private IServerMessenger serverMessenger;
private IMessenger clientMessenger;
private Vault clientVault;
private Vault serverVault;
@Before
public void setUp() throws IOException {
SERVER_PORT = TestUtil.getUniquePort();
serverMessenger = new ServerMessenger("Server", SERVER_PORT);
serverMessenger.setAcceptNewConnections(true);
final String mac = MacFinder.getHashedMacAddress();
clientMessenger = new ClientMessenger("localhost", SERVER_PORT, "client1", mac);
final UnifiedMessenger serverUM = new UnifiedMessenger(serverMessenger);
final UnifiedMessenger clientUM = new UnifiedMessenger(clientMessenger);
serverVault = new Vault(new ChannelMessenger(serverUM));
clientVault = new Vault(new ChannelMessenger(clientUM));
Thread.yield();
}
@After
public void tearDown() {
try {
if (serverMessenger != null) {
serverMessenger.shutDown();
}
} catch (final Exception e) {
ClientLogger.logQuietly(e);
}
try {
if (clientMessenger != null) {
clientMessenger.shutDown();
}
} catch (final Exception e) {
ClientLogger.logQuietly(e);
}
}
@Test
public void testLocal() throws NotUnlockedException {
final IServerMessenger messenger = mock(IServerMessenger.class);
try {
when(messenger.getLocalNode()).thenReturn(new Node("dummy", InetAddress.getLocalHost(), 0));
} catch (final UnknownHostException e) {
ClientLogger.logQuietly(e);
}
final UnifiedMessenger unifiedMessenger = new UnifiedMessenger(messenger);
final ChannelMessenger channelMessenger = new ChannelMessenger(unifiedMessenger);
// RemoteMessenger remoteMessenger = new RemoteMessenger(unifiedMessenger);
final Vault vault = new Vault(channelMessenger);
final byte[] data = new byte[] {0, 1, 2, 3, 4, 5};
final VaultID id = vault.lock(data);
vault.unlock(id);
assertArrayEquals(data, vault.get(id));
vault.release(id);
}
/**
* Passes when run individually.
* Fails when run as part of a suite that consists of multiple server/vault tests.
*/
public void temporarilyDisabledSoPleaseRunManuallytestServerLock() throws NotUnlockedException {
final byte[] data = new byte[] {0, 1, 2, 3, 4, 5};
final VaultID id = serverVault.lock(data);
clientVault.waitForID(id, 1000);
assertTrue(clientVault.knowsAbout(id));
serverVault.unlock(id);
clientVault.waitForIdToUnlock(id, 1000);
assertTrue(clientVault.isUnlocked(id));
assertEquals(data, clientVault.get(id));
assertEquals(serverVault.get(id), clientVault.get(id));
clientVault.release(id);
}
@Test
public void testClientLock() throws NotUnlockedException {
final byte[] data = new byte[] {0, 1, 2, 3, 4, 5};
final VaultID id = clientVault.lock(data);
serverVault.waitForID(id, 1000);
assertTrue(serverVault.knowsAbout(id));
clientVault.unlock(id);
serverVault.waitForIdToUnlock(id, 1000);
assertTrue(serverVault.isUnlocked(id));
assertArrayEquals(data, serverVault.get(id));
assertArrayEquals(clientVault.get(id), serverVault.get(id));
clientVault.release(id);
}
/**
* Passes when run individually.
* Fails when run as part of a suite that consists of multiple server/vault tests.
*/
public void temporarilyDisabledSoPleaseRunManuallytestMultiple() throws NotUnlockedException {
final byte[] data1 = new byte[] {0, 1, 2, 3, 4, 5};
final byte[] data2 = new byte[] {0xE, 0xF, 2, 1, 3, 1, 2, 12, 3, 31, 124, 12, 1};
final VaultID id1 = serverVault.lock(data1);
final VaultID id2 = serverVault.lock(data2);
clientVault.waitForID(id1, 2000);
clientVault.waitForID(id2, 2000);
assertTrue(clientVault.knowsAbout(id1));
assertTrue(clientVault.knowsAbout(id2));
serverVault.unlock(id1);
serverVault.unlock(id2);
clientVault.waitForIdToUnlock(id1, 1000);
clientVault.waitForIdToUnlock(id2, 1000);
assertTrue(clientVault.isUnlocked(id1));
assertTrue(clientVault.isUnlocked(id2));
assertEquals(data1, clientVault.get(id1));
assertEquals(data2, clientVault.get(id2));
clientVault.release(id1);
clientVault.release(id2);
}
@Test
public void testJoin() {
final byte[] data = new byte[] {0, 1, 2, 3, 4, 5};
final byte[] joined = Vault.joinDataAndKnown(data);
assertArrayEquals(new byte[] {0xC, 0xA, 0xF, 0xE, 0xB, 0xA, 0xB, 0xE, 0, 1, 2, 3, 4, 5}, joined);
}
}