Orcun Goksel

138 papers A* 2A 1B 2Journal 78Unranked 50
YearRankTypeTitle / Venue / Authors
2025 conf
SCIA (1)
Lingkai Zhu, Can Deniz Bezek, Orcun Goksel
2025 J jnl
CoRR
Roman Denkin, Orcun Goksel
2025 J jnl
Medical Image Anal.
Alvaro Gomariz, Yusuke Kikuchi, Yun Yvonna Li, Thomas Albrecht, Andreas Maunz, Daniela Ferrara, Huanxiang Lu, Orcun Goksel
2025 J jnl
CoRR
Ture Hassler, Ida Åkerholm, Marcus Nordström, Gabriele Balletti, Orcun Goksel
2025 J jnl
IEEE Trans. Medical Imaging
Can Deniz Bezek, Maxim Haas, Richard Rau, Orcun Goksel
2025 J jnl
CoRR
Sonia Laguna, Lin Zhang, Can Deniz Bezek, Monika Farkas, Dieter Schweizer, Rahel A. Kubik-Huch, Orcun Goksel
2025 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Sonia Laguna, Lin Zhang, Can Deniz Bezek, Monika Farkas, Dieter Schweizer, Rahel A. Kubik-Huch, Orcun Goksel
2024 J jnl
CoRR
Lingkai Zhu, Can Deniz Bezek, Orcun Goksel
2024 J jnl
Image Vis. Comput.
Kevin Thandiackal, Tiziano Portenier, Andrea Giovannini, Maria Gabrani, Orcun Goksel
2024 J jnl
Pattern Recognit. Lett.
Lingkai Zhu, Fei Zhou, Bozhi Liu, Orcun Goksel
2024 J jnl
CoRR
Alvaro Gomariz, Yusuke Kikuchi, Yun Yvonna Li, Thomas Albrecht, Andreas Maunz, Daniela Ferrara, Huanxiang Lu, Orcun Goksel
2024 J jnl
IEEE Trans. Medical Imaging
Kevin Thandiackal, Luigi Piccinelli, Rajarsi Gupta, Pushpak Pati, Orcun Goksel
2023 J jnl
CoRR
Boqi Chen, Kevin Thandiackal, Pushpak Pati, Orcun Goksel
2023 J jnl
Medical Image Anal.
Boqi Chen, Kevin Thandiackal, Pushpak Pati, Orcun Goksel
2023 J jnl
CoRR
Kevin Thandiackal, Luigi Piccinelli, Pushpak Pati, Orcun Goksel
2023 J jnl
CoRR
Lin Zhang, Tiziano Portenier, Orcun Goksel
2023 J jnl
CoRR
Pushpak Pati, Guillaume Jaume, Zeineb Ayadi, Kevin Thandiackal, Behzad Bozorgtabar, Maria Gabrani, Orcun Goksel
2023 J jnl
Medical Image Anal.
Pushpak Pati, Guillaume Jaume, Zeineb Ayadi, Kevin Thandiackal, Behzad Bozorgtabar, Maria Gabrani, Orcun Goksel
2022 conf
ECCV (21)
Kevin Thandiackal, Boqi Chen, Pushpak Pati, Guillaume Jaume, Drew F. K. Williamson, Maria Gabrani, Orcun Goksel
2022 J jnl
CoRR
Kevin Thandiackal, Boqi Chen, Pushpak Pati, Guillaume Jaume, Drew F. K. Williamson, Maria Gabrani, Orcun Goksel
2022 J jnl
Medical Image Anal.
Pushpak Pati, Guillaume Jaume, Antonio Foncubierta-Rodríguez, Florinda Feroce, Anna Maria Anniciello, Giosue Scognamiglio, Nadia Brancati, Maryse Fiche, Estelle Dubruc, Daniel Riccio, Maurizio Di Bonito, Giuseppe De Pietro, Gerardo Botti, Jean-Philippe Thiran, Maria Frucci, Orcun Goksel, Maria Gabrani
2022 conf
MICCAI (8)
Alvaro Gomariz, Huanxiang Lu, Yun Yvonna Li, Thomas Albrecht, Andreas Maunz, Fethallah Benmansour, Alessandra M. Valcarcel, Jennifer Luu, Daniela Ferrara, Orcun Goksel
2022 J jnl
CoRR
Alvaro Gomariz, Huanxiang Lu, Yun Yvonna Li, Thomas Albrecht, Andreas Maunz, Fethallah Benmansour, Alessandra M. Valcarcel, Jennifer Luu, Daniela Ferrara, Orcun Goksel
2021 J jnl
Knowl. Based Syst.
Firat Özdemir, Zixuan Peng, Philipp Fürnstahl, Christine Tanner, Orcun Goksel
2021 conf
MICCAI (8)
Devavrat Tomar, Lin Zhang, Tiziano Portenier, Orcun Goksel
2021 J jnl
CoRR
Devavrat Tomar, Lin Zhang, Tiziano Portenier, Orcun Goksel
2021 J jnl
Medical Image Anal.
Richard Rau, Ozan Unal, Dieter Schweizer, Valery Vishnevsky, Orcun Goksel
2021 J jnl
NeuroImage
Justine Robin, Richard Rau, Berkan Lafci, Aileen Schroeter, Michael Reiss, Xosé-Luís Dean-Ben, Orcun Goksel, Daniel Razansky
2021 J jnl
CoRR
Pushpak Pati, Guillaume Jaume, Antonio Foncubierta, Florinda Feroce, Anna Maria Anniciello, Giosuè Scognamiglio, Nadia Brancati, Maryse Fiche, Estelle Dubruc, Daniel Riccio, Maurizio Di Bonito, Giuseppe De Pietro, Gerardo Botti, Jean-Philippe Thiran, Maria Frucci, Orcun Goksel, Maria Gabrani
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Alfred M. Franz, Orcun Goksel
2021 J jnl
CoRR
Lin Zhang, Tiziano Portenier, Orcun Goksel
2021 conf
MICCAI (2)
Valentin Anklin, Pushpak Pati, Guillaume Jaume, Behzad Bozorgtabar, Antonio Foncubierta-Rodríguez, Jean-Philippe Thiran, Mathilde Sibony, Maria Gabrani, Orcun Goksel
2021 J jnl
CoRR
Valentin Anklin, Pushpak Pati, Guillaume Jaume, Behzad Bozorgtabar, Antonio Foncubierta-Rodríguez, Jean-Philippe Thiran, Mathilde Sibony, Maria Gabrani, Orcun Goksel
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Lin Zhang, Tiziano Portenier, Orcun Goksel
2021 J jnl
CoRR
Kevin Thandiackal, Tiziano Portenier, Andrea Giovannini, Maria Gabrani, Orcun Goksel
2021 J jnl
Nat. Mach. Intell.
Alvaro Gomariz, Tiziano Portenier, Patrick M. Helbling, Stephan Isringhausen, Ute Suessbier, César Nombela-Arrieta, Orcun Goksel
2021 J jnl
CoRR
Alvaro Gomariz, Tiziano Portenier, César Nombela-Arrieta, Orcun Goksel
2021 A* conf
CVPR
Guillaume Jaume, Pushpak Pati, Behzad Bozorgtabar, Antonio Foncubierta, Anna Maria Anniciello, Florinda Feroce, Tilman Rau, Jean-Philippe Thiran, Maria Gabrani, Orcun Goksel
2021 J jnl
Medical Image Anal.
Pushpak Pati, Antonio Foncubierta-Rodríguez, Orcun Goksel, Maria Gabrani
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Richard Rau, Dieter Schweizer, Valery Vishnevskiy, Orcun Goksel
2021 conf
ISBI
Bhaskara Rao Chintada, Richard Rau, Orcun Goksel
2021 conf
ISBI
Alvaro Gomariz, Raphael Egli, Tiziano Portenier, César Nombela-Arrieta, Orcun Goksel
2021 J jnl
CoRR
Alvaro Gomariz, Raphael Egli, Tiziano Portenier, César Nombela-Arrieta, Orcun Goksel
2020 ed.
WBIR
Ziga Spiclin, Jamie McClelland, Jan Kybic, Orcun Goksel
2020 J jnl
CoRR
Fabien Péan, Philippe Favre, Orcun Goksel
2020 conf
ASMUS/PIPPI@MICCAI
Lin Zhang, Tiziano Portenier, Christoph Paulus, Orcun Goksel
2020 J jnl
CoRR
Lin Zhang, Tiziano Portenier, Christoph Paulus, Orcun Goksel
2020 J jnl
CoRR
Lin Zhang, Valeriy Vishnevskiy, Orcun Goksel
2020 J jnl
CoRR
Firat Özdemir, Christine Tanner, Orcun Goksel
2020 A* conf
NeurIPS
Tiziano Portenier, Siavash Arjomand Bigdeli, Orcun Goksel
2020 J jnl
CoRR
Tiziano Portenier, Siavash Arjomand Bigdeli, Orcun Goksel
2020 conf
UNSURE/GRAIL@MICCAI
Pushpak Pati, Guillaume Jaume, Lauren Alisha Fernandes, Antonio Foncubierta-Rodríguez, Florinda Feroce, Anna Maria Anniciello, Giosue Scognamiglio, Nadia Brancati, Daniel Riccio, Maurizio Di Bonito, Giuseppe De Pietro, Gerardo Botti, Orcun Goksel, Jean-Philippe Thiran, Maria Frucci, Maria Gabrani
2020 J jnl
CoRR
Pushpak Pati, Guillaume Jaume, Lauren Alisha Fernandes, Antonio Foncubierta, Florinda Feroce, Anna Maria Anniciello, Giosue Scognamiglio, Nadia Brancati, Daniel Riccio, Maurizio Di Bonito, Giuseppe De Pietro, Gerardo Botti, Orcun Goksel, Jean-Philippe Thiran, Maria Frucci, Maria Gabrani
2020 J jnl
CoRR
Guillaume Jaume, Pushpak Pati, Behzad Bozorgtabar, Antonio Foncubierta-Rodríguez, Florinda Feroce, Anna Maria Anniciello, Tilman Rau, Jean-Philippe Thiran, Maria Gabrani, Orcun Goksel
2020 conf
MICCAI (3)
Emanuel Joos, Fabien Péan, Orcun Goksel
2020 ed.
ShapeMI@MICCAI
Martin Reuter, Christian Wachinger, Hervé Lombaert, Beatriz Paniagua, Orcun Goksel, Islem Rekik
2020 J jnl
CoRR
Guillaume Jaume, Pushpak Pati, Antonio Foncubierta-Rodríguez, Florinda Feroce, Giosue Scognamiglio, Anna Maria Anniciello, Jean-Philippe Thiran, Orcun Goksel, Maria Gabrani
2020 J jnl
CoRR
Melanie Bernhardt, Valeriy Vishnevskiy, Richard Rau, Orcun Goksel
2019 conf
Digital Pathology
Pushpak Pati, Raúl Catena, Orcun Goksel, Maria Gabrani
2019 J jnl
Sensors
Torben Marhenke, Sergio J. Sanabria, Bhaskara Rao Chintada, Roman Furrer, Jürg Neuenschwander, Orcun Goksel
2019 J jnl
CoRR
Firat Özdemir, Zixuan Peng, Philipp Fürnstahl, Christine Tanner, Orcun Goksel
2019 conf
MICCAI (5)
Richard Rau, Ozan Unal, Dieter Schweizer, Valeriy Vishnevskiy, Orcun Goksel
2019 conf
MICCAI (6)
Valeriy Vishnevskiy, Richard Rau, Orcun Goksel
2019 J jnl
CoRR
Valeriy Vishnevskiy, Richard Rau, Orcun Goksel
2019 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Firat Özdemir, Orcun Goksel
2019 J jnl
IEEE Trans. Biomed. Eng.
Nuri Murat Arar, Pushpak Pati, Aditya Kashyap, Anna Fomitcheva Khartchenko, Orcun Goksel, Govind V. Kaigala, Maria Gabrani
2019 conf
ISBI
Lin Zhang, Valeriy Vishnevskiy, András Jakab, Orcun Goksel
2019 J jnl
CoRR
Andrawes Al Bahou, Christine Tanner, Orcun Goksel
2019 conf
ISBI
Andrawes Al Bahou, Christine Tanner, Orcun Goksel
2019 conf
ISBI
Alvaro Gomariz, Weiye Li, Ece Ozkan, Christine Tanner, Orcun Goksel
2019 J jnl
IEEE Trans. Biomed. Eng.
Sergio J. Sanabria, Marga B. Rominger, Orcun Goksel
2019 J jnl
Comput. Graph.
Rastislav Starkov, Christine Tanner, Michael Bajka, Orcun Goksel
2019 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Rastislav Starkov, Lin Zhang, Michael Bajka, Christine Tanner, Orcun Goksel
2019 J jnl
CoRR
Yuanhao Gong, Orcun Goksel
2019 J jnl
Signal Process.
Yuanhao Gong, Orcun Goksel
2018 conf
OR 2.0/CARE/CLIP/ISIC@MICCAI
Kevin Thandiackal, Orcun Goksel
2018 J jnl
CoRR
Firat Özdemir, Zixuan Peng, Christine Tanner, Philipp Fürnstahl, Orcun Goksel
2018 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Corin F. Otesteanu, Valery Vishnevsky, Orcun Goksel
2018 conf
MICCAI (4)
Christine Tanner, Rastislav Starkov, Michael Bajka, Orcun Goksel
2018 conf
MLMIR@MICCAI
Valeriy Vishnevskiy, Sergio J. Sanabria, Orcun Goksel
2018 J jnl
CoRR
Valeriy Vishnevskiy, Sergio J. Sanabria, Orcun Goksel
2018 J jnl
IEEE Trans. Medical Imaging
Oliver Mattausch, Orcun Goksel
2018 J jnl
CoRR
Lin Zhang, Valeriy Vishnevskiy, András Jakab, Orcun Goksel
2018 J jnl
IEEE Trans. Medical Imaging
Golnoosh Samei, Orcun Goksel, Julio Lobo, Omid Mohareri, Peter C. Black, Robert Rohling, Septimiu E. Salcudean
2018 J jnl
Comput. Graph. Forum
Oliver Mattausch, Maxim Makhinya, Orcun Goksel
2018 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Matija Ciganovic, Firat Özdemir, Fabien Péan, Philipp Fürnstahl, Christine Tanner, Orcun Goksel
2018 J jnl
IEEE Trans. Medical Imaging
Corin F. Otesteanu, Sergio J. Sanabria, Orcun Goksel
2018 ed.
SASHIMI@MICCAI
Ali Gooya, Orcun Goksel, Ipek Oguz, Ninon Burgos
2017 conf
Image-Guided Procedures
Oliver Mattausch, Elizabeth Ren, Michael Bajka, Kenneth Vanhoey, Orcun Goksel
2017 conf
MICCAI (2)
Nuri Murat Arar, Pushpak Pati, Aditya Kashyap, Anna Fomitcheva Khartchenko, Orcun Goksel, Govind V. Kaigala, Maria Gabrani
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Christine Tanner, Barbara Flach, Céline Eggenberger, Oliver Mattausch, Michael Bajka, Orcun Goksel
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Firat Özdemir, Neerav Karani, Philipp Fürnstahl, Orcun Goksel
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Ece Ozkan, Christine Tanner, Matej Kastelic, Oliver Mattausch, Maxim Makhinya, Orcun Goksel
2017 ch.
Cloud-Based Benchmarking of Medical Image Analysis
Orcun Goksel, Antonio Foncubierta-Rodríguez
2016 conf
MICCAI (1)
Christine Tanner, Barbara Flach, Céline Eggenberger, Oliver Mattausch, Michael Bajka, Orcun Goksel
2016 conf
ISBI
Corin F. Otesteanu, Sergio J. Sanabria, Orcun Goksel
2016 J jnl
IEEE Trans. Biomed. Eng.
Alessandro Crimi, Maxim Makhinya, Ulrich Baumann, Christoph Thalhammer, Gábor Székely, Orcun Goksel
2016 conf
MCV/BAMBI@MICCAI
Janine Thoma, Firat Özdemir, Orcun Goksel
2016 J jnl
IEEE Trans. Medical Imaging
Oscar Alfonso Jiménez del Toro, Henning Müller, Markus Krenn, Katharina Gruenberg, Abdel Aziz Taha, Marianne Winterstein, Ivan Eggel, Antonio Foncubierta-Rodríguez, Orcun Goksel, András Jakab, Georgios Kontokotsios, Georg Langs, Bjoern H. Menze, Tomas Salas Fernandez, Roger Schaer, Anna Walleyo, Marc-André Weber, Yashin Dicente Cid, Tobias Gass, Mattias P. Heinrich, Fucang Jia, Fredrik Kahl, Razmig Kéchichian, Dominic Mai, Assaf B. Spanier, Graham Vincent, Chunliang Wang, Daniel Wyeth, Allan Hanbury
2016 conf
MICCAI (2)
Firat Özdemir, Ece Ozkan, Orcun Goksel
2016 conf
MICCAI (1)
Sergio J. Sanabria, Orcun Goksel
2016 J jnl
CoRR
Ece Ozkan, Gemma Roig, Orcun Goksel, Xavier Boix
2016 conf
SASHIMI@MICCAI
Oliver Mattausch, Orcun Goksel
2016 conf
ISBI
Orcun Goksel, Valery Vishnevsky, Alvaro Gomariz Carrillo, Christine Tanner
2016 conf
ISBI
Barbara Flach, Maxim Makhinya, Orcun Goksel
2016 conf
VCBM/MedViz
Oliver Mattausch, Orcun Goksel
2016 conf
SASHIMI@MICCAI
Barbara Flach, Maxim Makhinya, Orcun Goksel
2015 J jnl
IEEE Trans. Medical Imaging
Siavash Khallaghi, C. Antonio Sánchez, Abtin Rasoulian, Yue Sun, Farhad Imani, Amir Khojaste, Orcun Goksel, Cesare Romagnoli, Hamidreza Abdi, Silvia D. Chang, Parvin Mousavi, Aaron Fenster, Aaron D. Ward, Sidney S. Fels, Purang Abolmaesumi
2015 conf
EMBC
Ece Ozkan, Orcun Goksel
2015 conf
VISCERAL Challenge@ISBI
Orcun Goksel, Antonio Foncubierta-Rodríguez, Oscar Alfonso Jiménez del Toro, Henning Müller, Georg Langs, Marc-André Weber, Bjoern H. Menze, Ivan Eggel, Katharina Gruenberg, Marianne Winterstein, Markus Holzer, Markus Krenn, Georgios Kontokotsios, Sokratis Metallidis, Roger Schaer, Abdel Aziz Taha, András Jakab, Tomas Salas Fernandez, Allan Hanbury
2015 ed.
VISCERAL Challenge@ISBI
Orcun Goksel, Oscar Alfonso Jiménez del Toro, Antonio Foncubierta-Rodríguez, Henning Müller
2015 conf
EMBC
Oliver Mattausch, Orcun Goksel
2015 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Peter Baki, Sergio J. Sanabria, Gabor Kosa, Gábor Székely, Orcun Goksel
2015 conf
ISBI
Valeriy Vishnevskiy, Tobias Gass, Gábor Székely, Christine Tanner, Orcun Goksel
2014 B conf
Image Processing
Tobias Gass, Gábor Székely, Orcun Goksel
2014 B conf
Image Processing
Tobias Gass, Gábor Székely, Orcun Goksel
2014 conf
MCV
Tobias Gass, Gábor Székely, Orcun Goksel
2014 conf
WBIR
Tobias Gass, Gábor Székely, Orcun Goksel
2014 J jnl
IEEE Trans. Image Process.
Tobias Gass, Gábor Székely, Orcun Goksel
2014 conf
ABDI@MICCAI
Valeriy Vishnevskiy, Tobias Gass, Gábor Székely, Orcun Goksel
2014 conf
ISBI
Alessandro Crimi, Maxim Makhinya, Ulrich Baumann, Gábor Székely, Orcun Goksel
2013 conf
EMBC
Kamal Shahim, Orcun Goksel, Philipp Jürgens, Mauricio Reyes
2013 conf
World Haptics
Orcun Goksel, Seokhee Jeon, Matthias Harders, Gábor Székely
2013 conf
ISBI
Orcun Goksel, Tobias Gass, Valery Vishnevsky, Gábor Székely
2013 J jnl
IEEE Trans. Medical Imaging
Orcun Goksel, Hani Eskandari, Septimiu E. Salcudean
2013 J jnl
IEEE Trans. Biomed. Eng.
Orcun Goksel, Kirill Sapchuk, William J. Morris, Septimiu E. Salcudean
2012 conf
Image-Guided Procedures
Farheen Taquee, Orcun Goksel, Seyedeh Sara Mahdavi, Mira Keyes, William James Morris, Ingrid Spadinger, Septimiu E. Salcudean
2012 conf
MCV
Tobias Gass, Gábor Székely, Orcun Goksel
2011 J jnl
IEEE Trans. Haptics
Orcun Goksel, Kirill Sapchuk, Septimiu E. Salcudean
2011 conf
World Haptics
Orcun Goksel, Kirill Sapchuk, Septimiu E. Salcudean
2011 J jnl
IEEE Trans. Medical Imaging
Orcun Goksel, Septimiu E. Salcudean
2010 conf
ISMBS
Orcun Goksel, Septimiu E. Salcudean
2009 conf
MICCAI (1)
Seyedeh Sara Mahdavi, William J. Morris, Ingrid Spadinger, Nick Chng, Orcun Goksel, Septimiu E. Salcudean
2009 J jnl
IEEE Trans. Medical Imaging
Orcun Goksel, Septimiu E. Salcudean
2009 conf
MICCAI (1)
Orcun Goksel, Septimiu E. Salcudean
2007 conf
MICCAI (1)
Orcun Goksel, Septimiu E. Salcudean
2006 conf
MICCAI (1)
Ehsan Dehghan, Orcun Goksel, Septimiu E. Salcudean
2005 A conf
MICCAI
Orcun Goksel, Septimiu E. Salcudean, Simon P. DiMaio, Robert Rohling, William James Morris
tests/integration/test_hashes.py
← Index tests/integration/test_hashes.py python
"""
Integration tests for the HashExtractor class.
"""
import pytest
import hashlib
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration]


