Maic Masuch

112 papers A* 10B 3C 32Misc 16Journal 5Unranked 43
YearRankTypeTitle / Venue / Authors
2025 C conf
ICEC
Marius Grießhammer, Maic Masuch
2025 J jnl
CoRR
Andrey Krekhov, Sebastian Cmentowski, Katharina Emmerich, Maic Masuch, Jens H. Krüger
2025 B conf
VRST
Linda Graf, Gian Luca Dossena, Maic Masuch
2025 conf
CHI Extended Abstracts
Patrizia Ring, Annika Hemsing, Maic Masuch
2025 A* conf
CHI
Patrizia Ring, Maic Masuch
2025 C conf
ICEC
Marius Grießhammer, Christian Kißler, Maic Masuch, Jörg-Tobias Kuhn
2025 C conf
FDG
Julius Tietenberg, Patrizia Ring, Maic Masuch
2025 A* conf
CHI
Linda Graf, Leslie Scholemann, Philipp Sykownik, Johannes Fuss, Maic Masuch
2024 A* conf
CHI
Patrizia Ring, Julius Tietenberg, Katharina Emmerich, Maic Masuch
2024 C conf
FDG
Linda Graf, Katharina Emmerich, Stefan Liszio, Maic Masuch
2024 J jnl
Frontiers Virtual Real.
Linda Graf, Philipp Sykownik, Gertraud Gradl-Dietsch, Maic Masuch
2024 Misc conf
MuC
Patrizia Ring, Julius Tietenberg, Maic Masuch
2023 B conf
IVA
Linda Graf, Gertraud Gradl-Dietsch, Maic Masuch
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Linda Graf, Sophie Abramowski, Felix Born, Maic Masuch
2023 C conf
ICEC
Patrizia Ring, Maic Masuch
2023 conf
SeGAH
Linda Graf, Isabelle Alice Paßreiter, Jörg-Tobias Kuhn, Maic Masuch
2023 conf
VR Workshops
Patrizia Ring, Maic Masuch
2023 A* conf
CHI
Philipp Sykownik, Sukran Karaosmanoglu, Katharina Emmerich, Frank Steinicke, Maic Masuch
2022 conf
VR Workshops
Linda Graf, Sophie Abramowski, Melina Baßfeld, Kirsten Gerschermann, Marius Grießhammer, Leslie Scholemann, Maic Masuch
2022 A* conf
CHI
Philipp Sykownik, Divine Maloney, Guo Freeman, Maic Masuch
2021 C conf
CoG
Linda Graf, Leslie Scholemann, Maic Masuch
2021 conf
MuC (Workshopband)
Philipp Sykownik, Maic Masuch
2021 C conf
CoG
Felix Born, Linda Graf, Maic Masuch
2021 J jnl
Proc. ACM Hum. Comput. Interact.
Felix Born, Adrian Rygula, Maic Masuch
2021 A* conf
VR
Philipp Sykownik, Linda Graf, Christoph Zils, Maic Masuch
2020 Misc conf
CHI PLAY
Stefan Liszio, Oliver Basu, Maic Masuch
2020 C conf
CoG
Felix Born, Maic Masuch, Antonia Hahn
2020 conf
CHI PLAY (Companion)
Philipp Sykownik, Katharina Emmerich, Maic Masuch
2020 Misc conf
IDC
Stefan Liszio, Linda Graf, Oliver Basu, Maic Masuch
2020 Misc conf
MuC
Linda Graf, Stefan Liszio, Maic Masuch
2020 B conf
VRST
Philipp Sykownik, Maic Masuch
2019 conf
CHI PLAY (Companion)
Philipp Sykownik, Katharina Emmerich, Jochen Peketz, Maic Masuch
2019 C conf
CoG
Philipp Sykownik, Felix Born, Maic Masuch
2019 C conf
CoG
Felix Born, Philipp Sykownik, Maic Masuch
2019 conf
VS-GAMES
Felix Born, Sophie Abramowski, Maic Masuch
2018 Misc conf
CHI PLAY
Andrey Krekhov, Sebastian Cmentowski, Katharina Emmerich, Maic Masuch, Jens H. Krüger
2018 Misc conf
CHI PLAY
Katharina Emmerich, Patrizia Ring, Maic Masuch
2018 A* conf
CHI
Katharina Emmerich, Maic Masuch
2017 C conf
ACE
Philipp Sykownik, Katharina Emmerich, Maic Masuch
2017 C conf
ACE
Felix Born, Maic Masuch
2017 C conf
ICEC
Felix Born, Maic Masuch
2017 Misc conf
CHI PLAY
Katharina Emmerich, Maic Masuch
2017 C conf
FDG
Stefan Liszio, Katharina Emmerich, Maic Masuch
2017 Misc conf
IDC
Stefan Liszio, Maic Masuch
2016 ch.
Serious Games
Florian Mehm, Ralf Dörner, Maic Masuch
2016 C conf
ICEC
Stefan Liszio, Maic Masuch
2016 ed.
Entertainment Computing and Serious Games
Ralf Dörner, Stefan Göbel, Michael D. Kickmeier-Rust, Maic Masuch, Katharina A. Zweig
2016 C conf
ACE
Katharina Emmerich, Maic Masuch
2016 conf
INTETAIN
Carina Gansohr, Katharina Emmerich, Maic Masuch
2016 C conf
ACE
Stefan Liszio, Maic Masuch
2016 conf
MindTrek
Stephanie Scheja, Ralf Schmidt, Maic Masuch
2016 C conf
ICEC
Ralf Schmidt, Mirco Zick, Burkhard Schmidt, Maic Masuch
2016 Misc conf
CHI PLAY
Katharina Emmerich, Maic Masuch
2015 Misc conf
IDC
Ralf Schmidt, Stephanie Scheja, Thanh Thu Lam, Maic Masuch
2015 conf
SD&A
Jonas Schild, Maic Masuch
2015 conf
MindTrek
Ralf Schmidt, Burkhard Schmidt, Katharina Lattenkamp, Stephanie Scheja, Maic Masuch
2014 A* conf
CHI
Jonas Schild, Joseph J. LaViola Jr., Maic Masuch
2014 conf
GameDays
Carina Gansohr, Katharina Emmerich, Maic Masuch, Oliver Basu, Lorenz Grigull
2014 C conf
Advances in Computer Entertainment
Katharina Emmerich, Stefan Liszio, Maic Masuch
2014 C conf
Advances in Computer Entertainment (Workshops)
Katharina Emmerich, Maic Masuch, Ralf Schmidt
2013 A* conf
CHI
Jonas Schild, Liane Bölicke, Joseph J. LaViola Jr., Maic Masuch
2013 C conf
FDG
Katharina Emmerich, Maic Masuch
2013 conf
GFHEU
Ralf Schmidt, Patrick Eifler, Maic Masuch
2012 C conf
ICEC
Robert Walter, Maic Masuch, Mathias Funk
2012 conf
SD&A
Jonas Schild, Maic Masuch
2012 C ed.
ICEC
Marc Herrlich, Rainer Malaka, Maic Masuch
2012 C conf
ICEC
Kathrin Maria Gerling, Frank P. Schulte, Jan D. Smeddinck, Maic Masuch
2012 Misc conf
MuC
Jörg Niesenhaus, Rainer Malaka, Maic Masuch
2012 A* conf
CHI
Jonas Schild, Joseph J. LaViola Jr., Maic Masuch
2012 conf
SD&A
Jonas Schild, Sven Seele, Maic Masuch
2011 C conf
ICEC
Robert Walter, Maic Masuch, Ed Merks
2011 C conf
ICEC
Kathrin Maria Gerling, Alberto Fuchslocher, Ralf Schmidt, Nicole C. Krämer, Maic Masuch
2011 conf
Advances in Computer Entertainment Technology
Kathrin Maria Gerling, Frank P. Schulte, Maic Masuch
2011 conf
SeGAH
Alberto Fuchslocher, Kathrin Maria Gerling, Maic Masuch, Nicole C. Krämer
2011 Misc conf
MuC
Kathrin Maria Gerling, Jonas Schild, Maic Masuch
2011 C conf
ICEC
Jonas Schild, Maic Masuch
2011 conf
Advances in Computer Entertainment Technology
Robert Walter, Maic Masuch
2011 C conf
ICEC
Jonas Schild, Sven Seele, Maic Masuch
2011 conf
MuC (Workshopband)
Julia Othlinghaus, Kathrin Maria Gerling, Maic Masuch
2011 conf
SI3D
Jonas Schild, Sven Seele, Jonas Fischer, Maic Masuch
2011 Misc conf
MuC
Maic Masuch, Matthias Rauterberg, Jörg Niesenhaus
2011 Misc conf
MuC
Ralf Schmidt, Maic Masuch, Julia Othlinghaus
2011 conf
Advances in Computer Entertainment Technology
Jonas Schild, Sven Seele, Maic Masuch
2010 C conf
FDG
Jonas Schild, Robert Walter, Maic Masuch
2010 conf
Advances in Computer Entertainment Technology
Kathrin Maria Gerling, Jonas Schild, Maic Masuch
2010 conf
Future Play
Jonas Schild, Maic Masuch
2010 conf
MuC (Workshopband)
Kathrin Maria Gerling, Matthias Klauser, Maic Masuch
2008 conf
C5
Jens Lincke, Robert Hirschfeld, Michael Rüger, Maic Masuch
2007 Misc conf
MuC
Maic Masuch, Maizatul H. M. Yatim, Patty Gadegast
2007 Misc conf
IDC
Maizatul H. M. Yatim, Maic Masuch
2006 conf
C5
Maic Masuch, Knut Hartmann, Grit Schuster
2006 conf
Eurographics (Short Presentations)
Martin Spindler, Niklas Röber, Robert Döhring, Maic Masuch
2006 conf
TIDSE
Niklas Röber, Cornelius Huber, Knut Hartmann, Matthias Feustel, Maic Masuch
2006 conf
ICMC
Niklas Röber, Martin Spindler, Maic Masuch
2005 conf
C5
Maic Masuch, Michael Rüger
2005 conf
DiGRA Conference
Niklas Röber, Maic Masuch
2004 conf
GI Jahrestagung (1)
Jochen Schneider, Maic Masuch
2004 conf
C5
Jana Hintze, Maic Masuch
2004 conf
ICAD
Niklas Röber, Maic Masuch
2004 conf
GI Jahrestagung (1)
Maic Masuch
2002 conf
Rendering Techniques
Bert Freudenberg, Maic Masuch, Thomas Strothotte
2001
Maic Masuch
2001 conf
SimVis
Rita Freudenberg, Maic Masuch
2001 conf
Virtual Reality, Archeology, and Cultural Heritage
Bert Freudenberg, Maic Masuch, Niklas Röber, Thomas Strothotte
2001 J jnl
Comput. Graph. Forum
Bert Freudenberg, Maic Masuch, Thomas Strothotte
2000 C conf
IV
Tobias Isenberg, Maic Masuch, Thomas Strothotte
1999 conf
SIGGRAPH Abstracts and Applications
Maic Masuch, Stefan Schlechtweg, Ronny Schulz
1999 conf
Eurographics (Short Presentations)
Maic Masuch, Bert Freudenberg, Babette Ludowici, Sebastian Kreiker, Thomas Strothotte
1999 C conf
Computer Graphics International
Thomas Strothotte, Maic Masuch, Tobias Isenberg
1998 conf
SimVis
Maic Masuch, Lars Schumann, Stefan Schlechtweg
1998 C conf
IV
Maic Masuch, Thomas Strothotte
1997 conf
SimVis
Maic Masuch, Stefan Schlechtweg, Bert Schönwälder
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                index_prefix="custom_prefix"
            )

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_benign=True
            )

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_malicious=True
            )

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()
            # Should succeed with no exporters (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result