/** * 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 java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Map; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.JobHistory.*; import junit.framework.TestCase; public class TestJobHistoryParsing extends TestCase { ArrayList<PrintWriter> historyWriter = new ArrayList<PrintWriter>(); /** * Listener for a test history log file, it populates JobHistory.JobInfo * object with data from log file. */ static class TestListener implements Listener { JobInfo job; TestListener(JobInfo job) { this.job = job; } // JobHistory.Listener implementation public void handle(RecordTypes recType, Map<JobHistory.Keys, String> values) throws IOException { if (recType == JobHistory.RecordTypes.Job) { job.handle(values); } } } public void testHistoryParsing() throws IOException { // open a test history file Path historyDir = new Path(System.getProperty("test.build.data", "."), "history"); FileSystem fs = FileSystem.getLocal(new JobConf()); if (!fs.mkdirs(historyDir)) { fail("Failed to create history directory"); } Path historyLog = new Path(historyDir, "testlog"); PrintWriter out = new PrintWriter(fs.create(historyLog)); historyWriter.add(out); // log keys and values into history String value1 = "Value has equal=to, \"quotes\" and spaces in it"; String value2 = "Value has \n new line \n and " + "dot followed by new line .\n in it "; String value3 = "Value has characters: " + "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./" + "~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"'ZXCVBNM<>?" + "\t\b\n\f\"\n in it"; String value4 = "Value ends with escape\\"; String value5 = "Value ends with \\\" \\.\n"; // Log the history version JobHistory.MetaInfoManager.logMetaInfo(historyWriter); JobHistory.log(historyWriter, RecordTypes.Job, new JobHistory.Keys[] {Keys.JOBTRACKERID, Keys.TRACKER_NAME, Keys.JOBNAME, Keys.JOBCONF, Keys.USER}, new String[] {value1, value2, value3, value4, value5}); // close history file out.close(); historyWriter.remove(out); // parse history String jobId = "job_200809171136_0001"; // random jobid for tesing JobHistory.JobInfo job = new JobHistory.JobInfo(jobId); JobHistory.parseHistoryFromFS(historyLog.toString(), new TestListener(job), fs); // validate keys and values assertEquals(value1, job.get(Keys.JOBTRACKERID)); assertEquals(value2, job.get(Keys.TRACKER_NAME)); assertEquals(value3, job.get(Keys.JOBNAME)); assertEquals(value4, job.get(Keys.JOBCONF)); assertEquals(value5, job.get(Keys.USER)); } }