class TestHashExtractorInitialization:
    """Tests for HashExtractor initialization."""

    def test_initialization_elf(self, elf_binary_path, mock_logger):
        """Test initialization with ELF file."""
        from redb.extractors.hashes import HashExtractor

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

            assert extractor.filepath == elf_binary_path
            assert extractor.hashes is None
            assert extractor.filetype == "elf"
            assert extractor.macho is None

    def test_initialization_with_macho_object(self, elf_binary_path, mock_logger):
        """Test initialization with pre-parsed macho object."""
        from redb.extractors.hashes import HashExtractor

        mock_macho = MagicMock()
        mock_macho.get_architectures.return_value = ["x86_64"]

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

            assert extractor.macho is mock_macho

    def test_initialization_pe(self, pe_binary_path, mock_logger):
        """Test initialization with PE file."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            assert extractor.filepath == pe_binary_path
            assert extractor.filetype == "pebin"
            # PE object should be created
            assert extractor.pe is not None

    def test_elastic_index_suffix(self, elf_binary_path, mock_logger):
        """Test that elastic_index has correct suffix."""
        from redb.extractors.hashes import HashExtractor

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

            assert "-hashes" in extractor.elastic_index


class TestHashExtractorTag:
    """Tests for tag method."""

    def test_tag_value(self, elf_binary_path, mock_logger):
        """Test that tag returns correct value."""
        from redb.extractors.hashes import HashExtractor
        from redb.extractors.enum import Tag

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

            assert extractor.tag() == Tag.HASH.value
            assert extractor.tag() == "hash"


class TestHashExtractorBasicHashes:
    """Tests for basic hash extraction."""

    def test_extract_md5(self, elf_binary_path, mock_logger, known_hashes):
        """Test MD5 hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            assert result.md5 == known_hashes['md5']

    def test_extract_sha1(self, elf_binary_path, mock_logger, known_hashes):
        """Test SHA1 hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            assert result.sha1 == known_hashes['sha1']

    def test_extract_sha256(self, elf_binary_path, mock_logger, known_hashes):
        """Test SHA256 hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            assert result.sha256 == known_hashes['sha256']

    def test_extract_ssdeep(self, elf_binary_path, mock_logger):
        """Test ssdeep hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # ssdeep should be a string
            assert isinstance(result.ssdeep_hash, str)

    def test_extract_tlsh(self, elf_binary_path, mock_logger):
        """Test TLSH hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # TLSH should be a string
            assert isinstance(result.tlsh_hash, str)


