Nataliia Kunanets

163 papers A 1C 6Misc 28Journal 2Unranked 120
YearRankTypeTitle / Venue / Authors
2025 ed.
ITPM
Sergey Bushuyev, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova
2025 conf
ITPM
Liubava S. Chernova, Sergiy Titov, Serhii Chernov, Lyudmila Chernova, Nataliia Kunanets
2024 conf
CPITS II
Yurii Yaremchuk, Olha Saliieva, Vasyl Karpinets, Andrii Nikolaienko, Nataliia Kunanets
2024 conf
MoDaST
Volodymyr Pasichnyk, Nataliia Kunanets, Valentyna Yunchyk, Maria Khomyak, Anatolii Fedonyuk, Yurii Knysh
2024 conf
COLINS (1)
Nataliia Kunanets, Yuriy Shcherbyna, Volodymyr Karpiv
2024 conf
CITI
Oleh Palka, Lesia Dmytrotsa, Oleksii Duda, Nataliia Kunanets, Volodymyr Pasichnyk
2024 conf
ITPM
Liubava S. Chernova, Iryna Zhuravel, Serhii Chernov, Lyudmila Chernova, Nataliia Kunanets
2024 conf
ITPM
Ruslan Nebesnyi, Nataliia Kunanets, Nataliia Veretennikova, Roman Vaskiv, Zoriana Haladzhun, Mgr. Martin Graca
2024 ed.
ITPM
Sergey Bushuyev, Nataliia Kunanets, Volodymyr Pasichnyk
2024 conf
ITPM
Volodymyr Pasichnyk, Nataliia Kunanets, Valentyna Yunchyk, Maria Khomyak, Anatolii Fedonyuk
2024 Misc conf
CSIT
Serhii Chernov, Liudmyla Chernova, Liubava S. Chernova, Nataliia Kunanets, Sergey Titov, Evgeniy Trushliakov
2024 conf
ITPM
Nataliia Kunanets, Kateryna Semenchuk, Liubava S. Chernova
2024 conf
ITPM
Liubava S. Chernova, Sergiy Titov, Serhii Chernov, Lyudmila Chernova, Nataliia Kunanets
2024 conf
ITPM
Vitaliy Lazoryshynets, Volodymyr Pasichnyk, Nataliia Kunanets, Olga Artemenko, Andrii Sihaiov, Hanna Hesheva
2023 conf
COLINS (2)
Zoriana Haladzhun, Khrystyna Datsyshyn, Yuriy Bidzilya, Nataliia Kunanets, Nataliia Veretennikova
2023 Misc conf
CSIT
Halyna Lypak, Nataliia Kunanets, Nataliia Veretennikova, Halyna Matsiuk, Taras Kramar, Oleksii Duda
2023 conf
COLINS (3)
Oleh Palka, Nataliia Kunanets, Volodymyr Pasichnyk, Oleksandr Matsiuk, Sofia Matsiuk
2023 conf
MoMLeT+DS
Volodymyr Pasichnyk, Nataliia Kunanets, Valentyna Yunchyk, Maria Khomyak, Svitlana Yatsyuk, Vadim Muliar, Anatolii Fedonuyk
2023 ed.
ITPM
Sergey Bushuyev, Nataliia Kunanets, Volodymyr Pasichnyk
2023 Misc conf
CSIT
Nataliia Kunanets, Vasyl Morokhovych, Vasyl Kut, Dajana Popchenko
2023 Misc conf
CSIT
Nataliia Kunanets, Vasyl Morokhovych, Vasyl Kut, Pavlo Fedorka, Oleh Popovych
2023 conf
EUSPN/ICTH
Taras Dyda, Nataliia Kunanets, Roman Vaskiv, Daniyar Dauletiya, Sergiy Chernov, Ludmila Chernova, Lubava Chernova
2023 conf
ITPM
Sergiy Chernov, Sergiy Titov, Ludmila Chernova, Nataliia Kunanets, Lubava S. Chernova, Evgeniy Trushliakov, Pavlo Fedorka
2023 Misc conf
CSIT
Serhii Chernov, Liudmyla Chernova, Liubava S. Chernova, Nataliia Kunanets, Varvara Piterska
2023 conf
MoMLeT+DS
Nataliia Kunanets, Olga Artemenko, Volodymyr Pasichnyk, Vasyl Kut, Arsen Ivanchov
2022 Misc conf
CSIT
Liubava S. Chernova, Anna Zhuravel, Lyudmila Chernova, Serhii Chernov, Nataliia Kunanets, Olga Artemenko
2022 conf
ITPM
Serhii Chernov, Serhii Titov, Liudmyla Chernova, Liubava S. Chernova, Antonina Trushliakova, Nataliia Kunanets, Igor Bobyk
2022 conf
ITTAP
Nataliya Zagorodna, Yuriy Skorenkyy, Nataliia Kunanets, Ihor Baran, Maria Stadnyk
2022 conf
SCIA
Nestor Dumanskyi, Nataliia Kunanets
2022 conf
COLINS
Marta Karp, Nataliia Kunanets, Ivan Bekhta
2022 Misc conf
CSIT
Diana Koshtura, Nataliia Kunanets
2022 conf
ITPM
Andryi Helyi, Nataliia Kunanets, Antonii Rzheuskyi, Andrii Sihaiov, Parviz Kazym
2022 conf
CMiGIN
Andrii Pryimak, Yurii Yaremchuk, Nataliia Kunanets
2022 Misc conf
CSIT
Zoriana Haladzhun, Nataliia Kunanets, Lidiia Snitsarchuk, Nataliia Veretennikova
2022 Misc conf
CSIT
Tetiana Kovaliuk, Nataliya Kobets, Anastasia Shevchenko, Nataliia Kunanets
2022 conf
COLINS
Khrystyna Datsyshyn, Zoriana Haladzhun, Nataliia Kunanets, Oksana Hotsur, Nataliia Veretennikova
2022 conf
MoMLeT+DS
Rostyslav Yurynets, Zoryna Yurynets, Mariola Grzebyk, Marianna Kokhan, Nataliia Kunanets, Maryna Shevchenko
2022 conf
CMiGIN
Vitalii Kataiev, Dmytro Yevhrafov, Vasyl Karpinets, Yurii Yaremchuk, Nataliia Kunanets
2022 ed.
ITPM
Sergey Bushuyev, Nataliia Kunanets, Volodymyr Pasichnyk
2022 Misc conf
CSIT
Hanna Pryshchepa, Nataliia Kunanets
2022 conf
ITPM
Marta Karp, Nataliia Kunanets, Vasylyna Skorokhoda
2022 conf
ITPM
Serhii Chernov, Sergiy Titov, Ludmila Chernova, Lubava S. Chernova, Antonina Trushliakova, Nataliia Kunanets, Serhii Lupenko
2022 Misc conf
CSIT
Marta Karp, Nataliia Kunanets, Anna Burtnyk, Oksana Melnychuk, Ivan Bekhta, Iryna Shainer
2022 Misc conf
CSIT
Yustyna Stetsyk, Nataliia Kunanets, Antonii Rzheuskyi
2021 conf
CSIT (2)
Yuriy Turbal, Sergii Babych, Nataliia Kunanets, Leonid Melnyk, Volodymyr Pasichnyk
2021 conf
CSIT (2)
Halyna Matsiuk, Liliana Dzhydzhora, Nataliia Kunanets, Oleksandr Matsiuk
2021 conf
CSIT (2)
Viktoriia Dobrovolska, Nataliia Kunanets, Oksana Zbanatska, Oleksandr Kyrylenko, Sergii Lytvyn
2021 conf
CSIT (2)
Oleksii Duda, Nataliia Kunanets, Serhii V. Martsenko, Vyacheslav Nykytyuk, Volodymyr Pasichnyk
2021 conf
CSIT (2)
Zoriana Haladzhun, Nataliia Kunanets, Paraskoviya Dvorianyn, Olena Makarchuk, Nataliia Veretennikova
2021 conf
ITPM
Ivan Kizlivskyi, Oleksandr Shpak, Nataliia Kunanets, Antonii Rzheuskyi
2021 conf
ITTAP
Yuriy Skorenkyy, Nataliya Zagorodna, Nataliia Kunanets, Ihor Baran
2021 conf
CSIT (2)
Tetiana Skliarova, Nataliia Kunanets, Sydir Kiral
2021 conf
ITPM
Sergiy Chernov, Sergey Titov, Lyudmila Chernova, Nataliia Kunanets, Varvara Piterska, Liubava S. Chernova, Yuriy Shcherbyna, Lubomyr B. Petryshyn
2021 C conf
IDDM
Vyacheslav Nykytyuk, Vasyl Dozorskyy, Nataliia Kunanets, Volodymyr Pasichnyk, Oleksandr Matsiuk, Ihor Bodnarchuk
2021 conf
COLINS
Nataliia Kunanets, Yurii Oliinyk, Dmytro Myhal, Khrystyna Shunevych, Antonii Rzheuskyi, Yuriy Shcherbyna
2021 conf
COLINS
Oleksii Duda, Volodymyr Pasichnyk, Halyna Lypak, Nataliia Veretennikova, Nataliia Kunanets, Oleksandr Matsiuk, Valentyna Mudrokha
2021 conf
COLINS
Roman Bakhmut, Nataliia Kunanets, Antonii Rzheuskyi, Volodymyr Pasichnyk, Vasyl Kut, Oleksandr Volkov, Ivan Tsmots
2021 conf
CSIT (2)
Ruslan Nebesnyi, Nataliia Kunanets, Roman Vaskiv, Nataliia Veretennikova
2021 conf
COLINS
Zoriana Haladzhun, Olha Harmatiy, Yuriy Bidzilya, Nataliia Kunanets, Khrystyna Shunevych
2021 conf
ITPM
Nataliia Kunanets, Anna Synko, Nataliia Veretennikova
2021 conf
CSIT (2)
Oleksii Duda, Nataliia Kunanets, Serhii V. Martsenko, Vyacheslav Nykytyuk, Volodymyr Pasichnyk
2021 conf
MoMLeT+DS
Vasyl Lenko, Volodymyr Pasichnyk, Nataliia Kunanets, Yuri Shcherbyna
2021 conf
CSIT (2)
Tetiana Kovaliuk, Nataliya Kobets, Volodymyr Pasichnyk, Nataliia Kunanets
2021 conf
CSIT (2)
Marta Karp, Nataliia Kunanets, Ivan Bekhta, Uliana Yurlova
2021 conf
COLINS
Marta Karp, Nataliia Kunanets, Yuliia Kucher
2021 conf
ProfIT AI
Andrii Pryimak, Yurii Yaremchuk, Olha Saliieva, Vasyl Karpinets, Nataliia Kunanets
2021 conf
CSIT (2)
Yuriy Pankiv, Nataliia Kunanets, Olga Artemenko, Antonii Rzheuskyi, Serhii Osadchuk
2021 conf
ITPM
Olga Artemenko, Nataliia Kunanets, Volodymyr Pasichnyk, Vasyl Kut, Oleksandr Lozytskyi
2021 conf
CSIT (2)
Hanna Pryshchepa, Nataliia Kunanets
2021 conf
IntelITSIS
Yuriy Turbal, Mariana Turbal, Andriy Bomba, Abd Alkaleg Hsen Driwi, Nataliia Kunanets
2021 conf
ITTAP
Yurii Turbal, Sergii Babych, Larysa Bachyshyna, Nataliia Kunanets, Nataliia Kovalchuk
2021 conf
ITPM
Nataliia Kunanets, Marta Karp, Tetiana Yaremchuk
2021 conf
CSIT (2)
Yaroslav Kis, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova, Stepan Lysa
2021 ed.
ITPM
Sergey Bushuyev, Vasyl Lytvyn, Nataliia Kunanets, Volodymyr Pasichnyk
2021 conf
CSIT (2)
Nataliia Kunanets, Liudmyla Sokur, Viktoriia Dobrovolska, Sergii Lytvyn
2021 conf
CSIT (2)
Yuriy Pankiv, Nataliia Kunanets, Olga Artemenko, Nataliia Veretennikova, Ruslan Nebesnyi
2021 conf
ITTAP
Serhii Lupenko, Iaroslav Lytvynenko, Nataliia Kunanets, Oleg Nazarevych, Grigorii Shymchuk, Volodymyr Hotovych
2021 conf
IntelITSIS
Oleksandr Tymchenko, Nataliia Kunanets, Svitlana Vasiuta, Olha Sosnovska, Orest Khamula
2021 conf
CSIT (2)
Serhii Chernov, Serhii Titov, Liudmyla Chernova, Varvara Piterska, Liubava S. Chernova, Nataliia Kunanets
2021 conf
CSIT (2)
Yan Peng, Nataliia Kunanets, Iryna Davydova, Nataliia Veretennikova
2021 conf
CSIT (2)
Roman Bakhmut, Nataliia Kunanets, Volodymyr Pasichnyk, Olga Artemenko, Ivan Tsmots
2020 conf
MoMLeT+DS
Taras Teslyuk, Vasyl Teslyuk, Halyna Lypak, Nataliia Kunanets, Nataliia Veretennikova
2020 Misc conf
CSIT
Oleksii Duda, Nataliia Kunanets, Oleksandr Matsiuk, Volodymyr Pasichnyk, Antonii Rzheuskyi
2020 conf
MoMLeT+DS
Yaroslav Vyklyuk, Nataliia Kunanets, Volodymyr Pasichnyk, Olena Husak, Oksana Kunanets, Yurii Kryvenchuk
2020 A conf
ICST
Denys Gobov, Catherine Maliarcuk, Nataliia Kunanets, Yurii Oliinyk
2020 conf
CSIT (2)
Oleksandr Kramar, Yuriy Drohobytskiy, Yuriy Skorenkyy, Oleksandr Rokitskyi, Nataliia Kunanets, Volodymyr Pasichnyk, Oleksandr Matsiuk
2020 conf
CSIT (2)
Nataliia Kunanets, Nataliia Filippova, Viktoriya Dobrovolska, Parviz Kazimi
2020 conf
IntelITSIS
Oleksii Duda, Nataliia Kunanets, Serhii V. Martsenko, Oleksandr Matsiuk, Volodymyr Pasichnyk
2020 conf
ICTERI Workshops
Ihor Bodnarchuk, Oleksii Duda, Alexander Kharchenko, Nataliia Kunanets, Oleksandr Matsiuk, Volodymyr Pasichnyk
2020 Misc conf
CSIT
Nataliia Kunanets, Viktoriya Dobrovolska, Nataliia Filippova, Parviz Kazimi, Halyna Lypak, Oleksii Duda, Nataliia Veretennikova, Marta Karp, Chrystyna Shunevych, Luybov Dubrovina
2020 conf
CSIT (2)
Halyna Lypak, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova
2020 conf
ACIT
Halyna Lypak, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova
2020 conf
ITPM
Oleg Fedorovych, Nataliia Kunanets, Yuliia Leshhenko, Nataliia Veretennikova
2020 conf
CSIT (2)
Oleksii Duda, Oleh Palka, Volodymyr Pasichnyk, Oleksandr Matsiuk, Nataliia Kunanets, Danylo Tabachyshyn
2020 conf
CSIT (2)
Ruslan Nebesnyi, Volodymyr Pasichnyk, Nataliia Kunanets, Nataliia Veretennikova, Oksana Kunanets
2020 C conf
IDDM
Nataliia Kunanets, Volodymyr Pasichnyk, Petro Kravets, Yaroslav Kis, Roksolana Havryliv, Antonii Rzheuskyi
2020 conf
CSIT (2)
Sergiy Chernov, Nataliia Kunanets, Sergey Titov, Lubava S. Chernova, Ludmila Chernova
2020 conf
CSIT (1)
Oleksandr V. Prokhorov, Yurii Pronchakov, Oleg Fedorovich, Nataliia Kunanets
2020 conf
CSIT (2)
Oleksii Duda, Volodymyr Pasichnyk, Nataliia Kunanets, Antonii Rzheuskyi, Oleksandr Matsiuk
2020 conf
CSIT (2)
Tetiana Kovaliuk, Nataliya Kobets, Volodymyr Pasichnyk, Nataliia Kunanets
2020 ed.
ITPM
Sergey Bushuyev, Vasyl Lytvyn, Nataliia Kunanets, Volodymyr Pasichnyk
2020 conf
MoMLeT+DS
Oleksii Duda, Nataliia Kunanets, Oleksandr Matsiuk, Volodymyr Pasichnyk, Nataliia Veretennikova, Anatoliy Fedonuyk, Valentyna Yunchyk
2020 conf
ITPM
Sergey Titov, Lyudmila Chernova, Nataliia Kunanets, Liubava S. Chernova, Evgeny Nedelko, Serhey Chernov
2020 conf
CSIT (2)
Yurii Tulashvili, Yurii Turbal, Abd Alkaleg Hsen Driwi, Volodymyr Pasichnyk, Al Shukri Sumayya Ali, Nataliia Kunanets
2020 conf
MoMLeT+DS
Mykola Odrekhivskyy, Volodymyr Pasichnyk, Nataliia Kunanets, Antonii Rzheuskyi, Galyna Korz, Danylo Tabachyshyn
2020 conf
CSIT (2)
Olga Artemenko, Volodymyr Pasichnyk, Nataliia Kunanets
2020 conf
COLINS
Olga Artemenko, Volodymyr Pasichnyk, Nataliia Kunanets, Khrystyna Shunevych
2019 conf
CSIT (3)
Nataliia Kunanets, Ostap Vasiuta, Nataliya Boyko
2019 conf
CSIT (3)
Nataliia Kunanets, Matsiuk Halyna
2019 conf
CSIT (3)
Tetiana Kovaliuk, Alexandr Ustimenko, Nataliya Kobets, Volodymyr Pasichnyk, Nataliia Kunanets
2019 conf
COLINS
Artem Kazarian, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova, Antonii Rzheuskyi, Andrii Leheza, Oksana Kunanets
2019 conf
IDAACS
Oleksii Duda, Volodymyr Kochan, Nataliia Kunanets, Oleksandr Matsiuk, Volodymyr Pasichnyk, Anatoliy Sachenko, Taras Pytlenko
2019 conf
CSIT (3)
Oleh Veres, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova, Roman Korzh, Andrii Leheza
2019 conf
CSIT (3)
Roman Holoshchuk, Volodymyr Pasichnyk, Oksana Kunanets, Nataliia Kunanets, Antonii Rzheuskyi, Roman Korzh
2019 Misc conf
CSIT
Roman Holoshchuk, Volodymyr Pasichnyk, Nataliia Kunanets, Nataliia Veretennikova
2019 C conf
IDDM
Ihor Bodnarchuk, Nataliia Kunanets, Serhii V. Martsenko, Oleksandr Matsiuk, Anastasiia Matsiuk, Volodymyr Pasichnyk, Roman Tkachuk, Hryhorii Shymchuk
2019 conf
MoMLeT
Nataliia Veretennikova, Oleksandr Lozytskyi, Roman Vaskiv, Oksana Kunanets, Andrii Leheza, Olga Lozynska, Nataliia Kunanets
2019 conf
ICTERI Workshops
Mykola Odrekhivskyy, Nataliia Kunanets, Volodymyr Pasichnyk, Antonii Rzheuskyi, Danylo Tabachyshyn
2019 conf
CSIT (3)
Stanislav Bilokon, Yuriy Turbal, Nataliia Kunanets, Volodymyr Pasichnyk
2019 conf
CSIT (3)
Roman Holoshchuk, Volodymyr Pasichnyk, Nataliia Kunanets, Nataliia Veretennikova, Taras Pytlenko
2019 Misc conf
CSIT
Andrii Bomba, Mariia Nazaruk, Nataliia Kunanets, Volodymyr Pasichnyk
2019 conf
CSIT (3)
Volodymyr Pasichnyk, Nataliia Kunanets, Mariia Nazaruk, Andrii Bomba, Yurii Bilak
2019 conf
ACIT
Halyna Lypak, Nataliia Kunanets, Volodymyr Pasichnyk, Nataliia Veretennikova
2019 conf
DCSMart
Vasyl Andrunyk, Volodymyr Pasichnyk, Nataliia Kunanets, Tetiana Shestakevych
2019 conf
IDAACS
Volodymyr Kochan, Oleksandr Matsiuk, Nataliia Kunanets, Volodymyr Pasichnyk, Oleksiy Roshchupkin, Anatoliy Sachenko, Iryna V. Turchenko, Oleksii Duda, Vita Semaniuk, Svitlana Romaniv
2019 conf
CSIT (3)
Volodymyr Pasichnyk, Nataliia Kunanets, Nataliia Veretennikova, Antonii Rzheuskyi, Mariia Nazaruk
2019 conf
CSIT (2)
Oleksii Duda, Serhii V. Martsenko, Oleksandr Matsiuk, Nataliia Kunanets, Volodymyr Pasichnyk
2019 Misc conf
ICTERI
Andriy Bomba, Nataliia Kunanets, Volodymyr Pasichnyk, Yuriy Turbal, Mariia Nazaruk
2019 conf
CSIT (3)
Serhii Chernov, Liudmyla Chernova, Liubava S. Chernova, Serhii Titov, Nataliia Kunanets
2019 Misc conf
ICTERI
Serhii Chernov, Serhii Titov, Liubava S. Chernova, Nataliia Kunanets
2019 Misc conf
ICTERI
Nataliia Kunanets, Yurii Oliinyk, Dmytro Kobylynskyi, Antonii Rzheuskyi, Khristina Shunevich, Valentyn Tomashevskyi
2019 conf
ACIT
Oleksandr Matsiuk, Nataliia Kunanets, Volodymyr Pasichnyk, Vasyl Lenko, Yuriy Shcherbyna, Antonii Rzheuskyi
2019 conf
CSIT (3)
Serhii Lupenko, Volodymyr Pasichnyk, Nataliia Kunanets, Andrii Horkunenko
2019 conf
CSIT (3)
Oleksii Duda, Serhii V. Martsenko, Oleksandr Matsiuk, Nataliia Kunanets, Volodymyr Pasichnyk
2018 Misc conf
ICTERI
Volodymyr Pasichnyk, Tetiana Shestakevych, Nataliia Kunanets, Vasyl Andrunyk
2018 conf
CSIT (2)
Nataliia Kunanets, Matsiuk Halyna
2018 conf
CSIT (1)
Serhii Lupenko, Volodymyr Pasichnyk, Nataliia Kunanets
2018 conf
CSIT (2)
Volodymyr Pasichnyk, Mariia Nazaruk, Nataliia Kunanets, Nataliia Veretennikova, Ruslan Nebesnyi
2018 Misc conf
CSIT
Artem Kazarian, Roman Holoshchuk, Nataliia Kunanets, Tetiana Shestakevysh, Antonii Rzheuskyi
2018 conf
CSIT (2)
Artem Kazarian, Nataliia Kunanets, Roman Holoshchuk, Volodymyr Pasichnyk, Antonii Rzheuskyi
2018 Misc conf
CSIT
Danylo Tabachyshyn, Nataliia Kunanets, Mykolay Karpinski, Oleksii Duda, Oleksandr Matsiuk
2018 conf
CSIT (2)
Oleksii Duda, Oleksandr Matsiuk, Mikolaj P. Karpinski, Nataliia Veretennikova, Nataliia Kunanets, Volodymyr Pasichnyk
2018 C conf
IDDM
Yaroslav Vyklyuk, Nataliia Kunanets, Tetyana Kalahurka, Mykhailo Voronovsky
2018 Misc conf
ICTERI
Nataliia Veretennikova, Oleksandr Lozytskyi, Nataliia Kunanets, Volodymyr Pasichnyk
2018 Misc conf
ICTERI
Oleksii Duda, Nataliia Kunanets, Oleksandr Matsiuk, Volodymyr Pasichnyk
2018 Misc conf
ICTERI
Volodymyr Pasichnyk, Mariia Nazaruk, Nataliia Kunanets
2018 conf
CSIT (2)
Roman Kaminskyi, Nataliia Kunanets, Antonii Rzheuskyi, Andrii Khudyi
2018 conf
CSIT (2)
Volodymyr Pasichnyk, Vasyl Lytvyn, Nataliia Kunanets, Roman Vovnyanka, Yuriy Bolyubash, Antonii Rzheuskyi
2018 Misc conf
CSIT
Serhii Lupenko, Volodymyr Pasichnyk, Nataliia Kunanets
2018 J jnl
Int. J. Comput.
Andrii Bomba, Nataliia Kunanets, Volodymyr Pasichnyk, Yuriy Turbal
2018 conf
CSIT (2)
Antonii Rzheuskyi, Nataliia Kunanets, Mykola Stakhiv
2018 conf
COLINS
Roman Kaminskyi, Nataliia Kunanets, Volodymyr Pasichnyk, Antonii Rzheuskyi, Andrii Khudyi
2018 conf
CSIT (2)
Antonii Rzheuskyi, Nataliia Kunanets, Nataliia Veretennikova, Roman Vaskiv
2018 C conf
IDDM
Volodymyr Pasichnyk, Nataliia Kunanets, Serhii V. Martsenko, Oleksandr Matsiuk, Olesia Mytnyk, Oleksii Duda, Pawel Falat
2018 conf
CSIT (2)
Volodymyr Pasichnyk, Nataliia Kunanets, Ivan Kozak
2018 conf
CSIT (2)
Nataliia Kunanets, Olena Levchenko, Anna Hadzalo
2018 C conf
IDDM
Serhii A. Lupenko, Volodymyr Pasichnyk, Nataliia Kunanets, Oleksandra Orobchuk, Mingtang Xu
2018 conf
ICTERI Workshops
Antonii Rzheuskyi, Nataliia Kunanets
2018 conf
CSIT (1)
Tetiana Shestakevych, Volodymyr Pasichnyk, Nataliia Kunanets, Mykola Medykovskyy, Natalya Antonyuk
2017 conf
CSIT (1)
Nataliia Veretennikova, Nataliia Kunanets
2017 J jnl
Int. J. Comput.
Andrii Bomba, Mariia Nazaruk, Nataliia Kunanets, Volodymyr Pasichnyk
2015 Misc conf
CSIT
Nataliia Veretennikova, Volodymyr Pasichnyk, Nataliia Kunanets, Bogdan Gats
2015 Misc conf
CSIT
Volodymyr Pasichnyk, Nataliia Kunanets
tests/unit/test_apk_decompile_extractor.py
← Index tests/unit/test_apk_decompile_extractor.py python
"""
Unit tests for DecompileAPK extractor, export data, and ClickHouse schemas.

Tests the main DecompileAPK extractor class following the DecompileBinja test pattern.
All analysis is mocked — no JADX/apktool/Java installation required.
"""
import hashlib
import os
import tempfile
import zipfile

