blob: 54b75da23bf68c388a080c6e6ab285f93f9bda9b [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hadoop.security.token;
import java.io.*;
import java.util.Arrays;
import org.apache.hadoop.io.*;
import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenIdentifier;
import junit.framework.TestCase;
/** Unit tests for Token */
public class TestToken extends TestCase {
static boolean isEqual(Object a, Object b) {
return a == null ? b == null : a.equals(b);
}
static boolean checkEqual(Token<TokenIdentifier> a, Token<TokenIdentifier> b) {
return Arrays.equals(a.getIdentifier(), b.getIdentifier())
&& Arrays.equals(a.getPassword(), b.getPassword())
&& isEqual(a.getKind(), b.getKind())
&& isEqual(a.getService(), b.getService());
}
/**
* Test token serialization
*/
public void testTokenSerialization() throws IOException {
// Get a token
Token<TokenIdentifier> sourceToken = new Token<TokenIdentifier>();
sourceToken.setService(new Text("service"));
// Write it to an output buffer
DataOutputBuffer out = new DataOutputBuffer();
sourceToken.write(out);
// Read the token back
DataInputBuffer in = new DataInputBuffer();
in.reset(out.getData(), out.getLength());
Token<TokenIdentifier> destToken = new Token<TokenIdentifier>();
destToken.readFields(in);
assertTrue(checkEqual(sourceToken, destToken));
}
private static void checkUrlSafe(String str) throws Exception {
int len = str.length();
for(int i=0; i < len; ++i) {
char ch = str.charAt(i);
if (ch == '-') continue;
if (ch == '_') continue;
if (ch >= '0' && ch <= '9') continue;
if (ch >= 'A' && ch <= 'Z') continue;
if (ch >= 'a' && ch <= 'z') continue;
fail("Encoded string " + str +
" has invalid character at position " + i);
}
}
public static void testEncodeWritable() throws Exception {
String[] values = new String[]{"", "a", "bb", "ccc", "dddd", "eeeee",
"ffffff", "ggggggg", "hhhhhhhh", "iiiiiiiii",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM" +
"NOPQRSTUVWXYZ01234567890!@#$%^&*()-=_+[]{}|;':,./<>?"};
Token<AbstractDelegationTokenIdentifier> orig;
Token<AbstractDelegationTokenIdentifier> copy =
new Token<AbstractDelegationTokenIdentifier>();
// ensure that for each string the input and output values match
for(int i=0; i< values.length; ++i) {
String val = values[i];
System.out.println("Input = " + val);
orig = new Token<AbstractDelegationTokenIdentifier>(val.getBytes(),
val.getBytes(), new Text(val), new Text(val));
String encode = orig.encodeToUrlString();
copy.decodeFromUrlString(encode);
assertEquals(orig, copy);
checkUrlSafe(encode);
}
}
}