Nataliya Kosmyna

27 papers A 1B 2C 4Misc 2Journal 7Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Nataliya Kosmyna, Eugene Hauptmann
2025 J jnl
CoRR
Haojun Zhuang, Dünya Baradari, Nataliya Kosmyna, Arnav Balyan, Constanze Albrecht, Stephanie Chen, Pattie Maes
2025 conf
CUI
Dünya Baradari, Nataliya Kosmyna, Oscar Petrov, Rebecah Kaplun, Pattie Maes
2025 J jnl
CoRR
Dünya Baradari, Nataliya Kosmyna, Oscar Petrov, Rebecah Kaplun, Pattie Maes
2025 J jnl
CoRR
Nataliya Kosmyna, Eugene Hauptmann, Ye Tong Yuan, Jessica Situ, Xian-Hao Liao, Ashly Vivian Beresnitzky, Iris Braunstein, Pattie Maes
2024 J jnl
Sensors
Nataliya Kosmyna, Eugene Hauptmann, Yasmeen Hmaidan
2024 A conf
INTERSPEECH
Wazeer Zulfikar, Nishat Protyasha, Camila Canales, Heli Patel, James Williamson, Laura Sarnie, Lisa Nowinski, Nataliya Kosmyna, Paige Townsend, Sophia Yuditskaya, Tanya Talkar, Utkarsh Oggy Sarawgi, Christopher J. McDougle, Thomas F. Quatieri, Pattie Maes, Maria Mody
2024 J jnl
CoRR
Wazeer Zulfikar, Nishat Protyasha, Camila Canales, Heli Patel, James Williamson, Laura Sarnie, Lisa Nowinski, Nataliya Kosmyna, Paige Townsend, Sophia Yuditskaya, Tanya Talkar, Utkarsh Oggy Sarawgi, Christopher J. McDougle, Thomas F. Quatieri, Pattie Maes, Maria Mody
2024 C conf
BSN
Minsol Michelle Kim, Serena Pei, Samiksha Singh, Selam Brook, Nataliya Kosmyna
2024 C conf
BSN
Nataliya Kosmyna, Karim El Adl, Minsol Michelle Kim
2022 conf
FTC (2)
Nataliya Kosmyna, Arnav Balyan, Eugene Hauptmann
2022 conf
FTC (2)
Nataliya Kosmyna, Arnav Balyan, Eugene Hauptmann
2022 conf
CHI Extended Abstracts
Kenan Bektas, Jeeeun Kim, Huaishu Peng, Kiyoshi Kiyokawa, Anthony Steed, Tobias Höllerer, Nataliya Kosmyna, Kaan Aksit, Misha Sra, Jason Orlosky
2021 Misc conf
ISWC
Nataliya Kosmyna, Chi-Yun Hu, Yujie Wang, Qiuxuan Wu, Cassandra Scheirer, Pattie Maes
2021 C conf
BSN
Nataliya Kosmyna, Qiuxuan Wu, Chi-Yun Hu, Yujie Wang, Cassandra Scheirer, Pattie Maes
2021 conf
CHI Extended Abstracts
Nataliya Kosmyna, Cassandra Scheirer, Pattie Maes
2020 Misc conf
IDC
Nataliya Kosmyna, Alexandra Gross, Pattie Maes
2019 conf
CHI Extended Abstracts
Nataliya Kosmyna, Caitlin Morris, Utkarsh Sarawgi, Pattie Maes
2019 C conf
BSN
Nataliya Kosmyna, Caitlin Morris, Utkarsh Sarawgi, Thanh Nguyen, Pattie Maes
2019 J jnl
Sensors
Nataliya Kosmyna, Pattie Maes
2019 conf
AutomotiveUI
Nataliya Kosmyna, Caitlin Morris, Thanh Nguyen, Sebastian Zepf, Javier Hernandez, Pattie Maes
2019 conf
EMBC
Nataliya Kosmyna, Pattie Maes
2019 B conf
SMC
Nataliya Kosmyna
2019 B conf
SMC
Nataliya Kosmyna
2018 conf
UbiComp/ISWC Adjunct
Nataliya Kosmyna, Utkarsh Sarawgi, Pattie Maes
2018 conf
EMBC
Xinlei Zhang, Nataliya Kosmyna, Pattie Maes, Jun Rekimoto
2014 conf
Erog'IA
Nataliya Kosmyna, Franck Tarpin-Bernard
tests/unit/test_decompile_strings.py
← Index tests/unit/test_decompile_strings.py python
"""Unit tests for bninja/analysis/strings.py — StringAnalysis."""
import pytest
import math
from unittest.mock import MagicMock


# StringAnalysis has no binaryninja imports, just collections and math
from redb.extractors.decompiler.bninja.analysis.strings import StringAnalysis


# ============================================================================
# Helper mocks
# ============================================================================

class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, type_name="Utf8String"):
        self.value = value
        self.raw = raw if raw is not None else (value.encode("utf-8") if isinstance(value, str) else value)
        self.start = start
        self.length = length if length else len(self.raw)
        self.type = MagicMock()
        self.type.name = type_name


class MockBinaryView:
    """Mock binary view with a strings list."""
    def __init__(self, strings=None):
        self.strings = strings or []


# ============================================================================
# 6a. StringAnalysis
# ============================================================================


class TestStringAnalysisEntropy:
    def setup_method(self):
        self.sa = StringAnalysis(bv=MockBinaryView(), functions=[])

    def test_entropy_empty_string(self):
        assert self.sa.entropy("") == 0.0

    def test_entropy_single_char(self):
        assert self.sa.entropy("aaaa") == 0.0

    def test_entropy_uniform_distribution(self):
        # "abcd" -> 4 unique chars, each p=1/4, entropy = log2(4) = 2.0
        result = self.sa.entropy("abcd")
        assert result == pytest.approx(2.0)

    def test_entropy_binary_string(self):
        # "ab" -> 2 unique chars, each p=1/2, entropy = log2(2) = 1.0
        result = self.sa.entropy("ab")
        assert result == pytest.approx(1.0)


class TestStringAnalysisAnalyze:
    def test_analyze_deduplication(self):
        """Duplicate (string, encoding) pairs -> only first kept."""
        entries = [
            MockStringEntry("hello", start=100, type_name="Utf8String"),
            MockStringEntry("hello", start=200, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        assert result[0]["string_offset"] == 100

    def test_analyze_sorted_by_address(self):
        """First occurrence (lowest offset) is the one kept."""
        entries = [
            MockStringEntry("world", start=500, type_name="Utf8String"),
            MockStringEntry("world", start=100, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        # The analyze() sorts by start, so 100 comes first
        assert result[0]["string_offset"] == 100

    def test_analyze_empty_bv(self):
        bv = MockBinaryView(strings=[])
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert result == []

    def test_analyze_output_schema(self):
        entries = [MockStringEntry("test_string", start=0, type_name="Utf8String")]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        r = result[0]
        required_keys = [
            "string",
            "string_raw",
            "string_encoding",
            "string_offset",
            "string_length",
            "string_raw_length",
            "string_entropy",
        ]
        for key in required_keys:
            assert key in r, f"Missing key: {key}"