import pytest
from unittest.mock import MagicMock, patch, PropertyMock
from dataclasses import asdict

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


def _create_fake_apk_file():
    """Create a minimal APK file for testing and return its path."""
    tmpdir = tempfile.mkdtemp()
    apk_path = os.path.join(tmpdir, "test.apk")
    with zipfile.ZipFile(apk_path, "w") as zf:
        zf.writestr("AndroidManifest.xml", b"<manifest/>")
        zf.writestr("classes.dex", b"dex\n035\x00" + b"\x00" * 100)
    return apk_path


# ============================================================================
# DecompileAPK Extractor Tests
# ============================================================================

class TestDecompileAPK:
    """Tests for the DecompileAPK extractor class."""

    def test_tag(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.tag() == "apk_decompiled"
        finally:
            os.unlink(apk_path)

    def test_get_clickhouse_table(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.get_clickhouse_table() is None
        finally:
            os.unlink(apk_path)

    def test_timeout_default(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_timeout_from_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "900"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 900
        finally:
            os.unlink(apk_path)

    def test_timeout_invalid_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "not_a_number"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_calculate_md5(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            result = ext.calculate_md5("test_string")
            assert len(result) == 32
            assert result == hashlib.md5(b"test_string").hexdigest()
        finally:
            os.unlink(apk_path)

    def test_context_manager(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with DecompileAPK(apk_path, MagicMock()) as ext:
                assert ext is not None
        finally:
            os.unlink(apk_path)

    def test_cleanup_run(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analyzer = MagicMock()
            ext.cleanup_run()
            assert ext.analyzer is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Export Data Tests
# ============================================================================

class TestPrepareExportData:
    """Tests for DecompileAPK.prepare_export_data() ClickHouse schemas."""

    def _make_extractor_with_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        ext = DecompileAPK(apk_path, MagicMock())
        ext.analysis_results = {
            "sha256": "a" * 64,
            "sha1": "b" * 40,
            "md5": "c" * 32,
            "decompiled_content": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "decompiled_method": "public void foo() {}",
                    "decompiled_method_type": "USER",
                    "decompiled_has_string_encryption": False,
                    "decompiled_has_reflection_calls": False,
                    "decompiled_excessive_goto_count": False,
                }
            ],
            "decompiled_refs": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "smali_method_hash": "e" * 64,
                    "decompiled_class_name": "com.example.Foo",
                    "decompiled_method_name": "foo",
                    "decompiled_method_signature": "()V",
                    "decompiled_method_prototype": "void foo()",
                    "functions_caller": ["bar"],
                    "functions_call": ["baz"],
                }
            ],
            "smali_content": [
                {
                    "smali_method_hash": "e" * 64,
                    "smali_method": "invoke-virtual {p0}, Lfoo;->bar()V\nreturn-void",
                    "smali_method_type": "USER",
                    "smali_instructions_count": 10,
                    "smali_register_count": 3,
                    "smali_has_string_encryption": False,
                    "smali_has_reflection_calls": False,
                    "smali_excessive_goto_count": False,
                    "smali_flattened_score": 0.0,
                    "smali_mba_score": 0.0,
                }
            ],
            "smali_refs": [
                {
                    "smali_method_hash": "e" * 64,
                    "decompiled_method_hash": "d" * 64,
                    "smali_class_name": "com.example.Foo",
                    "smali_method_name": "foo",
                    "smali_method_signature": "()V",
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                }
            ],
            "similarity_metrics": [
                {
                    "smali_method_hash": "e" * 64,
                    "cyclomatic_complexity": 2,
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                    "ssdeep_smali_normalized": None,
                    "tlsh_smali_normalized": None,
                    "minhash": [],
                }
            ],
            "cfg": [
                {
                    "smali_method_hash": "e" * 64,
                    "cfg_topology_hash": b'\x01' * 16,
                    "block_count": 3,
                    "edge_count": 3,
                    "cfg_instructions_count": 10,
                    "call_count": 1,
                    "cyclomatic_complexity": 2,
                    "loop_count": 0,
                    "max_depth": 2,
                    "max_fan_out": 2,
                    "md_index_topdown": 12345,
                    "md_index_bottomup": 67890,
                    "prime_product_smali": 999,
                    "cfg_feature_tlsh": None,
                    "wl_minhash": [0] * 128,
                    "bb_features": [[5, 1, 0, 1, 1, 0, 0, 2]] * 3,
                    "cfg_adjacency": [0x00000001, 0x00000002],
                }
            ],
            "strings": [
                {
                    "string": "https://evil.example.com/payload",
                    "string_encoding": "UTF8",
                    "string_offset": 0,
                    "string_length": 31,
                    "string_entropy": 3.95,
                }
            ],
            "analysis_errors": [
                {
                    "class_name": "com.example.Foo",
                    "method_name": "bar",
                    "error_location": "jadx",
                    "error_message": "timeout",
                    "error_type": "TimeoutError",
                }
            ],
        }
        return ext, apk_path

    def test_returns_none_when_no_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.prepare_export_data("ClickHouseExporter") is None
        finally:
            os.unlink(apk_path)

    def test_multi_table_flag(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export["multi_table"] is True
        finally:
            os.unlink(apk_path)

    def test_all_table_keys_present(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "decompiled_content" in export
            assert "decompiled_refs" in export
            assert "smali_content" in export
            assert "smali_refs" in export
            assert "method_similarity_metrics" in export
            assert "strings_raw" in export
            assert "analysis_errors" in export
        finally:
            os.unlink(apk_path)

    def test_decompiled_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dc = export["decompiled_content"]
            assert dc["table"] == "code_apk_decompiled_methods_content"
            assert len(dc["column_names"]) == 7
            assert len(dc["column_type_names"]) == 7
            assert "decompiled_method_hash" in dc["column_names"]
            assert "decompiled_method" in dc["column_names"]
            assert "analysis_date" in dc["column_names"]
            assert len(dc["data"]) == 1
            assert len(dc["data"][0]) == 7
        finally:
            os.unlink(apk_path)

    def test_decompiled_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dr = export["decompiled_refs"]
            assert dr["table"] == "code_apk_decompiled_methods_references"
            assert len(dr["column_names"]) == 10
            assert len(dr["column_type_names"]) == 10
            assert "sha256" in dr["column_names"]
            assert "sha1" not in dr["column_names"]
            assert "md5" not in dr["column_names"]
            assert "functions_caller" in dr["column_names"]
            assert "functions_call" in dr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sc = export["smali_content"]
            assert sc["table"] == "code_apk_smali_methods_content"
            assert len(sc["column_names"]) == 11
            assert len(sc["column_type_names"]) == 11
            assert "smali_instructions_count" in sc["column_names"]
            assert "smali_register_count" in sc["column_names"]
            assert "smali_flattened_score" in sc["column_names"]
            assert "smali_mba_score" in sc["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sr = export["smali_refs"]
            assert sr["table"] == "code_apk_smali_methods_references"
            assert len(sr["column_names"]) == 7
            assert len(sr["column_type_names"]) == 7
            assert "sha1" not in sr["column_names"]
            assert "md5" not in sr["column_names"]
            assert "ssdeep_smali" not in sr["column_names"]
            assert "tlsh_smali" not in sr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_similarity_metrics_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sm = export["method_similarity_metrics"]
            assert sm["table"] == "code_apk_method_similarity_metrics"
            assert len(sm["column_names"]) == 7
            assert "minhash" in sm["column_names"]
            assert "ssdeep_smali_normalized" in sm["column_names"]
            assert "tlsh_smali_normalized" in sm["column_names"]
            # cyclomatic_complexity moved to cfg table
            assert "cyclomatic_complexity" not in sm["column_names"]
            assert "block_count" not in sm["column_names"]
            assert "loop_count" not in sm["column_names"]
        finally:
            os.unlink(apk_path)

    def test_analysis_errors_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            ae = export["analysis_errors"]
            assert ae["table"] == "code_apk_analysis_errors"
            assert len(ae["column_names"]) == 9
            assert "error_hash" in ae["column_names"]
            assert "status" in ae["column_names"]
        finally:
            os.unlink(apk_path)

    def test_sha256_propagated_to_refs(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            # Check that sha256 from analysis_results appears in ref rows
            dr_row = export["decompiled_refs"]["data"][0]
            assert dr_row[0] == "a" * 64  # sha256
            # sha1 and md5 no longer included in refs
            assert "sha1" not in export["decompiled_refs"]["column_names"]
            assert "md5" not in export["decompiled_refs"]["column_names"]
        finally:
            os.unlink(apk_path)

    def test_empty_tables_not_included(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analysis_results = {
                "sha256": "a" * 64,
                "sha1": "b" * 40,
                "md5": "c" * 32,
                "decompiled_content": [],
                "decompiled_refs": [],
                "smali_content": [],
                "smali_refs": [],
                "similarity_metrics": [],
                "cfg": [],
                "strings": [],
                "analysis_errors": [],
            }
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export == {"multi_table": True}
        finally:
            os.unlink(apk_path)

    def test_non_clickhouse_exporter_returns_none(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            result = ext.prepare_export_data("ElasticsearchExporter")
            assert result is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Dataclass Tests
# ============================================================================

class TestAPKCodeAnalysisDataclasses:
    """Tests for the new APK code analysis dataclasses."""

    def test_decompiled_method_content(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
        )
        assert dc.decompiled_has_string_encryption is False
        assert dc.decompiled_has_reflection_calls is False
        assert dc.decompiled_excessive_goto_count is False

    def test_decompiled_method_content_populated(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
            decompiled_has_string_encryption=True,
            decompiled_has_reflection_calls=True,
            decompiled_excessive_goto_count=True,
        )
        assert dc.decompiled_has_string_encryption is True
        d = asdict(dc)
        assert d["decompiled_method_hash"] == "a" * 64

    def test_decompiled_method_reference(self):
        from redb.models.dataclasses import APKDecompiledMethodReference
        dr = APKDecompiledMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            decompiled_method_hash="d" * 64,
        )
        assert dr.functions_caller == []
        assert dr.functions_call == []
        assert dr.smali_method_hash is None

    def test_smali_method_content(self):
        from redb.models.dataclasses import APKSmaliMethodContent
        sc = APKSmaliMethodContent(
            smali_method_hash="e" * 64,
            smali_method="invoke-virtual {p0}, Lfoo;->bar()V",
            smali_method_type="USER",
            smali_instructions_count=5,
            smali_register_count=3,
        )
        assert sc.smali_instructions_count == 5
        assert sc.smali_register_count == 3

    def test_smali_method_reference(self):
        from redb.models.dataclasses import APKSmaliMethodReference
        sr = APKSmaliMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            smali_method_hash="e" * 64,
        )
        assert sr.decompiled_method_hash is None
        assert sr.ssdeep_smali is None
        assert sr.tlsh_smali is None

    def test_method_similarity_metrics(self):
        from redb.models.dataclasses import APKMethodSimilarityMetrics
        ms = APKMethodSimilarityMetrics(smali_method_hash="e" * 64)
        assert ms.cyclomatic_complexity is None
        assert ms.ssdeep_smali_normalized is None
        assert ms.tlsh_smali_normalized is None
        assert ms.minhash == []

    def test_code_analysis_error(self):
        from redb.models.dataclasses import APKCodeAnalysisError
        err = APKCodeAnalysisError(
            sha256="a" * 64,
            error_location="jadx",
            error_message="timeout",
        )
        assert err.class_name is None
        assert err.method_name is None
        assert err.error_type is None


# ============================================================================
# Tag Enum Tests
# ============================================================================

class TestAPKDecompiledTag:
    """Tests for the APK_DECOMPILED tag enum."""

    def test_tag_exists(self):
        from redb.extractors.enum import Tag
        assert hasattr(Tag, "APK_DECOMPILED")

    def test_tag_value(self):
        from redb.extractors.enum import Tag
        assert Tag.APK_DECOMPILED.value == "apk_decompiled"


# ============================================================================
# Worker Integration Tests
# ============================================================================

class TestAPKWorkerDecompileIntegration:
    """Tests that DecompileAPK is registered in workers.py."""

    def test_module_registered(self):
        """Verify DecompileAPK is discoverable via the extractor registry."""
        from redb.extractor_registry import get_extractor_class
        cls = get_extractor_class("DecompileAPK")
        assert cls is not None, "DecompileAPK not found in extractor registry"
        assert cls.__name__ == "DecompileAPK"

    def test_worker_apk_dispatch_includes_decompile(self):
        import inspect
        import redb.workers as workers
        source = inspect.getsource(workers.process_binary_file)
        assert "DecompileAPK" in source