package org.dcache.util;
import org.junit.Test;
import org.slf4j.MDC;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
public class NDCTests
{
@Test
public void shouldBeNullInitially()
{
givenEmptyNdc();
// REVISIT: is this correct?
assertThat(ndc(), is(nullValue()));
}
@Test
public void shouldPopOnEmpty()
{
givenEmptyNdc();
String popped = NDC.pop();
assertThat(ndc(), is(nullValue()));
assertThat(popped, is(nullValue()));
}
@Test
public void shouldHaveItemAfterPush()
{
givenEmptyNdc();
NDC.push("item-1");
assertThat(ndc(), is("item-1"));
}
@Test
public void shouldBeNullAfterPushPop()
{
givenNdc().push("item-1");
String popped = NDC.pop();
// REVISIT: is this correct?
assertThat(ndc(), is(nullValue()));
assertThat(popped, is("item-1"));
}
@Test
public void shouldBeNullAfterPushClear()
{
givenNdc().push("item-1");
NDC.clear();
// REVISIT: is this correct?
assertThat(ndc(), is(nullValue()));
}
@Test
public void shouldHaveFirstItemAfterTwoPushThenPop()
{
givenNdc().push("item-1").push("item-2");
String popped = NDC.pop();
assertThat(ndc(), is("item-1"));
assertThat(popped, is ("item-2"));
}
@Test
public void shouldBeNullAfterTwoPushesThenTwoPops()
{
givenNdc().push("item-1").push("item-2").pop();
String popped = NDC.pop();
// REVISIT: is this correct?
assertThat(ndc(), is(nullValue()));
assertThat(popped, is("item-1"));
}
@Test
public void shouldBeTwoItemsAfterTwoPushesThenPopThenPush()
{
givenNdc().push("item-1").push("item-2").pop();
NDC.push("item-3");
assertThat(ndc(), is("item-1 item-3"));
}
@Test
public void shouldRestoreClonedValueAfterSet()
{
NDC cloned = givenClonedNdc(givenNdc().push("item-1"));
givenNdc().push("item-2");
NDC.set(cloned);
assertThat(ndc(), is("item-1"));
}
private String ndc()
{
return MDC.get(NDC.KEY_NDC);
}
private NdcBuilder givenNdc()
{
return new NdcBuilder();
}
private NDC givenClonedNdc(NdcBuilder builder)
{
return builder.clone();
}
private void givenEmptyNdc()
{
NDC.clear();
}
private class NdcBuilder
{
public NdcBuilder()
{
NDC.clear();
}
public NdcBuilder push(String value)
{
NDC.push(value);
return this;
}
public NdcBuilder pop()
{
NDC.pop();
return this;
}
public NDC clone()
{
return NDC.cloneNdc();
}
}
}