blob: 3454db9308b286f4dc7d203056f0865c66a491ce [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.hdfs.protocol;
import org.apache.hadoop.hdfs.server.namenode.ha.ReadOnly;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.assertEquals;
/**
* Testing class for {@link ReadOnly} annotation on {@link ClientProtocol}.
*/
public class TestReadOnly {
private static final Method[] ALL_METHODS = ClientProtocol.class.getMethods();
private static final Set<String> READONLY_METHOD_NAMES = new HashSet<>(
Arrays.asList(
"getBlockLocations",
"getServerDefaults",
"getStoragePolicies",
"getStoragePolicy",
"getListing",
"getSnapshottableDirListing",
"getPreferredBlockSize",
"listCorruptFileBlocks",
"getFileInfo",
"isFileClosed",
"getFileLinkInfo",
"getLocatedFileInfo",
"getContentSummary",
"getLinkTarget",
"getSnapshotDiffReport",
"getSnapshotDiffReportListing",
"listCacheDirectives",
"listCachePools",
"getAclStatus",
"getEZForPath",
"listEncryptionZones",
"listReencryptionStatus",
"getXAttrs",
"listXAttrs",
"checkAccess",
"getErasureCodingPolicies",
"getErasureCodingCodecs",
"getErasureCodingPolicy",
"listOpenFiles",
"getStats",
"getReplicatedBlockStats",
"getECBlockGroupStats",
"getDatanodeReport",
"getDatanodeStorageReport",
"getDataEncryptionKey",
"getCurrentEditLogTxid",
"getEditsFromTxid",
"getQuotaUsage",
"msync",
"getHAServiceState",
"getECTopologyResultForPolicies"
)
);
@Test
public void testReadOnly() {
for (Method m : ALL_METHODS) {
boolean expected = READONLY_METHOD_NAMES.contains(m.getName());
checkIsReadOnly(m.getName(), expected);
}
}
private void checkIsReadOnly(String methodName, boolean expected) {
for (Method m : ALL_METHODS) {
// Note here we only check the FIRST result of overloaded methods
// with the same name. The assumption is that all these methods should
// share the same annotation.
if (m.getName().equals(methodName)) {
assertEquals("Expected ReadOnly for method '" + methodName +
"' to be " + expected,
m.isAnnotationPresent(ReadOnly.class), expected);
return;
}
}
throw new IllegalArgumentException("Unknown method name: " + methodName);
}
}