class TestHashExtractorPEHashes:
    """Tests for PE-specific hash extraction."""

    def test_extract_imphash(self, pe_binary_path, mock_logger):
        """Test imphash extraction for PE file."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Imphash should be set for PE files
            if extractor.pe is not None:
                assert result.imphash is not None or result.imphash is None  # May or may not have imports

    def test_extract_authentihash(self, pe_binary_path, mock_logger):
        """Test authentihash extraction for PE file."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Authentihash should be set for PE files
            if extractor.pe is not None:
                assert result.authentihash is not None

    def test_pe_hashes_not_set_for_elf(self, elf_binary_path, mock_logger):
        """Test that PE-specific hashes are not set for ELF files."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # PE-specific hashes should be None for ELF
            assert result.imphash is None
            assert result.authentihash is None
            assert result.richhash is None


class TestHashExtractorRichHeaderHashes:
    """Tests for Rich header hash extraction."""

    def test_compute_richhash(self, pe_binary_path, mock_logger):
        """Test Rich header hash computation."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Rich hash may or may not be present depending on the PE
            if result.richhash is not None:
                assert isinstance(result.richhash, str)
                assert len(result.richhash) == 32  # MD5 hex length

    def test_compute_richpe_hash(self, pe_binary_path, mock_logger):
        """Test RichPE hash computation."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # RichPE hash may or may not be present
            if result.richpe_hash is not None:
                assert isinstance(result.richpe_hash, str)
                assert len(result.richpe_hash) == 32  # MD5 hex length

    def test_compute_richpv_hash(self, pe_binary_path, mock_logger):
        """Test RichPV hash computation."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # RichPV hashes may or may not be present
            if result.richpv_hash is not None:
                assert isinstance(result.richpv_hash, str)
            if result.richpv_hash_sorted is not None:
                assert isinstance(result.richpv_hash_sorted, str)


