/*******************************************************************************
* Copyright (c) 2006-2010 eBay 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
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.tests.common.util;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.apache.commons.lang.SystemUtils;
import org.junit.Assert;
import org.mortbay.util.MultiMap;
import org.mortbay.util.UrlEncoded;
public final class NVAssert {
private NVAssert() {
/* prevent instantiation */
}
/**
* Compare two NV strings and report failure in a human readable form.
* <p>
* Key order is irrelevant, if all of the keys exist in both sides it is considered equivalent.
*
* @param expected
* the control to check against.
* @param actual
* the actual NV to check.
*/
public static void assertEquals(String expected, String actual) {
// Speedy check first.
if (expected.equals(actual)) {
// It's the same.
return;
}
Map<String, String> expectedMap = parseNV(expected);
Map<String, String> actualMap = parseNV(actual);
Assert.assertEquals(humanReadable(expectedMap),
humanReadable(actualMap));
}
/**
* Simply makes the map readable by humans, which in turn makes the test results more meaningful and easier to read.
* With an added benefit that the Eclipse Junit views will highlight the differences in a much clearer fashion.
*
* @param nvmap
* the nvmap to represent in human readable form
* @return the human readable form.
*/
private static String humanReadable(Map<String, String> nvmap) {
StringBuilder str = new StringBuilder();
boolean needsDelim = false;
for (Entry<String, String> entry : nvmap.entrySet()) {
if (needsDelim) {
str.append("@").append(SystemUtils.LINE_SEPARATOR);
}
str.append('&');
str.append(entry.getKey()).append("=");
str.append(entry.getValue());
needsDelim = true;
}
return str.toString();
}
/**
* Using Jetty internal utility methods, parse an NV map using industry standard mechanisms.
* <p>
* Resulting map utilizes TreeMap to gain benefit of key sorting.
*
* @param rawnv
* the raw NV string
* @return the TreeMap of String pairs
*/
@SuppressWarnings("unchecked")
private static Map<String, String> parseNV(String rawnv) {
MultiMap mm = new MultiMap();
UrlEncoded.decodeTo(rawnv, mm, "UTF-8");
Map<String, String> nvmap = new TreeMap<String, String>();
Iterator<String> keyIter = mm.keySet().iterator();
while(keyIter.hasNext()) {
String key = keyIter.next();
String value = mm.getString(key);
nvmap.put(key, value);
}
return nvmap;
}
}