/*
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.disassembly;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntDeleteException;
import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException;
import com.google.security.zynamics.binnavi.Database.Interfaces.SQLProvider;
import com.google.security.zynamics.binnavi.Database.MockClasses.MockSqlProvider;
import com.google.security.zynamics.binnavi.disassembly.Modules.MockModule;
import com.google.security.zynamics.zylib.disassembly.CAddress;
import com.google.security.zynamics.zylib.disassembly.IReference;
import com.google.security.zynamics.zylib.disassembly.ReferenceType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.ArrayList;
import java.util.List;
@RunWith(JUnit4.class)
public class COperandTreeNodeTest {
private final SQLProvider m_provider = new MockSqlProvider();
private final INaviModule module = new MockModule(m_provider);
private final INaviReplacement m_replacement = new CStringReplacement("__void__");
private final List<IReference> m_references = new ArrayList<IReference>();
@Before
public void setUp() {
final IReference reference =
new CReference(new CAddress(0x12345678L), ReferenceType.DATA_STRING);
m_references.add(reference);
}
@Test
public void testAddListener() {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
}
@Test
public void testAddReference() throws CouldntSaveDataException {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
final IReference reference =
new CReference(new CAddress(0x2132321L), ReferenceType.DATA_STRING);
node.addReference(reference);
try {
node.addReference(null);
fail();
} catch (final NullPointerException e) {
}
try {
node.addReference(reference);
fail();
} catch (final IllegalArgumentException e) {
}
}
@Test
public void testClone() {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
final COperandTreeNode child = new COperandTreeNode(1,
1,
"child",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
assertNotNull(child);
COperandTreeNode.link(node, child);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
final COperandTreeNode cloneNode = node.cloneNode();
assertEquals(cloneNode.getReplacement().toString(), node.getReplacement().toString());
}
@Test
public void testClose() {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
node.close();
}
@Test
public void testConstructor1() {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
}
@Test(expected = NullPointerException.class)
public void testConstructor2() {
new COperandTreeNode(1,
1,
null,
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
}
@Test(expected = NullPointerException.class)
public void testConstructor3() {
new COperandTreeNode(1,
1,
"value",
m_replacement,
null,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
}
@Test(expected = NullPointerException.class)
public void testConstructor4() {
new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
null,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
}
@Test
public void testDeleteReference() throws CouldntSaveDataException, CouldntDeleteException {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
final IReference reference =
new CReference(new CAddress(0x2132321L), ReferenceType.DATA_STRING);
node.addReference(reference);
assertEquals(2, node.getReferences().size());
node.deleteReference(reference);
assertEquals(1, node.getReferences().size());
try {
node.deleteReference(null);
fail();
} catch (final NullPointerException e) {
}
try {
node.deleteReference(reference);
fail();
} catch (final IllegalArgumentException e) {
}
}
@Test
public void testInitValue() {
// int
COperandTreeNode node = new COperandTreeNode(1,
2,
"1234567",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.IMMEDIATE_INTEGER,
node.getType());
// float
node = new COperandTreeNode(1,
3,
"0.1234567",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.IMMEDIATE_FLOAT,
node.getType());
// operator
node = new COperandTreeNode(1,
4,
"{",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.EXPRESSION_LIST,
node.getType());
node = new COperandTreeNode(1,
4,
"+",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.OPERATOR,
node.getType());
// register
node = new COperandTreeNode(1,
5,
"ABC",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.REGISTER,
node.getType());
// size prefix
node = new COperandTreeNode(1,
6,
"b1",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b2",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b4",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b6",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b8",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b10",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b16",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"b_var",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
node = new COperandTreeNode(1,
6,
"dword",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.SIZE_PREFIX,
node.getType());
// mem deref
node = new COperandTreeNode(1,
7,
"burzel",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertEquals(com.google.security.zynamics.zylib.disassembly.ExpressionType.MEMDEREF,
node.getType());
try {
new COperandTreeNode(1,
-1,
"burzel",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
} catch (final IllegalStateException e) {
}
}
@Test
public void testLink() {
final COperandTreeNode root = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
final COperandTreeNode childOne = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
final COperandTreeNode childTwo = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(root);
assertNotNull(childOne);
assertNotNull(childTwo);
COperandTreeNode.link(root, childOne);
assertEquals(root, childOne.getParent());
assertEquals(childOne, root.getChildren().get(0));
try {
COperandTreeNode.link(null, childOne);
fail();
} catch (final NullPointerException e) {
}
try {
COperandTreeNode.link(root, null);
fail();
} catch (final NullPointerException e) {
}
}
@Test
public void testMiscFunctions() throws CouldntSaveDataException {
final COperandTreeNode node = new COperandTreeNode(1,
1,
"value",
m_replacement,
m_references,
m_provider,
module.getTypeManager(),
module.getContent().getTypeInstanceContainer());
assertNotNull(node);
final INaviOperandTreeNodeListener listener = new CNaviOperandTreeNodeListenerAdapter();
node.addListener(listener);
final IReference reference =
new CReference(new CAddress(0x2132321L), ReferenceType.DATA_STRING);
node.addReference(reference);
assertNotNull(node.getDisplayStyle());
assertEquals(1, node.getId());
assertNull(node.getOperand());
assertEquals("value", node.getValue());
node.setDisplayStyle(OperandDisplayStyle.UNSIGNED_HEXADECIMAL);
try {
node.setDisplayStyle(null);
fail();
} catch (final NullPointerException e) {
}
node.setDisplayStyle(OperandDisplayStyle.UNSIGNED_HEXADECIMAL);
node.setId(12345678);
node.removeListener(listener);
node.toString();
}
}