class TestHashExtractorELFHashes:
    """Tests for ELF-specific hash extraction."""

    def test_extract_elf_import_hash(self, elf_binary_path, mock_logger):
        """Test ELF import hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # Import hash may or may not be present
            if result.import_hash is not None:
                assert isinstance(result.import_hash, str)
                assert len(result.import_hash) == 32

    def test_extract_elf_export_hash(self, elf_binary_path, mock_logger):
        """Test ELF export hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # Export hash may or may not be present
            if result.export_hash is not None:
                assert isinstance(result.export_hash, str)

    def test_extract_elf_section_hash(self, elf_binary_path, mock_logger):
        """Test ELF section hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # Section hash should be present for valid ELF
            if result.section_hash is not None:
                assert isinstance(result.section_hash, str)

    def test_extract_elf_symbol_hash(self, elf_binary_path, mock_logger):
        """Test ELF symbol hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # Symbol hash (symhash) may or may not be present
            if result.symbol_hash is not None:
                assert isinstance(result.symbol_hash, str)

    def test_extract_elf_dynamic_hash(self, elf_binary_path, mock_logger):
        """Test ELF dynamic hash extraction."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            # Dynamic hash may or may not be present
            if result.dynamic_hash is not None:
                assert isinstance(result.dynamic_hash, str)


class TestHashExtractorPrepareExportData:
    """Tests for prepare_export_data method."""

    def test_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.prepare_export_data("ElasticsearchExporter")

            assert result is extractor.hashes

    def test_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            # Should return tuple of (data, column_names, column_type_names)
            assert isinstance(result, tuple)
            assert len(result) == 3

            data, column_names, column_type_names = result

            assert isinstance(data, list)
            assert isinstance(column_names, list)
            assert isinstance(column_type_names, list)

            # Check expected columns
            assert 'sha256' in column_names
            assert 'md5' in column_names
            assert 'sha1' in column_names
            assert 'ssdeep_hash' in column_names
            assert 'tlsh_hash' in column_names

    def test_prepare_export_clickhouse_pe(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse with PE file."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ClickHouseExporter")

            data, column_names, column_type_names = result

            # PE-specific columns should be present
            assert 'authentihash' in column_names
            assert 'imphash' in column_names
            assert 'richhash' in column_names

    def test_prepare_export_clickhouse_has_macho_columns(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse includes Mach-O hash columns."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.prepare_export_data("ClickHouseExporter")

            data, column_names, column_type_names = result

            # Mach-O hash columns should be present
            assert 'macho_dylib_hash' in column_names
            assert 'macho_import_hash' in column_names
            assert 'macho_export_hash' in column_names
            assert 'macho_entitlement_hash' in column_names
            assert 'macho_symhash' in column_names


class TestHashExtractorClickHouseTable:
    """Tests for get_clickhouse_table method."""

    def test_clickhouse_table_name(self, elf_binary_path, mock_logger):
        """Test correct ClickHouse table name."""
        from redb.extractors.hashes import HashExtractor

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

            assert extractor.get_clickhouse_table() == "redb_hashes"


@pytest.mark.unit
@pytest.mark.dataclass
class TestHashExtractorHashesDataclass:
    """Tests for Hashes dataclass structure."""

    def test_hashes_dataclass_structure(self, elf_binary_path, mock_logger):
        """Test that Hashes dataclass has expected structure."""
        from redb.extractors.hashes import HashExtractor
        from redb.models.dataclasses import Hashes

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

            result = extractor.extract()

            assert isinstance(result, Hashes)
            # Required fields
            assert hasattr(result, 'md5')
            assert hasattr(result, 'sha1')
            assert hasattr(result, 'sha256')
            assert hasattr(result, 'ssdeep_hash')
            assert hasattr(result, 'tlsh_hash')
            # Optional fields
            assert hasattr(result, 'authentihash')
            assert hasattr(result, 'imphash')
            assert hasattr(result, 'richhash')

    def test_hashes_dataclass_has_macho_fields(self):
        """Test that Hashes dataclass has Mach-O hash fields."""
        from redb.models.dataclasses import Hashes

        # Create instance with default values
        hashes = Hashes(
            md5="d41d8cd98f00b204e9800998ecf8427e",
            sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
            sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
            ssdeep_hash="",
            tlsh_hash=""
        )

        # Verify Mach-O hash fields exist and default to None
        assert hasattr(hashes, 'macho_dylib_hash')
        assert hasattr(hashes, 'macho_import_hash')
        assert hasattr(hashes, 'macho_export_hash')
        assert hasattr(hashes, 'macho_entitlement_hash')
        assert hasattr(hashes, 'macho_symhash')

        assert hashes.macho_dylib_hash is None
        assert hashes.macho_import_hash is None
        assert hashes.macho_export_hash is None
        assert hashes.macho_entitlement_hash is None
        assert hashes.macho_symhash is None

    def test_hashes_dataclass_with_macho_values(self):
        """Test that Hashes dataclass can be created with Mach-O hash values."""
        from redb.models.dataclasses import Hashes

        hashes = Hashes(
            md5="d41d8cd98f00b204e9800998ecf8427e",
            sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
            sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
            ssdeep_hash="",
            tlsh_hash="",
            macho_dylib_hash="abc123def456789012345678901234567",
            macho_import_hash="def456abc123789012345678901234567",
            macho_export_hash="789012abc123def456345678901234567",
            macho_entitlement_hash="345678abc123def456789012901234567",
            macho_symhash="901234abc123def456789012345678567"
        )

        assert hashes.macho_dylib_hash == "abc123def456789012345678901234567"
        assert hashes.macho_import_hash == "def456abc123789012345678901234567"
        assert hashes.macho_export_hash == "789012abc123def456345678901234567"
        assert hashes.macho_entitlement_hash == "345678abc123def456789012901234567"
        assert hashes.macho_symhash == "901234abc123def456789012345678567"


class TestHashExtractorErrorHandling:
    """Tests for error handling in HashExtractor."""

    def test_extract_handles_hash_errors(self, elf_binary_path, mock_logger):
        """Test that extract handles hash computation errors gracefully."""
        from redb.extractors.hashes import HashExtractor

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

            # Even if some hashes fail, we should get a result
            result = extractor.extract()

            assert result is not None

    def test_extract_with_invalid_pe(self, elf_binary_path, mock_logger):
        """Test extraction when PE parsing fails."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Force filetype to be 'pebin' but use ELF file
            with patch.object(HashExtractor, '__init__', lambda self, *args, **kwargs: None):
                extractor = HashExtractor.__new__(HashExtractor)
                extractor.filepath = elf_binary_path
                extractor.log = mock_logger
                extractor.hashes = None
                extractor.pe = None
                extractor.filetype = 'pebin'

                with open(elf_binary_path, 'rb') as f:
                    extractor.binary = f.read()

                # Should not crash
                result = extractor._extract_hashes()
                assert result is not None


