/* Copyright 2014 Google Inc. All Rights Reserved. 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 com.google.security.zynamics.binnavi.Debug.Models.Breakpoints; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import com.google.common.collect.Sets; import com.google.security.zynamics.binnavi.Common.CommonTestObjects; import com.google.security.zynamics.binnavi.debug.models.breakpoints.BreakpointAddress; import com.google.security.zynamics.binnavi.debug.models.breakpoints.BreakpointManager; import com.google.security.zynamics.binnavi.debug.models.breakpoints.enums.BreakpointStatus; import com.google.security.zynamics.binnavi.debug.models.breakpoints.enums.BreakpointType; import com.google.security.zynamics.binnavi.disassembly.Modules.MockModule; import com.google.security.zynamics.binnavi.disassembly.UnrelocatedAddress; import com.google.security.zynamics.zylib.disassembly.CAddress; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test class for the class CBreakpointManager */ @RunWith(JUnit4.class) public final class CBreakpointManagerTest { private BreakpointManager m_manager; private final MockModule m_module = CommonTestObjects.MODULE; @Before public void setUp() { m_manager = new BreakpointManager(); m_manager.addBreakpoints(BreakpointType.REGULAR, CommonTestObjects.BP_ADDRESS_123_SET); m_manager.addBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x456))))); m_manager.addBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x789))))); m_manager.addBreakpoints(BreakpointType.ECHO, Sets.newHashSet(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x111))))); m_manager.addBreakpoints(BreakpointType.ECHO, Sets.newHashSet(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x222))))); m_manager.addBreakpoints(BreakpointType.STEP, Sets.newHashSet(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x1000))))); } @Test public void testBreakpointOverwriting() { final MockBreakpointManagerListener listener = new MockBreakpointManagerListener(); m_manager.addListener(listener); // Echo breakpoints can not overwrite regular breakpoints. m_manager.addBreakpoints(BreakpointType.ECHO, CommonTestObjects.BP_ADDRESS_123_SET); assertEquals(0, listener.size()); assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Echo breakpoints can not overwrite stepping breakpoints m_manager.addBreakpoints(BreakpointType.ECHO, Sets.newHashSet(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x1000))))); assertEquals(0, listener.size()); assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Stepping breakpoints can not overwrite regular breakpoints m_manager.addBreakpoints(BreakpointType.STEP, CommonTestObjects.BP_ADDRESS_123_SET); assertEquals(0, listener.size()); assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Stepping breakpoints can overwrite echo breakpoints m_manager.addBreakpoints(BreakpointType.STEP, Sets.newHashSet(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x111))))); assertEquals(2, listener.size()); assertEquals("Remove: 00000111", listener.getEvent(0)); assertEquals("Add: 00000111", listener.getEvent(1)); assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Regular breakpoints can overwrite stepping breakpoints m_manager.addBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x1000))))); assertEquals(4, listener.size()); assertEquals("Remove: 00001000", listener.getEvent(2)); assertEquals("Add: 00001000", listener.getEvent(3)); assertEquals(4, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Regular breakpoints can overwrite echo breakpoints m_manager.addBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x222))))); assertEquals(6, listener.size()); assertEquals("Remove: 00000222", listener.getEvent(4)); assertEquals("Add: 00000222", listener.getEvent(5)); assertEquals(5, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); } @Test public void testClearEchoBreakpointsPassive() { assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); final MockBreakpointManagerListener listener = new MockBreakpointManagerListener(); m_manager.addListener(listener); m_manager.clearBreakpointsPassive(BreakpointType.ECHO); assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); // Make sure that no message was sent assertEquals(0, listener.size()); } @Test public void testGetBreakpoint() { assertEquals(new CAddress(new CAddress(0x123)), m_manager.getBreakpoint(BreakpointType.REGULAR, 0).getAddress().getAddress().getAddress()); assertEquals(new CAddress(new CAddress(0x456)), m_manager.getBreakpoint(BreakpointType.REGULAR, 1).getAddress().getAddress().getAddress()); // Error condition: Invalid index try { m_manager.getBreakpoint(BreakpointType.REGULAR, -1).getAddress(); fail("Exception not raised"); } catch (final IllegalArgumentException ex) { } } @Test public void testGetBreakpoint2() { assertEquals(BreakpointStatus.BREAKPOINT_INACTIVE, m_manager.getBreakpointStatus( new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x123))), BreakpointType.REGULAR)); assertEquals(BreakpointStatus.BREAKPOINT_INACTIVE, m_manager.getBreakpointStatus( new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0x456))), BreakpointType.REGULAR)); assertEquals(null, m_manager.getBreakpointStatus(null, BreakpointType.REGULAR)); assertEquals(null, m_manager.getBreakpointStatus(new BreakpointAddress(m_module, new UnrelocatedAddress(new CAddress(0))), BreakpointType.REGULAR)); } @Test public void testGetBreakpointDescription() { try { m_manager.getBreakpoint(BreakpointType.REGULAR, -1).setDescription("Argl"); fail(); } catch (final IllegalArgumentException exception) { } m_manager.getBreakpoint(BreakpointType.REGULAR, 0).setDescription(null); m_manager.getBreakpoint(BreakpointType.REGULAR, 0).setDescription("Hannes"); assertEquals("Hannes", m_manager.getBreakpoint(BreakpointType.REGULAR, 0).getDescription()); } @Test public void testGetBreakpointStatus() { assertEquals(BreakpointStatus.BREAKPOINT_INACTIVE, m_manager.getBreakpointStatus(BreakpointType.REGULAR, 0)); assertEquals(BreakpointStatus.BREAKPOINT_INACTIVE, m_manager.getBreakpointStatus(BreakpointType.REGULAR, 1)); // Error condition: Invalid index try { m_manager.getBreakpointStatus(BreakpointType.REGULAR, -1); fail("Exception not raised"); } catch (final IllegalArgumentException ex) { } } @Test public void testRemoveEchoBreakpoint() { // Error condition: Null argument try { m_manager.removeBreakpoints(BreakpointType.ECHO, null); fail("Exception not raised"); } catch (final NullPointerException ex) { } assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); m_manager.removeBreakpoints(BreakpointType.ECHO, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x111))))); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); m_manager.removeBreakpoints(BreakpointType.ECHO, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x222))))); assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); } @Test public void testRemoveRegularBreakpoint() { // Error condition: Null argument try { m_manager.removeBreakpoints(BreakpointType.REGULAR, null); fail("Exception not raised"); } catch (final NullPointerException ex) { } assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); m_manager.removeBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x123))))); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); m_manager.removeBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x456))))); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); m_manager.removeBreakpoints(BreakpointType.REGULAR, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x789))))); assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); } @Test public void testRemoveSteppingBreakpoint() { assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); final MockBreakpointManagerListener listener = new MockBreakpointManagerListener(); m_manager.addListener(listener); m_manager.removeBreakpoints(BreakpointType.STEP, Sets.newHashSet(new BreakpointAddress( m_module, new UnrelocatedAddress(new CAddress(0x1000))))); // The breakpoint was removed assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Make sure that the message was sent assertEquals(1, listener.size()); } @Test public void testSetup() { assertEquals(3, m_manager.getNumberOfBreakpoints(BreakpointType.REGULAR)); assertEquals(2, m_manager.getNumberOfBreakpoints(BreakpointType.ECHO)); assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); } @Test public void testStepEchoBreakpointsPassive() { assertEquals(1, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); final MockBreakpointManagerListener listener = new MockBreakpointManagerListener(); m_manager.addListener(listener); m_manager.clearBreakpointsPassive(BreakpointType.STEP); assertEquals(0, m_manager.getNumberOfBreakpoints(BreakpointType.STEP)); // Make sure that no message was sent assertEquals(0, listener.size()); } }