/** * 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.mapred; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; import static org.junit.Assert.*; public class TestTaskStatus { private static final Log LOG = LogFactory.getLog(TestTaskStatus.class); @Test public void testMapTaskStatusStartAndFinishTimes() { checkTaskStatues(true); } @Test public void testReduceTaskStatusStartAndFinishTimes() { checkTaskStatues(false); } /** * Private utility method which ensures uniform testing of newly created * TaskStatus object. * * @param isMap * true to test map task status, false for reduce. */ private void checkTaskStatues(boolean isMap) { TaskStatus status = null; if (isMap) { status = new MapTaskStatus(); } else { status = new ReduceTaskStatus(); } long currentTime = System.currentTimeMillis(); // first try to set the finish time before // start time is set. status.setFinishTime(currentTime); assertEquals("Finish time of the task status set without start time", 0, status.getFinishTime()); // Now set the start time to right time. status.setStartTime(currentTime); assertEquals("Start time of the task status not set correctly.", currentTime, status.getStartTime()); // try setting wrong start time to task status. long wrongTime = -1; status.setStartTime(wrongTime); assertEquals( "Start time of the task status is set to wrong negative value", currentTime, status.getStartTime()); // finally try setting wrong finish time i.e. negative value. status.setFinishTime(wrongTime); assertEquals("Finish time of task status is set to wrong negative value", 0, status.getFinishTime()); status.setFinishTime(currentTime); assertEquals("Finish time of the task status not set correctly.", currentTime, status.getFinishTime()); // test with null task-diagnostics TaskStatus ts = ((TaskStatus)status.clone()); ts.setDiagnosticInfo(null); ts.setDiagnosticInfo(""); ts.setStateString(null); ts.setStateString(""); ((TaskStatus)status.clone()).statusUpdate(ts); // test with null state-string ((TaskStatus)status.clone()).statusUpdate(0, null, null); ((TaskStatus)status.clone()).statusUpdate(0, "", null); ((TaskStatus)status.clone()).statusUpdate(null, 0, "", null, 1); } /** * Test the {@link TaskStatus} against large sized task-diagnostic-info and * state-string. Does the following * - create Map/Reduce TaskStatus such that the task-diagnostic-info and * state-string are small strings and check their contents * - append them with small string and check their contents * - append them with large string and check their size * - update the status using statusUpdate() calls and check the size/contents * - create Map/Reduce TaskStatus with large string and check their size */ @Test public void testTaskDiagnosticsAndStateString() { // check the default case String test = "hi"; final int maxSize = 16; TaskStatus status = new TaskStatus(null, 0, 0, null, test, test, null, null, null) { @Override protected int getMaxStringSize() { return maxSize; } @Override public void addFetchFailedMap(TaskAttemptID mapTaskId) { } @Override public boolean getIsMap() { return false; } }; assertEquals("Small diagnostic info test failed", status.getDiagnosticInfo(), test); assertEquals("Small state string test failed", status.getStateString(), test); // now append some small string and check String newDInfo = test.concat(test); status.setDiagnosticInfo(test); status.setStateString(newDInfo); assertEquals("Small diagnostic info append failed", newDInfo, status.getDiagnosticInfo()); assertEquals("Small state-string append failed", newDInfo, status.getStateString()); // update the status with small state strings TaskStatus newStatus = (TaskStatus)status.clone(); String newSInfo = "hi1"; newStatus.setStateString(newSInfo); status.statusUpdate(newStatus); newDInfo = newDInfo.concat(newStatus.getDiagnosticInfo()); assertEquals("Status-update on diagnostic-info failed", newDInfo, status.getDiagnosticInfo()); assertEquals("Status-update on state-string failed", newSInfo, status.getStateString()); newSInfo = "hi2"; status.statusUpdate(0, newSInfo, null); assertEquals("Status-update on state-string failed", newSInfo, status.getStateString()); newSInfo = "hi3"; status.statusUpdate(null, 0, newSInfo, null, 0); assertEquals("Status-update on state-string failed", newSInfo, status.getStateString()); // now append each with large string String large = "hihihihihihihihihihi"; // 20 chars status.setDiagnosticInfo(large); status.setStateString(large); assertEquals("Large diagnostic info append test failed", maxSize, status.getDiagnosticInfo().length()); assertEquals("Large state-string append test failed", maxSize, status.getStateString().length()); // update a large status with large strings newStatus.setDiagnosticInfo(large + "0"); newStatus.setStateString(large + "1"); status.statusUpdate(newStatus); assertEquals("Status-update on diagnostic info failed", maxSize, status.getDiagnosticInfo().length()); assertEquals("Status-update on state-string failed", maxSize, status.getStateString().length()); status.statusUpdate(0, large + "2", null); assertEquals("Status-update on state-string failed", maxSize, status.getStateString().length()); status.statusUpdate(null, 0, large + "3", null, 0); assertEquals("Status-update on state-string failed", maxSize, status.getStateString().length()); // test passing large string in constructor status = new TaskStatus(null, 0, 0, null, large, large, null, null, null) { @Override protected int getMaxStringSize() { return maxSize; } @Override public void addFetchFailedMap(TaskAttemptID mapTaskId) { } @Override public boolean getIsMap() { return false; } }; assertEquals("Large diagnostic info test failed", maxSize, status.getDiagnosticInfo().length()); assertEquals("Large state-string test failed", maxSize, status.getStateString().length()); } }