class TestHashExtractorMachoHashes:
    """Tests for Mach-O specific hash extraction."""

    def test_macho_hashes_not_set_for_elf(self, elf_binary_path, mock_logger):
        """Test that Mach-O hashes are not set for ELF files."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result is not None
            assert result.macho_dylib_hash is None
            assert result.macho_import_hash is None
            assert result.macho_export_hash is None
            assert result.macho_entitlement_hash is None
            assert result.macho_symhash is None

    def test_macho_hashes_not_set_for_pe(self, pe_binary_path, mock_logger):
        """Test that Mach-O hashes are not set for PE files."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert result.macho_dylib_hash is None
            assert result.macho_import_hash is None
            assert result.macho_export_hash is None
            assert result.macho_entitlement_hash is None
            assert result.macho_symhash is None

    def test_extract_macho_hashes_with_mock(self, elf_binary_path, mock_logger):
        """Test Mach-O hash extraction with mocked macho object."""
        from redb.extractors.hashes import HashExtractor

        # Create mock macho object
        mock_macho = MagicMock()
        mock_macho.get_architectures.return_value = ["x86_64"]
        mock_macho.get_similarity_hashes.return_value = {
            'dylib_hash': 'abc123def456789012345678901234ab',
            'import_hash': 'def456abc789012345678901234567cd',
            'export_hash': '789012abc456def345678901234567ef',
            'entitlement_hash': '345678abc123def789012901234567gh',
            'symhash': '901234abc123def456789012345678ij'
        }

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(elf_binary_path, mock_logger, macho=mock_macho)
            # Override filetype to trigger macho hash extraction
            extractor.filetype = 'macho'

            result = extractor.extract()

            assert result is not None
            assert result.macho_dylib_hash == 'abc123def456789012345678901234ab'
            assert result.macho_import_hash == 'def456abc789012345678901234567cd'
            assert result.macho_export_hash == '789012abc456def345678901234567ef'
            assert result.macho_entitlement_hash == '345678abc123def789012901234567gh'
            assert result.macho_symhash == '901234abc123def456789012345678ij'

    def test_extract_macho_hashes_fat_binary_mock(self, elf_binary_path, mock_logger):
        """Test Mach-O hash extraction for FAT binary with mocked macho object."""
        from redb.extractors.hashes import HashExtractor

        # Create mock macho object for FAT binary
        mock_macho = MagicMock()
        mock_macho.get_architectures.return_value = ["x86_64", "arm64"]  # Multiple archs = FAT
        mock_macho.get_similarity_hashes.return_value = {
            'fat': {
                'dylib_hash': 'fat_dylib_hash_12345678901234567',
                'import_hash': 'fat_import_hash_12345678901234567',
            },
            'combined': {
                'dylib_hash': 'combined_dylib_hash_1234567890123',
            }
        }

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(elf_binary_path, mock_logger, macho=mock_macho)
            extractor.filetype = 'macho'

            result = extractor.extract()

            assert result is not None
            # Should use 'fat' key for FAT binaries
            assert result.macho_dylib_hash == 'fat_dylib_hash_12345678901234567'
            assert result.macho_import_hash == 'fat_import_hash_12345678901234567'

    def test_extract_macho_hashes_handles_empty(self, elf_binary_path, mock_logger):
        """Test Mach-O hash extraction handles empty hash dict."""
        from redb.extractors.hashes import HashExtractor

        mock_macho = MagicMock()
        mock_macho.get_architectures.return_value = ["x86_64"]
        mock_macho.get_similarity_hashes.return_value = {}

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(elf_binary_path, mock_logger, macho=mock_macho)
            extractor.filetype = 'macho'

            result = extractor.extract()

            # Should not crash, hashes should be None
            assert result is not None
            assert result.macho_dylib_hash is None

    def test_extract_macho_hashes_handles_none(self, elf_binary_path, mock_logger):
        """Test Mach-O hash extraction handles None return."""
        from redb.extractors.hashes import HashExtractor

        mock_macho = MagicMock()
        mock_macho.get_architectures.return_value = ["x86_64"]
        mock_macho.get_similarity_hashes.return_value = None

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = HashExtractor(elf_binary_path, mock_logger, macho=mock_macho)
            extractor.filetype = 'macho'

            result = extractor.extract()

            # Should not crash
            assert result is not None


