/** * 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.hive.ql.plan; import java.util.LinkedList; import java.util.List; import junit.framework.Assert; import org.apache.hadoop.hive.ql.plan.TezEdgeProperty.EdgeType; import org.apache.hadoop.mapred.JobConf; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class TestTezWork { private static final String MR_JAR_PROPERTY = "tmpjars"; private List<BaseWork> nodes; private TezWork work; @Before public void setup() throws Exception { nodes = new LinkedList<BaseWork>(); work = new TezWork("", null); addWork(5); } private void addWork(int n) { for (int i = 0; i < n; ++i) { BaseWork w = new MapWork(); nodes.add(w); work.add(w); } } @Test public void testAdd() throws Exception { Assert.assertEquals(work.getAllWork().size(), nodes.size()); Assert.assertEquals(work.getRoots().size(), nodes.size()); Assert.assertEquals(work.getLeaves().size(), nodes.size()); for (BaseWork w: nodes) { Assert.assertEquals(work.getParents(w).size(), 0); Assert.assertEquals(work.getChildren(w).size(), 0); } } @Test public void testConnect() throws Exception { BaseWork parent = nodes.get(0); BaseWork child = nodes.get(1); TezEdgeProperty edgeProp = new TezEdgeProperty(EdgeType.SIMPLE_EDGE); work.connect(parent, child, edgeProp); Assert.assertEquals(work.getParents(child).size(), 1); Assert.assertEquals(work.getChildren(parent).size(), 1); Assert.assertEquals(work.getChildren(parent).get(0), child); Assert.assertEquals(work.getParents(child).get(0), parent); Assert.assertTrue(work.getRoots().contains(parent) && !work.getRoots().contains(child)); Assert.assertTrue(!work.getLeaves().contains(parent) && work.getLeaves().contains(child)); for (BaseWork w: nodes) { if (w == parent || w == child) { continue; } Assert.assertEquals(work.getParents(w).size(), 0); Assert.assertEquals(work.getChildren(w).size(), 0); } Assert.assertEquals(work.getEdgeProperty(parent, child).getEdgeType(), EdgeType.SIMPLE_EDGE); } @Test public void testBroadcastConnect() throws Exception { BaseWork parent = nodes.get(0); BaseWork child = nodes.get(1); TezEdgeProperty edgeProp = new TezEdgeProperty(EdgeType.BROADCAST_EDGE); work.connect(parent, child, edgeProp); Assert.assertEquals(work.getParents(child).size(), 1); Assert.assertEquals(work.getChildren(parent).size(), 1); Assert.assertEquals(work.getChildren(parent).get(0), child); Assert.assertEquals(work.getParents(child).get(0), parent); Assert.assertTrue(work.getRoots().contains(parent) && !work.getRoots().contains(child)); Assert.assertTrue(!work.getLeaves().contains(parent) && work.getLeaves().contains(child)); for (BaseWork w: nodes) { if (w == parent || w == child) { continue; } Assert.assertEquals(work.getParents(w).size(), 0); Assert.assertEquals(work.getChildren(w).size(), 0); } Assert.assertEquals(work.getEdgeProperty(parent, child).getEdgeType(), EdgeType.BROADCAST_EDGE); } @Test public void testDisconnect() throws Exception { BaseWork parent = nodes.get(0); BaseWork children[] = {nodes.get(1), nodes.get(2)}; TezEdgeProperty edgeProp = new TezEdgeProperty(EdgeType.SIMPLE_EDGE); work.connect(parent, children[0], edgeProp); work.connect(parent, children[1], edgeProp); work.disconnect(parent, children[0]); Assert.assertTrue(work.getChildren(parent).contains(children[1])); Assert.assertTrue(!work.getChildren(parent).contains(children[0])); Assert.assertTrue(work.getRoots().contains(parent) && work.getRoots().contains(children[0]) && !work.getRoots().contains(children[1])); Assert.assertTrue(!work.getLeaves().contains(parent) && work.getLeaves().contains(children[0]) && work.getLeaves().contains(children[1])); } @Test public void testRemove() throws Exception { BaseWork parent = nodes.get(0); BaseWork children[] = {nodes.get(1), nodes.get(2)}; TezEdgeProperty edgeProp = new TezEdgeProperty(EdgeType.SIMPLE_EDGE); work.connect(parent, children[0], edgeProp); work.connect(parent, children[1], edgeProp); work.remove(parent); Assert.assertEquals(work.getParents(children[0]).size(), 0); Assert.assertEquals(work.getParents(children[1]).size(), 0); Assert.assertEquals(work.getAllWork().size(), nodes.size()-1); Assert.assertEquals(work.getRoots().size(), nodes.size()-1); Assert.assertEquals(work.getLeaves().size(), nodes.size()-1); } @Test public void testGetAllWork() throws Exception { TezEdgeProperty edgeProp = new TezEdgeProperty(EdgeType.SIMPLE_EDGE); for (int i = 4; i > 0; --i) { work.connect(nodes.get(i), nodes.get(i-1), edgeProp); } List<BaseWork> sorted = work.getAllWork(); for (int i = 0; i < 5; ++i) { Assert.assertEquals(sorted.get(i), nodes.get(4-i)); } } @Test public void testConfigureJars() throws Exception { final JobConf conf = new JobConf(); conf.set(MR_JAR_PROPERTY, "file:///tmp/foo1.jar"); BaseWork baseWork = Mockito.mock(BaseWork.class); Mockito.doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { conf.set(MR_JAR_PROPERTY, "file:///tmp/foo2.jar"); return null; } }).when(baseWork).configureJobConf(conf); work.add(baseWork); work.configureJobConfAndExtractJars(conf); Assert.assertEquals("file:///tmp/foo1.jar,file:///tmp/foo2.jar", conf.get(MR_JAR_PROPERTY)); } @Test public void testConfigureJarsNoExtraJars() throws Exception { final JobConf conf = new JobConf(); conf.set(MR_JAR_PROPERTY, "file:///tmp/foo1.jar"); BaseWork baseWork = Mockito.mock(BaseWork.class); work.add(baseWork); work.configureJobConfAndExtractJars(conf); Assert.assertEquals("file:///tmp/foo1.jar", conf.get(MR_JAR_PROPERTY)); } @Test public void testConfigureJarsWithNull() throws Exception { final JobConf conf = new JobConf(); conf.set(MR_JAR_PROPERTY, "file:///tmp/foo1.jar"); BaseWork baseWork = Mockito.mock(BaseWork.class); Mockito.doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { conf.unset(MR_JAR_PROPERTY); return null; } }).when(baseWork).configureJobConf(conf); work.add(baseWork); work.configureJobConfAndExtractJars(conf); Assert.assertEquals("file:///tmp/foo1.jar", conf.get(MR_JAR_PROPERTY)); } @Test public void testConfigureJarsStartingWithNull() throws Exception { final JobConf conf = new JobConf(); conf.unset(MR_JAR_PROPERTY); BaseWork baseWork = Mockito.mock(BaseWork.class); Mockito.doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { conf.setStrings(MR_JAR_PROPERTY, "file:///tmp/foo1.jar", "file:///tmp/foo2.jar"); return null; } }).when(baseWork).configureJobConf(conf); work.add(baseWork); work.configureJobConfAndExtractJars(conf); Assert.assertEquals("file:///tmp/foo1.jar,file:///tmp/foo2.jar", conf.get(MR_JAR_PROPERTY)); } }