HADOOP-12181. Fix intermittent test failure of TestZKSignerSecretProvider. Contributed by Masatake Iwasaki.
This commit is contained in:
parent
4492b9e730
commit
5f688453df
|
@ -22,12 +22,21 @@ import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mockito;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.timeout;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
public class TestZKSignerSecretProvider {
|
public class TestZKSignerSecretProvider {
|
||||||
|
|
||||||
private TestingServer zkServer;
|
private TestingServer zkServer;
|
||||||
|
|
||||||
|
// rollover every 2 sec
|
||||||
|
private final int timeout = 4000;
|
||||||
|
private final long rolloverFrequency = Long.valueOf(timeout / 2);
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
zkServer = new TestingServer();
|
zkServer = new TestingServer();
|
||||||
|
@ -45,14 +54,14 @@ public class TestZKSignerSecretProvider {
|
||||||
// Test just one ZKSignerSecretProvider to verify that it works in the
|
// Test just one ZKSignerSecretProvider to verify that it works in the
|
||||||
// simplest case
|
// simplest case
|
||||||
public void testOne() throws Exception {
|
public void testOne() throws Exception {
|
||||||
long rolloverFrequency = 15 * 1000; // rollover every 15 sec
|
|
||||||
// use the same seed so we can predict the RNG
|
// use the same seed so we can predict the RNG
|
||||||
long seed = System.currentTimeMillis();
|
long seed = System.currentTimeMillis();
|
||||||
Random rand = new Random(seed);
|
Random rand = new Random(seed);
|
||||||
byte[] secret2 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secret2 = Long.toString(rand.nextLong()).getBytes();
|
||||||
byte[] secret1 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secret1 = Long.toString(rand.nextLong()).getBytes();
|
||||||
byte[] secret3 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secret3 = Long.toString(rand.nextLong()).getBytes();
|
||||||
ZKSignerSecretProvider secretProvider = new ZKSignerSecretProvider(seed);
|
ZKSignerSecretProvider secretProvider =
|
||||||
|
spy(new ZKSignerSecretProvider(seed));
|
||||||
Properties config = new Properties();
|
Properties config = new Properties();
|
||||||
config.setProperty(
|
config.setProperty(
|
||||||
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
||||||
|
@ -68,7 +77,7 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.assertEquals(2, allSecrets.length);
|
Assert.assertEquals(2, allSecrets.length);
|
||||||
Assert.assertArrayEquals(secret1, allSecrets[0]);
|
Assert.assertArrayEquals(secret1, allSecrets[0]);
|
||||||
Assert.assertNull(allSecrets[1]);
|
Assert.assertNull(allSecrets[1]);
|
||||||
Thread.sleep((rolloverFrequency + 2000));
|
verify(secretProvider, timeout(timeout).times(1)).rollSecret();
|
||||||
|
|
||||||
currentSecret = secretProvider.getCurrentSecret();
|
currentSecret = secretProvider.getCurrentSecret();
|
||||||
allSecrets = secretProvider.getAllSecrets();
|
allSecrets = secretProvider.getAllSecrets();
|
||||||
|
@ -76,7 +85,7 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.assertEquals(2, allSecrets.length);
|
Assert.assertEquals(2, allSecrets.length);
|
||||||
Assert.assertArrayEquals(secret2, allSecrets[0]);
|
Assert.assertArrayEquals(secret2, allSecrets[0]);
|
||||||
Assert.assertArrayEquals(secret1, allSecrets[1]);
|
Assert.assertArrayEquals(secret1, allSecrets[1]);
|
||||||
Thread.sleep((rolloverFrequency + 2000));
|
verify(secretProvider, timeout(timeout).times(2)).rollSecret();
|
||||||
|
|
||||||
currentSecret = secretProvider.getCurrentSecret();
|
currentSecret = secretProvider.getCurrentSecret();
|
||||||
allSecrets = secretProvider.getAllSecrets();
|
allSecrets = secretProvider.getAllSecrets();
|
||||||
|
@ -84,7 +93,7 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.assertEquals(2, allSecrets.length);
|
Assert.assertEquals(2, allSecrets.length);
|
||||||
Assert.assertArrayEquals(secret3, allSecrets[0]);
|
Assert.assertArrayEquals(secret3, allSecrets[0]);
|
||||||
Assert.assertArrayEquals(secret2, allSecrets[1]);
|
Assert.assertArrayEquals(secret2, allSecrets[1]);
|
||||||
Thread.sleep((rolloverFrequency + 2000));
|
verify(secretProvider, timeout(timeout).times(3)).rollSecret();
|
||||||
} finally {
|
} finally {
|
||||||
secretProvider.destroy();
|
secretProvider.destroy();
|
||||||
}
|
}
|
||||||
|
@ -92,7 +101,6 @@ public class TestZKSignerSecretProvider {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMultipleInit() throws Exception {
|
public void testMultipleInit() throws Exception {
|
||||||
long rolloverFrequency = 15 * 1000; // rollover every 15 sec
|
|
||||||
// use the same seed so we can predict the RNG
|
// use the same seed so we can predict the RNG
|
||||||
long seedA = System.currentTimeMillis();
|
long seedA = System.currentTimeMillis();
|
||||||
Random rand = new Random(seedA);
|
Random rand = new Random(seedA);
|
||||||
|
@ -108,9 +116,12 @@ public class TestZKSignerSecretProvider {
|
||||||
rand = new Random(seedC);
|
rand = new Random(seedC);
|
||||||
byte[] secretC2 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretC2 = Long.toString(rand.nextLong()).getBytes();
|
||||||
byte[] secretC1 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretC1 = Long.toString(rand.nextLong()).getBytes();
|
||||||
ZKSignerSecretProvider secretProviderA = new ZKSignerSecretProvider(seedA);
|
ZKSignerSecretProvider secretProviderA =
|
||||||
ZKSignerSecretProvider secretProviderB = new ZKSignerSecretProvider(seedB);
|
spy(new ZKSignerSecretProvider(seedA));
|
||||||
ZKSignerSecretProvider secretProviderC = new ZKSignerSecretProvider(seedC);
|
ZKSignerSecretProvider secretProviderB =
|
||||||
|
spy(new ZKSignerSecretProvider(seedB));
|
||||||
|
ZKSignerSecretProvider secretProviderC =
|
||||||
|
spy(new ZKSignerSecretProvider(seedC));
|
||||||
Properties config = new Properties();
|
Properties config = new Properties();
|
||||||
config.setProperty(
|
config.setProperty(
|
||||||
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
||||||
|
@ -152,7 +163,9 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.fail("It appears that they all agreed on the same secret, but "
|
Assert.fail("It appears that they all agreed on the same secret, but "
|
||||||
+ "not one of the secrets they were supposed to");
|
+ "not one of the secrets they were supposed to");
|
||||||
}
|
}
|
||||||
Thread.sleep((rolloverFrequency + 2000));
|
verify(secretProviderA, timeout(timeout).times(1)).rollSecret();
|
||||||
|
verify(secretProviderB, timeout(timeout).times(1)).rollSecret();
|
||||||
|
verify(secretProviderC, timeout(timeout).times(1)).rollSecret();
|
||||||
|
|
||||||
currentSecretA = secretProviderA.getCurrentSecret();
|
currentSecretA = secretProviderA.getCurrentSecret();
|
||||||
allSecretsA = secretProviderA.getAllSecrets();
|
allSecretsA = secretProviderA.getAllSecrets();
|
||||||
|
@ -187,8 +200,6 @@ public class TestZKSignerSecretProvider {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMultipleUnsychnronized() throws Exception {
|
public void testMultipleUnsychnronized() throws Exception {
|
||||||
long rolloverFrequency = 15 * 1000; // rollover every 15 sec
|
|
||||||
// use the same seed so we can predict the RNG
|
|
||||||
long seedA = System.currentTimeMillis();
|
long seedA = System.currentTimeMillis();
|
||||||
Random rand = new Random(seedA);
|
Random rand = new Random(seedA);
|
||||||
byte[] secretA2 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretA2 = Long.toString(rand.nextLong()).getBytes();
|
||||||
|
@ -200,8 +211,10 @@ public class TestZKSignerSecretProvider {
|
||||||
byte[] secretB2 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretB2 = Long.toString(rand.nextLong()).getBytes();
|
||||||
byte[] secretB1 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretB1 = Long.toString(rand.nextLong()).getBytes();
|
||||||
byte[] secretB3 = Long.toString(rand.nextLong()).getBytes();
|
byte[] secretB3 = Long.toString(rand.nextLong()).getBytes();
|
||||||
ZKSignerSecretProvider secretProviderA = new ZKSignerSecretProvider(seedA);
|
ZKSignerSecretProvider secretProviderA =
|
||||||
ZKSignerSecretProvider secretProviderB = new ZKSignerSecretProvider(seedB);
|
spy(new ZKSignerSecretProvider(seedA));
|
||||||
|
ZKSignerSecretProvider secretProviderB =
|
||||||
|
spy(new ZKSignerSecretProvider(seedB));
|
||||||
Properties config = new Properties();
|
Properties config = new Properties();
|
||||||
config.setProperty(
|
config.setProperty(
|
||||||
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
ZKSignerSecretProvider.ZOOKEEPER_CONNECTION_STRING,
|
||||||
|
@ -217,7 +230,7 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.assertEquals(2, allSecretsA.length);
|
Assert.assertEquals(2, allSecretsA.length);
|
||||||
Assert.assertArrayEquals(secretA1, allSecretsA[0]);
|
Assert.assertArrayEquals(secretA1, allSecretsA[0]);
|
||||||
Assert.assertNull(allSecretsA[1]);
|
Assert.assertNull(allSecretsA[1]);
|
||||||
Thread.sleep((rolloverFrequency + 2000));
|
verify(secretProviderA, timeout(timeout).times(1)).rollSecret();
|
||||||
|
|
||||||
currentSecretA = secretProviderA.getCurrentSecret();
|
currentSecretA = secretProviderA.getCurrentSecret();
|
||||||
allSecretsA = secretProviderA.getAllSecrets();
|
allSecretsA = secretProviderA.getAllSecrets();
|
||||||
|
@ -235,7 +248,8 @@ public class TestZKSignerSecretProvider {
|
||||||
Assert.assertEquals(2, allSecretsA.length);
|
Assert.assertEquals(2, allSecretsA.length);
|
||||||
Assert.assertArrayEquals(secretA2, allSecretsB[0]);
|
Assert.assertArrayEquals(secretA2, allSecretsB[0]);
|
||||||
Assert.assertArrayEquals(secretA1, allSecretsB[1]);
|
Assert.assertArrayEquals(secretA1, allSecretsB[1]);
|
||||||
Thread.sleep((rolloverFrequency));
|
verify(secretProviderA, timeout(timeout).times(2)).rollSecret();
|
||||||
|
verify(secretProviderB, timeout(timeout).times(1)).rollSecret();
|
||||||
|
|
||||||
currentSecretA = secretProviderA.getCurrentSecret();
|
currentSecretA = secretProviderA.getCurrentSecret();
|
||||||
allSecretsA = secretProviderA.getAllSecrets();
|
allSecretsA = secretProviderA.getAllSecrets();
|
||||||
|
@ -261,10 +275,10 @@ public class TestZKSignerSecretProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ServletContext getDummyServletContext() {
|
private ServletContext getDummyServletContext() {
|
||||||
ServletContext servletContext = Mockito.mock(ServletContext.class);
|
ServletContext servletContext = mock(ServletContext.class);
|
||||||
Mockito.when(servletContext.getAttribute(ZKSignerSecretProvider
|
when(servletContext.getAttribute(ZKSignerSecretProvider
|
||||||
.ZOOKEEPER_SIGNER_SECRET_PROVIDER_CURATOR_CLIENT_ATTRIBUTE))
|
.ZOOKEEPER_SIGNER_SECRET_PROVIDER_CURATOR_CLIENT_ATTRIBUTE))
|
||||||
.thenReturn(null);
|
.thenReturn(null);
|
||||||
return servletContext;
|
return servletContext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1440,6 +1440,9 @@ Release 2.8.0 - UNRELEASED
|
||||||
HADOOP-12467. Respect user-defined JAVA_LIBRARY_PATH in Windows Hadoop
|
HADOOP-12467. Respect user-defined JAVA_LIBRARY_PATH in Windows Hadoop
|
||||||
scripts. (Radhey Shah via wheat9)
|
scripts. (Radhey Shah via wheat9)
|
||||||
|
|
||||||
|
HADOOP-12181. Fix intermittent test failure of TestZKSignerSecretProvider.
|
||||||
|
(Masatake Iwasaki via wheat9)
|
||||||
|
|
||||||
Release 2.7.3 - UNRELEASED
|
Release 2.7.3 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
Loading…
Reference in New Issue