blob: 2a6ee9d09b29950861074ae9fac4fa245eced242 [file] [log] [blame]
/**
* Copyright 2012 Big Switch Networks, Inc.
*
* Licensed 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 net.floodlightcontroller.devicemanager.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
import org.junit.Test;
import net.floodlightcontroller.devicemanager.IDeviceService.DeviceField;
import junit.framework.TestCase;
/**
*
* @author gregor
*
*/
public class DeviceUniqueIndexTest extends TestCase {
protected Entity e1a;
protected Entity e1b;
protected Device d1;
protected Entity e2;
protected Entity e2alt;
protected Entity e3;
protected Entity e4;
@Override
protected void setUp() throws Exception {
super.setUp();
e1a = new Entity(1L, (short)1, 1, 1L, 1, new Date());
e1b = new Entity(1L, (short)2, 1, 1L, 1, new Date());
List<Entity> d1Entities = new ArrayList<Entity>(2);
d1Entities.add(e1a);
d1Entities.add(e1b);
d1 = new Device(null, Long.valueOf(1), null, null, d1Entities, null);
// e2 and e2 alt match in MAC and VLAN
e2 = new Entity(2L, (short)2, 2, 2L, 2, new Date());
e2alt = new Entity(2, (short)2, null, null, null, null);
// IP is null
e3 = new Entity(3L, (short)3, null, 3L, 3, new Date());
// IP and switch and port are null
e4 = new Entity(4L, (short)4, null, null, null, new Date());
}
/*
* Checks that the iterator it returns the elements in the Set expected
* Doesn't check how often an element is returned as long it's at least
* once
*/
protected void verifyIterator(Set<Long> expected, Iterator<Long> it) {
HashSet<Long> actual = new HashSet<Long>();
while (it.hasNext()) {
actual.add(it.next());
}
assertEquals(expected, actual);
}
@Test
public void testDeviceUniqueIndex() {
DeviceUniqueIndex idx1 = new DeviceUniqueIndex(
EnumSet.of(DeviceField.MAC,
DeviceField.VLAN));
idx1.updateIndex(d1, d1.getDeviceKey());
idx1.updateIndex(e2, 2L);
//-------------
// Test findByEntity lookups
assertEquals(Long.valueOf(1L), idx1.findByEntity(e1a));
assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
assertEquals(Long.valueOf(2L), idx1.findByEntity(e2));
// we didn't add e2alt but since they key fields are the same we
// should find it
assertEquals(Long.valueOf(2L), idx1.findByEntity(e2alt));
assertEquals(null, idx1.findByEntity(e3));
assertEquals(null, idx1.findByEntity(e4));
//-------------
// Test getAll()
HashSet<Long> expectedKeys = new HashSet<Long>();
expectedKeys.add(1L);
expectedKeys.add(2L);
verifyIterator(expectedKeys, idx1.getAll());
//-------------
// Test queryByEntity()
verifyIterator(Collections.<Long>singleton(1L),
idx1.queryByEntity(e1a));
verifyIterator(Collections.<Long>singleton(1L),
idx1.queryByEntity(e1b));
verifyIterator(Collections.<Long>singleton(2L),
idx1.queryByEntity(e2));
verifyIterator(Collections.<Long>singleton(2L),
idx1.queryByEntity(e2alt));
assertEquals(false, idx1.queryByEntity(e3).hasNext());
assertEquals(false, idx1.queryByEntity(e3).hasNext());
//-------------
// Test removal
idx1.removeEntity(e1a, 42L); // No-op. e1a isn't mapped to this key
assertEquals(Long.valueOf(1L), idx1.findByEntity(e1a));
idx1.removeEntity(e1a, 1L);
assertEquals(null, idx1.findByEntity(e1a));
assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
assertEquals(Long.valueOf(2L), idx1.findByEntity(e2));
idx1.removeEntity(e2);
assertEquals(null, idx1.findByEntity(e2));
assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
//-------------
// Test null keys
DeviceUniqueIndex idx2 = new DeviceUniqueIndex(
EnumSet.of(DeviceField.IPV4,
DeviceField.SWITCH));
// only one key field is null
idx2.updateIndex(e3, 3L);
assertEquals(Long.valueOf(3L), idx2.findByEntity(e3));
e3.ipv4Address = 3;
assertEquals(null, idx2.findByEntity(e3));
// all key fields are null
idx2.updateIndex(e4, 4L);
assertEquals(null, idx2.findByEntity(e4));
Device d4 = new Device(null, 4L, null, null, Collections.<Entity>singleton(e4), null);
idx2.updateIndex(d4, 4L);
assertEquals(null, idx2.findByEntity(e4));
//-------------
// entity already exists with different deviceKey
DeviceUniqueIndex idx3 = new DeviceUniqueIndex(
EnumSet.of(DeviceField.MAC,
DeviceField.VLAN));
idx3.updateIndex(e1a, 42L);
assertEquals(false, idx3.updateIndex(d1, 1L));
// TODO: shouldn't this fail as well so that the behavior
// is consistent?
idx3.updateIndex(e1a, 1L);
// anyways. We can now add d1 ;-)
assertEquals(true, idx3.updateIndex(d1, 1L));
}
}