// Copyright 2009 Google Inc. All Rights Reserved.
//
// 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 com.google.enterprise.connector.logging;
import junit.framework.TestCase;
/**
* Unit Test for Nested Diagnostic Context (NDC).
*/
public class NDCTest extends TestCase {
private final String message1 = "message1";
private final String message2 = "message2";
private final String message3 = "message3";
@Override
protected void tearDown() throws Exception {
NDC.remove();
}
/** Test clear(). */
public void testClear() {
NDC.clear();
assertTrue(NDC.getDepth() == 0);
assertEquals(NDC.peek(), "");
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.clear();
assertTrue(NDC.getDepth() == 0);
assertEquals(NDC.peek(), "");
}
/** Test normal push/pop usage. */
public void testPushPop() {
NDC.clear();
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.push(message2);
assertEquals(message2, NDC.peek());
assertTrue(NDC.getDepth() == 2);
NDC.push(message3);
assertEquals(message3, NDC.peek());
assertTrue(NDC.getDepth() == 3);
String value;
value = NDC.pop();
assertEquals(message3, value);
assertEquals(message2, NDC.peek());
assertTrue(NDC.getDepth() == 2);
value = NDC.pop();
assertEquals(message2, value);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
value = NDC.pop();
assertEquals(message1, value);
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
}
/** Test pushAppend usage. */
public void testPushAppend() {
NDC.clear();
NDC.pushAppend(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.pushAppend(message2);
assertEquals(message1 + " " + message2, NDC.peek());
assertTrue(NDC.getDepth() == 2);
NDC.pushAppend(message3);
assertEquals(message1 + " " + message2 + " " + message3, NDC.peek());
assertTrue(NDC.getDepth() == 3);
String value;
NDC.pop();
assertEquals(message1 + " " + message2, NDC.peek());
assertTrue(NDC.getDepth() == 2);
NDC.pop();
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
value = NDC.pop();
assertEquals(message1, value);
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
}
/** Test append usage. */
public void testAppend() {
NDC.clear();
NDC.append(message1);
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.append(message2);
assertEquals(message1 + " " + message2, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.append(message3);
assertEquals(message1 + " " + message2 + " " + message3, NDC.peek());
assertTrue(NDC.getDepth() == 1);
String value = NDC.pop();
assertEquals(message1 + " " + message2 + " " + message3, value);
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
}
/** Test more pops than pushes. */
public void testExtraPop() {
NDC.clear();
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.pop();
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
NDC.pop();
assertEquals("", NDC.peek());
assertTrue(NDC.getDepth() == 0);
}
/** Test NDC values are different between threads. */
public void testThreadLocal() {
NDC.clear();
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
Thread t = new OtherThread("NDCChildThread");
t.start();
try {
Thread.sleep(50);
} catch (InterruptedException e) {}
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.push(message3);
assertEquals(message3, NDC.peek());
assertTrue(NDC.getDepth() == 2);
// Wait for child thread to exit.
try {
t.join();
} catch (InterruptedException e) {}
// Make sure our context is unmolested.
assertEquals(message3, NDC.peek());
assertTrue(NDC.getDepth() == 2);
}
private class OtherThread extends Thread {
public OtherThread(String name) {
super(name);
}
@Override
public void run() {
assertTrue(NDC.getDepth() == 0);
NDC.push(message2);
assertEquals(message2, NDC.peek());
assertTrue(NDC.getDepth() == 1);
try {
Thread.sleep(75);
} catch (InterruptedException e) {}
assertEquals(message2, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.remove();
}
}
/** Test remove(). */
public void testRemove() {
NDC.clear();
NDC.push(message1);
assertEquals(message1, NDC.peek());
assertTrue(NDC.getDepth() == 1);
NDC.remove();
// Bogus test, as these calls will recreate the NDC context stack.
// But at least I can verify that the new context stack would be empty.
assertTrue(NDC.getDepth() == 0);
assertEquals(NDC.peek(), "");
}
}