/** * 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 com.pinterest.terrapin.tools; import com.google.common.collect.ImmutableList; import com.pinterest.terrapin.thrift.generated.PartitionerType; import com.pinterest.terrapin.zookeeper.FileSetInfo; import com.pinterest.terrapin.zookeeper.ZooKeeperManager; import org.apache.zookeeper.CreateMode; import org.junit.Test; import org.mockito.ArgumentCaptor; import java.io.ByteArrayInputStream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class TerrapinAdminTest { @Test public void testLockFileSet() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); FileSetInfo fileSetInfo = new FileSetInfo(); String fileSet = "test_fileset"; when(mockZKManager.getFileSetInfo(eq(fileSet))).thenReturn(fileSetInfo); doNothing().when(mockZKManager).lockFileSet(anyString(), any(FileSetInfo.class), eq(CreateMode.EPHEMERAL)); TerrapinAdmin.lockFileSet(mockZKManager, fileSet); verify(mockZKManager, times(1)).lockFileSet(eq(fileSet), eq(fileSetInfo), eq(CreateMode.EPHEMERAL)); } @Test(expected = IllegalArgumentException.class) public void testLockNonExistingFileSet() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); String fileSet = "test_fileset"; when(mockZKManager.getFileSetInfo(eq(fileSet))).thenReturn(null); TerrapinAdmin.lockFileSet(mockZKManager, fileSet); } @Test public void testUnlockFileSet() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); String fileSet = "test_fileset"; doNothing().when(mockZKManager).unlockFileSet(anyString()); TerrapinAdmin.unlockFileSet(mockZKManager, fileSet); verify(mockZKManager, times(1)).unlockFileSet(eq(fileSet)); } @Test public void testRollbackFileSet() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); fileSetInfo.servingInfo = new FileSetInfo.ServingInfo("/hdfs/path/4", "resource", 1000, PartitionerType.MODULUS); String fileSet = "test_fileset"; when(mockZKManager.getFileSetInfo(eq(fileSet))).thenReturn(fileSetInfo); doNothing().when(mockZKManager).setFileSetInfo(anyString(), any(FileSetInfo.class)); TerrapinAdmin.rollbackFileSet(mockZKManager, fileSet, fileSetInfo, 1); ArgumentCaptor<String> fileSetCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<FileSetInfo> fileSetInfoCaptor = ArgumentCaptor.forClass(FileSetInfo.class); verify(mockZKManager).setFileSetInfo(fileSetCaptor.capture(), fileSetInfoCaptor.capture()); assertEquals(fileSet, fileSetCaptor.getValue()); assertEquals("/hdfs/path/2", fileSetInfoCaptor.getValue().servingInfo.hdfsPath); assertEquals(1, fileSetInfoCaptor.getValue().oldServingInfoList.size()); assertEquals("/hdfs/path/3", fileSetInfoCaptor.getValue().oldServingInfoList.get(0).hdfsPath); } @Test(expected = IllegalArgumentException.class) public void testRollbackFileSetWithInvalidVersion() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); fileSetInfo.servingInfo = new FileSetInfo.ServingInfo("/hdfs/path/4", "resource", 1000, PartitionerType.MODULUS); String fileSet = "test_fileset"; when(mockZKManager.getFileSetInfo(eq(fileSet))).thenReturn(fileSetInfo); doNothing().when(mockZKManager).setFileSetInfo(anyString(), any(FileSetInfo.class)); TerrapinAdmin.rollbackFileSet(mockZKManager, fileSet, fileSetInfo, 3); } @Test public void testSelectFileSetRollbackVersion() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); int expectedVersionIndex = 1; ByteArrayInputStream inputStream = new ByteArrayInputStream((String.valueOf(expectedVersionIndex) + "\n").getBytes()); int versionIndex = TerrapinAdmin.selectFileSetRollbackVersion(fileSetInfo, inputStream); assertEquals(expectedVersionIndex, versionIndex); } @Test(expected = IllegalArgumentException.class) public void testSelectFileSetRollbackVersionWithEmptyInput() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); TerrapinAdmin.selectFileSetRollbackVersion(fileSetInfo, inputStream); } @Test(expected = IllegalArgumentException.class) public void testSelectFileSetRollbackVersionWhenNoAvailableVersions() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.numVersionsToKeep = 2; fileSetInfo.oldServingInfoList = ImmutableList.of(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); TerrapinAdmin.selectFileSetRollbackVersion(fileSetInfo, inputStream); } @Test public void testConfirmFileSetRollbackVersion() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.fileSetName = "test_fileset"; fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); fileSetInfo.servingInfo = new FileSetInfo.ServingInfo("/hdfs/path/4", "resource", 1000, PartitionerType.MODULUS); ByteArrayInputStream inputStream = new ByteArrayInputStream("y\n".getBytes()); assertTrue(TerrapinAdmin.confirmFileSetRollbackVersion(fileSetInfo.fileSetName, fileSetInfo, 1, inputStream)); } @Test public void testConfirmFileSetRollbackVersionWithEmptyInput() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.fileSetName = "test_fileset"; fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); fileSetInfo.servingInfo = new FileSetInfo.ServingInfo("/hdfs/path/4", "resource", 1000, PartitionerType.MODULUS); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); assertFalse(TerrapinAdmin.confirmFileSetRollbackVersion(fileSetInfo.fileSetName, fileSetInfo, 1, inputStream)); } @Test public void testConfirmFileSetRollbackVersionWithOtherInput() { FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.fileSetName = "test_fileset"; fileSetInfo.numVersionsToKeep = 4; fileSetInfo.oldServingInfoList = ImmutableList.of( new FileSetInfo.ServingInfo("/hdfs/path/1", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/2", "resource", 1000, PartitionerType.MODULUS), new FileSetInfo.ServingInfo("/hdfs/path/3", "resource", 1000, PartitionerType.MODULUS) ); fileSetInfo.servingInfo = new FileSetInfo.ServingInfo("/hdfs/path/4", "resource", 1000, PartitionerType.MODULUS); ByteArrayInputStream inputStream = new ByteArrayInputStream("other input".getBytes()); assertFalse(TerrapinAdmin.confirmFileSetRollbackVersion(fileSetInfo.fileSetName, fileSetInfo, 1, inputStream)); } @Test public void testConfirmFileSetDeletion() { ByteArrayInputStream inputStream = new ByteArrayInputStream("y\n".getBytes()); assertTrue(TerrapinAdmin.confirmFileSetDeletion("test_fileset", inputStream)); inputStream = new ByteArrayInputStream(new byte[0]); assertFalse(TerrapinAdmin.confirmFileSetDeletion("test_fileset", inputStream)); inputStream = new ByteArrayInputStream("other input".getBytes()); assertFalse(TerrapinAdmin.confirmFileSetDeletion("test_fileset", inputStream)); } @Test public void testDeleteFileSet() throws Exception { ZooKeeperManager mockZKManager = mock(ZooKeeperManager.class); FileSetInfo fileSetInfo = new FileSetInfo(); fileSetInfo.fileSetName = "test_fileset"; when(mockZKManager.getFileSetInfo(eq(fileSetInfo.fileSetName))).thenReturn(fileSetInfo); doNothing().when(mockZKManager).lockFileSet(anyString(), any(FileSetInfo.class)); doNothing().when(mockZKManager).setFileSetInfo(anyString(), any(FileSetInfo.class)); TerrapinAdmin.deleteFileSet(mockZKManager, fileSetInfo.fileSetName); verify(mockZKManager, times(1)) .setFileSetInfo(eq(fileSetInfo.fileSetName), any(FileSetInfo.class)); assertTrue(fileSetInfo.deleted); } }