/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.model.Initiator; import com.emc.storageos.db.client.model.StringSet; import com.google.common.base.Joiner; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import org.junit.Assert; import org.junit.Test; import com.emc.storageos.db.client.model.ExportGroup; import com.emc.storageos.db.client.model.ExportMask; import com.emc.storageos.db.client.model.StringMap; import com.emc.storageos.volumecontroller.impl.block.ExportMaskPolicy; public class ExportMaskUtilsTest { @Test public void testExportMaskUtils() { // TODO add code to make this work ExportGroup egp = new ExportGroup(); ExportMask e1 = new ExportMask(); e1.setLabel("e1"); ExportMask e2 = new ExportMask(); e2.setLabel("e2"); ExportMask e3 = new ExportMask(); e3.setLabel("e3"); ExportMask e4 = new ExportMask(); e4.setLabel("e4"); ExportMask e5 = new ExportMask(); e5.setLabel("e5"); StringMap e1vols = new StringMap(); e1vols.put("k1", "v1"); e1vols.put("k2", "v2"); e1vols.put("k3", "v3"); e1.setExistingVolumes(e1vols); StringMap e2vols = new StringMap(); e2vols.put("k1", "v1"); e2.setExistingVolumes(e2vols); StringMap e3vols = new StringMap(); e3vols.put("k1", "v1"); e3vols.put("k2", "v2"); e3.setExistingVolumes(e3vols); StringMap e4vols = new StringMap(); e4.setExistingVolumes(e4vols); StringMap e5vols = new StringMap(); e5vols.put("k1", "v1"); e5vols.put("k2", "v2"); e5vols.put("k3", "v3"); e5vols.put("k4", "v1"); e5vols.put("k5", "v2"); e5vols.put("k6", "v3"); e5.setExistingVolumes(e5vols); List<ExportMask> sortedMasks = new ArrayList<ExportMask>(); sortedMasks.add(e1); sortedMasks.add(e2); sortedMasks.add(e3); sortedMasks.add(e4); sortedMasks.add(e5); ExportMaskPolicy policy1 = new ExportMaskPolicy(); Map<ExportMask, ExportMaskPolicy> maskPolicyMap = new HashMap<ExportMask, ExportMaskPolicy>(); maskPolicyMap.put(e1, policy1); maskPolicyMap.put(e2, policy1); maskPolicyMap.put(e3, policy1); maskPolicyMap.put(e4, policy1); maskPolicyMap.put(e5, policy1); sortedMasks = ExportMaskUtils.sortMasksByEligibility(maskPolicyMap, egp); Assert.assertEquals(sortedMasks.get(0).getLabel(), "e4"); Assert.assertEquals(sortedMasks.get(1).getLabel(), "e2"); Assert.assertEquals(sortedMasks.get(2).getLabel(), "e3"); Assert.assertEquals(sortedMasks.get(3).getLabel(), "e1"); Assert.assertEquals(sortedMasks.get(4).getLabel(), "e5"); } @Test public void testExportMaskUtilsCSG() { // TODO add code to make this work ExportGroup egp = new ExportGroup(); ExportMask e1 = new ExportMask(); e1.setLabel("e1"); ExportMask e2 = new ExportMask(); e2.setLabel("e2"); ExportMask e3 = new ExportMask(); e3.setLabel("e3"); ExportMask e4 = new ExportMask(); e4.setLabel("e4"); ExportMask e5 = new ExportMask(); e5.setLabel("e5"); StringMap e1vols = new StringMap(); e1vols.put("k1", "v1"); e1vols.put("k2", "v2"); e1vols.put("k3", "v3"); e1.setExistingVolumes(e1vols); StringMap e2vols = new StringMap(); e2vols.put("k1", "v1"); e2.setExistingVolumes(e2vols); StringMap e3vols = new StringMap(); e3vols.put("k1", "v1"); e3vols.put("k2", "v2"); e3.setExistingVolumes(e3vols); StringMap e4vols = new StringMap(); e4.setExistingVolumes(e4vols); StringMap e5vols = new StringMap(); e5vols.put("k1", "v1"); e5vols.put("k2", "v2"); e5vols.put("k3", "v3"); e5vols.put("k4", "v1"); e5vols.put("k5", "v2"); e5vols.put("k6", "v3"); e5.setExistingVolumes(e5vols); List<ExportMask> sortedMasks = new ArrayList<ExportMask>(); sortedMasks.add(e1); sortedMasks.add(e2); sortedMasks.add(e3); sortedMasks.add(e4); sortedMasks.add(e5); ExportMaskPolicy policy1simple = new ExportMaskPolicy(); policy1simple.simpleMask = true; ExportMaskPolicy policy2notsimple = new ExportMaskPolicy(); policy2notsimple.simpleMask = false; Map<ExportMask, ExportMaskPolicy> maskPolicyMap = new HashMap<ExportMask, ExportMaskPolicy>(); maskPolicyMap.put(e1, policy1simple); maskPolicyMap.put(e2, policy1simple); maskPolicyMap.put(e3, policy2notsimple); maskPolicyMap.put(e4, policy1simple); maskPolicyMap.put(e5, policy2notsimple); sortedMasks = ExportMaskUtils.sortMasksByEligibility(maskPolicyMap, egp); Assert.assertEquals(sortedMasks.get(0).getLabel(), "e3"); Assert.assertEquals(sortedMasks.get(1).getLabel(), "e5"); Assert.assertEquals(sortedMasks.get(2).getLabel(), "e4"); Assert.assertEquals(sortedMasks.get(3).getLabel(), "e2"); Assert.assertEquals(sortedMasks.get(4).getLabel(), "e1"); } @Test public void testExportMaskUtilsFAST() { // TODO add code to make this work ExportGroup egp = new ExportGroup(); ExportMask e1 = new ExportMask(); e1.setLabel("e1"); e1.setMaskName("e1"); ExportMask e2 = new ExportMask(); e2.setLabel("e2-FAST1"); e2.setMaskName("e2-FAST1"); ExportMask e3 = new ExportMask(); e3.setLabel("e3"); e3.setMaskName("e3"); ExportMask e4 = new ExportMask(); e4.setLabel("e4-FAST1"); e4.setMaskName("e4-FAST1"); ExportMask e5 = new ExportMask(); e5.setLabel("e5"); e5.setMaskName("e5"); StringMap e1vols = new StringMap(); e1vols.put("k1", "v1"); e1vols.put("k2", "v2"); e1vols.put("k3", "v3"); e1.setExistingVolumes(e1vols); StringMap e2vols = new StringMap(); e2vols.put("k1", "v1"); e2.setExistingVolumes(e2vols); StringMap e3vols = new StringMap(); e3vols.put("k1", "v1"); e3vols.put("k2", "v2"); e3.setExistingVolumes(e3vols); StringMap e4vols = new StringMap(); e4.setExistingVolumes(e4vols); StringMap e5vols = new StringMap(); e5vols.put("k1", "v1"); e5vols.put("k2", "v2"); e5vols.put("k3", "v3"); e5vols.put("k4", "v1"); e5vols.put("k5", "v2"); e5vols.put("k6", "v3"); e5.setExistingVolumes(e5vols); List<ExportMask> sortedMasks = new ArrayList<ExportMask>(); sortedMasks.add(e1); sortedMasks.add(e2); sortedMasks.add(e3); sortedMasks.add(e4); sortedMasks.add(e5); ExportMaskPolicy policy1simple = new ExportMaskPolicy(); policy1simple.simpleMask = true; policy1simple.setExportType(ExportMaskPolicy.EXPORT_TYPE.PHANTOM.name()); ExportMaskPolicy policy2notsimple = new ExportMaskPolicy(); policy2notsimple.simpleMask = false; StringSet fastTiers = new StringSet(); fastTiers.add("FAST1"); ExportMaskPolicy policy3simpleFAST = new ExportMaskPolicy(); policy3simpleFAST.simpleMask = true; policy3simpleFAST.setTierPolicies(fastTiers); Map<ExportMask, ExportMaskPolicy> maskPolicyMap = new HashMap<ExportMask, ExportMaskPolicy>(); maskPolicyMap.put(e1, policy1simple); maskPolicyMap.put(e2, policy3simpleFAST); maskPolicyMap.put(e3, policy1simple); maskPolicyMap.put(e4, policy3simpleFAST); maskPolicyMap.put(e5, policy1simple); sortedMasks = ExportMaskUtils.sortMasksByEligibility(maskPolicyMap, egp); System.out.println(Joiner.on('\n').join(sortedMasks)); Assert.assertEquals(sortedMasks.get(0).getLabel(), "e4-FAST1"); Assert.assertEquals(sortedMasks.get(1).getLabel(), "e2-FAST1"); Assert.assertEquals(sortedMasks.get(2).getLabel(), "e3"); Assert.assertEquals(sortedMasks.get(3).getLabel(), "e1"); Assert.assertEquals(sortedMasks.get(4).getLabel(), "e5"); } @Test public void testInitiatorOrdering() { String HOST1 = "host1"; String HOST2 = "host2"; String HOST3 = "host3"; Initiator i1 = new Initiator("FC", "200000000001", HOST1, "cluster1", true); i1.setId(URIUtil.createId(Initiator.class)); Initiator i2 = new Initiator("FC", "200000000002", HOST1, "cluster1", true); i2.setId(URIUtil.createId(Initiator.class)); Initiator i3 = new Initiator("FC", "200000000003", HOST2, "cluster1", true); i3.setId(URIUtil.createId(Initiator.class)); Initiator i4 = new Initiator("FC", "200000000004", HOST2, "cluster1", true); i4.setId(URIUtil.createId(Initiator.class)); Initiator i5 = new Initiator("FC", "200000000005", HOST3, "cluster1", true); i5.setId(URIUtil.createId(Initiator.class)); Multimap<String, Initiator> testMap = HashMultimap.create(); testMap.put(HOST1, i1); testMap.put(HOST1, i2); Assert.assertEquals("HOST1 doesn't have expected number of initiators", 2, testMap.get(HOST1).size()); System.out.println(Joiner.on(',').join(testMap.get(HOST1))); testMap.put(HOST2, i3); testMap.put(HOST2, i4); testMap.put(HOST2, i4); testMap.put(HOST2, i4); Assert.assertEquals("HOST2 doesn't have expected number of initiators", 2, testMap.get(HOST2).size()); System.out.println(Joiner.on(',').join(testMap.get(HOST2))); testMap.put(HOST3, i5); Assert.assertEquals("HOST3 doesn't have expected number of initiators", 1, testMap.get(HOST3).size()); System.out.println(Joiner.on(',').join(testMap.get(HOST3))); Set<Initiator> initiatorSet = new TreeSet<>(); initiatorSet.add(i1); initiatorSet.add(i2); initiatorSet.add(i3); initiatorSet.add(i4); initiatorSet.add(i4); initiatorSet.add(i4); initiatorSet.add(i4); initiatorSet.add(i5); initiatorSet.add(i5); Assert.assertEquals("Size of initiatorHashSet is unexpected", 5, initiatorSet.size()); // Test Initiator.hashCode System.out.println("################# Testing Initiator.hashCode #################"); // Make same as i5 Initiator i6 = new Initiator("FC", "200000000005", HOST3, "cluster1", true); i6.setId(i5.getId()); Assert.assertEquals("i5 and i6 should be equal", i5, i6); Assert.assertEquals("Hash codes are different", i5.hashCode(), i6.hashCode()); System.out.println(String.format("i5.hashCode = %d i6.hashCode = %d", i5.hashCode(), i6.hashCode())); // Strange case 1: Same port WWN, but different ID Initiator i7 = new Initiator("FC", "200000000005", HOST3, "cluster1", true); i7.setId(URIUtil.createId(Initiator.class)); Assert.assertNotEquals("i5 and i7 should not be equal", i5, i7); Assert.assertNotEquals("Hash codes are the same", i5.hashCode(), i7.hashCode()); System.out.println(String.format("i5.hashCode = %d i7.hashCode = %d", i5.hashCode(), i7.hashCode())); // Strange case 2: Different port WWN, but same ID Initiator i8 = new Initiator("FC", "200000000008", HOST3, "cluster1", true); i8.setId(i5.getId()); Assert.assertNotEquals("i5 and i8 should not be equal", i5, i8); Assert.assertNotEquals("Hash codes are the same", i5.hashCode(), i8.hashCode()); System.out.println(String.format("i5.hashCode = %d i8.hashCode = %d", i5.hashCode(), i8.hashCode())); Map<Initiator, String> map = new HashMap<>(); map.put(i1, "Initiator 1"); map.put(i2, "Initiator 2"); map.put(i3, "Initiator 3"); map.put(i4, "Initiator 4"); map.put(i5, "Initiator 5"); map.put(i6, "Initiator 6"); map.put(i7, "Initiator 7"); map.put(i8, "Initiator 8"); // map.size() should be 7 because i5 and i6 are equivalent based on hashCode Assert.assertEquals("Unexpected map size", 7, map.size()); System.out.println(String.format("map.keys = %s", Joiner.on(',').join(map.keySet()))); System.out.println(String.format("map.entries = %s", Joiner.on(',').join(map.entrySet()))); } }