class TestHashExtractorConsistency:
    """Tests for hash consistency."""

    def test_hash_consistency_across_extractions(self, elf_binary_path, mock_logger):
        """Test that hashes are consistent across multiple extractions."""
        from redb.extractors.hashes import HashExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor1 = HashExtractor(elf_binary_path, mock_logger)
            result1 = extractor1.extract()

            extractor2 = HashExtractor(elf_binary_path, mock_logger)
            result2 = extractor2.extract()

            assert result1.md5 == result2.md5
            assert result1.sha1 == result2.sha1
            assert result1.sha256 == result2.sha256

    def test_hash_values_are_lowercase(self, elf_binary_path, mock_logger):
        """Test that hash values are lowercase hex strings."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert result.md5 == result.md5.lower()
            assert result.sha1 == result.sha1.lower()
            assert result.sha256 == result.sha256.lower()

    def test_hash_lengths_correct(self, elf_binary_path, mock_logger):
        """Test that hash lengths are correct."""
        from redb.extractors.hashes import HashExtractor

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

            result = extractor.extract()

            assert len(result.md5) == 32  # MD5 = 128 bits = 32 hex chars
            assert len(result.sha1) == 40  # SHA1 = 160 bits = 40 hex chars
            assert len(result.sha256) == 64  # SHA256 = 256 bits = 64 hex chars