--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2015 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alexandre Montplaisir - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.tests.callstack;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+
+import org.eclipse.tracecompass.internal.tmf.core.callstack.FunctionNameMapper;
+import org.junit.Test;
+
+/**
+ * Unit tests for the {@link FunctionNameMapper} class.
+ *
+ * @author Alexandre Montplaisir
+ */
+public class FunctionNameMapperTest {
+
+ /**
+ * Test the output of a text file obtained from 'nm'.
+ */
+ @Test
+ public void testNmFile() {
+ Path nmOutput = Paths.get("testfiles", "callstack" , "nm-output-example");
+ assertTrue(Files.exists(nmOutput));
+ Map<String, String> results = FunctionNameMapper.mapFromNmTextFile(nmOutput.toFile());
+
+ assertNotNull(results);
+ assertEquals(28, results.size());
+ assertNull(results.get(""));
+
+ assertEquals("completed.7259", results.get("601190"));
+ assertEquals("data_start", results.get("601048"));
+ assertEquals("deregister_tm_clones", results.get("400690"));
+ assertEquals("__do_global_dtors_aux", results.get("400710"));
+ assertEquals("__dso_handle", results.get("601050"));
+ assertEquals("_DYNAMIC", results.get("600e18"));
+ assertEquals("_end", results.get("601198"));
+ assertEquals("_fini", results.get("400874"));
+ assertEquals("frame_dummy", results.get("400730"));
+ assertEquals("__FRAME_END__", results.get("400a28"));
+ assertEquals("_GLOBAL_OFFSET_TABLE_", results.get("601000"));
+ assertEquals("_GLOBAL__sub_I_main", results.get("4007ad"));
+ assertEquals("_init", results.get("4005d0"));
+ assertEquals("__init_array_end", results.get("600e08"));
+ assertEquals("__init_array_start", results.get("600df8"));
+ assertEquals("_IO_stdin_used", results.get("400880"));
+ assertEquals("__JCR_LIST__", results.get("600e10"));
+ assertEquals("__libc_csu_fini", results.get("400870"));
+ assertEquals("__libc_csu_init", results.get("400800"));
+ assertEquals("main", results.get("400756"));
+ assertEquals("register_tm_clones", results.get("4006d0"));
+ assertEquals("_start", results.get("400660"));
+ assertEquals("__TMC_END__", results.get("601058"));
+ assertEquals("Bar<int, int>* foo<int, int>(int, int)", results.get("4007c2"));
+ assertEquals("__static_initialization_and_destruction_0(int, int)", results.get("400770"));
+ assertEquals("std::cout@@GLIBCXX_3.4", results.get("601080"));
+ assertEquals("std::piecewise_construct", results.get("400884"));
+ assertEquals("std::__ioinit", results.get("601191"));
+ }
+}
--- /dev/null
+0000000000601058 B __bss_start
+0000000000601190 b completed.7259
+ U __cxa_atexit@@GLIBC_2.2.5
+0000000000601048 D __data_start
+0000000000601048 W data_start
+0000000000400690 t deregister_tm_clones
+0000000000400710 t __do_global_dtors_aux
+0000000000600e08 t __do_global_dtors_aux_fini_array_entry
+0000000000601050 D __dso_handle
+0000000000600e18 d _DYNAMIC
+0000000000601058 D _edata
+0000000000601198 B _end
+0000000000400874 T _fini
+0000000000400730 t frame_dummy
+0000000000600df8 t __frame_dummy_init_array_entry
+0000000000400a28 r __FRAME_END__
+0000000000601000 d _GLOBAL_OFFSET_TABLE_
+00000000004007ad t _GLOBAL__sub_I_main
+ w __gmon_start__
+00000000004005d0 T _init
+0000000000600e08 t __init_array_end
+0000000000600df8 t __init_array_start
+0000000000400880 R _IO_stdin_used
+ w _ITM_deregisterTMCloneTable
+ w _ITM_registerTMCloneTable
+0000000000600e10 d __JCR_END__
+0000000000600e10 d __JCR_LIST__
+ w _Jv_RegisterClasses
+0000000000400870 T __libc_csu_fini
+0000000000400800 T __libc_csu_init
+ U __libc_start_main@@GLIBC_2.2.5
+0000000000400756 T main
+00000000004006d0 t register_tm_clones
+0000000000400660 T _start
+0000000000601058 D __TMC_END__
+00000000004007c2 W Bar<int, int>* foo<int, int>(int, int)
+0000000000400770 t __static_initialization_and_destruction_0(int, int)
+ U std::ostream::operator<<(int)@@GLIBCXX_3.4
+ U std::ios_base::Init::Init()@@GLIBCXX_3.4
+ U std::ios_base::Init::~Init()@@GLIBCXX_3.4
+0000000000601080 B std::cout@@GLIBCXX_3.4
+0000000000400884 r std::piecewise_construct
+0000000000601191 b std::__ioinit