Wanli Ni

172 papers B 14Misc 5Journal 122Unranked 31
YearRankTypeTitle / Venue / Authors
2026 J jnl
Sci. China Inf. Sci.
Sha Li, Lei Sun, Jianquan Wang, Wanli Ni, Hui Tian, Yuntian Brian Bai, Haijun Zhang
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Huiqing Ao, Hui Tian, Wanli Ni, Dusit Niyato
2026 J jnl
IEEE Trans. Wirel. Commun.
Huiqing Ao, Hui Tian, Wanli Ni, Ji Zhang, Dusit Niyato
2026 J jnl
IEEE Trans. Wirel. Commun.
Tong Zhang, Qianren Li, Shuai Wang, Wanli Ni, Jiliang Zhang, Rui Wang, Kai-Kit Wong, Chan-Byoung Chae
2026 J jnl
IEEE Internet Things Mag.
Wanli Ni, Hui Tian
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Haofeng Sun, Hui Tian, Jingheng Zheng, Wanli Ni, Qimei Cui, Dusit Niyato, Ping Zhang
2026 J jnl
IEEE Trans. Veh. Technol.
Wenjun Xu, Hao Wei, Fengyu Wang, Wanli Ni, Ping Zhang
2026 J jnl
IEEE Trans. Wirel. Commun.
Hao Wei, Wen Wang, Wanli Ni, Wenjun Xu, Yongming Huang, Dusit Niyato, Ping Zhang
2026 J jnl
IEEE Wirel. Commun. Lett.
Junhe Zhang, Wanli Ni, Pengwei Wang, Dongyu Wang
2026 J jnl
IEEE Wirel. Commun. Lett.
Hao Wei, Wanli Ni, Wen Wang, Wenjun Xu, Dusit Niyato, Ping Zhang
2026 J jnl
IEEE Trans. Wirel. Commun.
Wen Wang, Yongming Huang, Wanli Ni, Cheng Zhang, Dongming Wang
2025 J jnl
IEEE Internet Things J.
Haofeng Sun, Wanli Ni, Hui Tian, Jingheng Zheng, Gaofeng Nie, Dusit Niyato
2025 J jnl
CoRR
Mengru Wu, Yuan Gao, Weidang Lu, Huimei Han, Lei Sun, Wanli Ni
2025 J jnl
IEEE Signal Process. Lett.
Zaihao Pan, Wen Wang, Gaofeng Nie, Ailing Zheng, Wanli Ni
2025 J jnl
IEEE Trans. Veh. Technol.
Yongning Ke, Wenjun Xu, Wanli Ni, Xin Yuan, Dusit Niyato
2025 B conf
PIMRC
Yifeng Yang, Wen Wang, Cheng Zhang, Wanli Ni, Yongming Huang
2025 J jnl
IEEE Trans. Veh. Technol.
Mengying Sun, Wanli Ni, Xiaodong Xu, Xiaofeng Tao, Ping Zhang
2025 J jnl
IEEE Trans. Commun.
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian, Chau Yuen
2025 J jnl
CoRR
Wanli Ni, Haofeng Sun, Huiqing Ao, Hui Tian
2025 J jnl
IEEE Internet Things Mag.
Wanli Ni, Haofeng Sun, Huiqing Ao, Hui Tian
2025 J jnl
IEEE Trans. Wirel. Commun.
Haofeng Sun, Hui Tian, Wanli Ni, Jingheng Zheng, Dusit Niyato, Ping Zhang
2025 J jnl
IEEE Trans. Veh. Technol.
Junhe Zhang, Wanli Ni, Dongyu Wang
2025 J jnl
IEEE Trans. Consumer Electron.
Huiqing Ao, Hui Tian, Wanli Ni
2025 J jnl
CoRR
Wanli Ni, Hui Tian, Shuai Wang, Chengyang Li, Lei Sun, Zhaohui Yang
2025 J jnl
IEEE Netw.
Wanli Ni, Ailing Zheng, Wen Wang, Dusit Niyato, Naofal Al-Dhahir, Mérouane Debbah
2025 J jnl
CoRR
Tong Zhang, Qianren Li, Shuai Wang, Wanli Ni, Jiliang Zhang, Rui Wang, Kai-Kit Wong, Chan-Byoung Chae
2025 Misc conf
ICASSP
Xinran Zhang, Hui Tian, Wanli Ni
2025 J jnl
IEEE Internet Things J.
Xinran Zhang, Hui Tian, Wanli Ni, Zhaohui Yang
2025 J jnl
IEEE Trans. Veh. Technol.
Zaihao Pan, Wanli Ni, Wen Wang, Ailing Zheng, Gaofeng Nie
2025 J jnl
CoRR
Wanzhe Wang, Jianqiu Peng, Menghao Hu, Weihuang Zhong, Tong Zhang, Shuai Wang, Yixin Zhang, Mingjie Shao, Wanli Ni
2025 B conf
GLOBECOM
Qiyu Ma, Wanli Ni, Zhijin Qin
2025 J jnl
CoRR
Qiyu Ma, Wanli Ni, Zhijin Qin
2025 J jnl
CoRR
Hongye Quan, Wanli Ni, Tong Zhang, Xiangyu Ye, Ziyi Xie, Shuai Wang, Yuanwei Liu, Hui Song
2025 J jnl
IEEE Netw. Lett.
Hongye Quan, Wanli Ni, Tong Zhang, Xiangyu Ye, Ziyi Xie, Shuai Wang, Yuanwei Liu, Hui Song
2025 J jnl
IEEE Trans. Veh. Technol.
Hao Wei, Wen Wang, Wanli Ni, Cheng Zhang, Yongming Huang
2025 J jnl
IEEE Trans. Wirel. Commun.
Dongsheng Han, Peng Wang, Wanli Ni, Wen Wang, Ailing Zheng, Dusit Niyato, Naofal Al-Dhahir
2025 J jnl
IEEE Trans. Commun.
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian, Yonina C. Eldar, Chau Yuen
2025 conf
INFOCOM WKSHPS
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian, Yonina C. Eldar, Chau Yuen
2025 J jnl
CoRR
Wanli Ni, Zhijin Qin, Haofeng Sun, Xiaoming Tao, Zhu Han
2025 J jnl
IEEE Commun. Stand. Mag.
Wanli Ni, Zhijin Qin, Yulong Feng, Haofeng Sun, Yue Liu, Xiaoming Tao, Zhu Han
2025 J jnl
IEEE Trans. Veh. Technol.
Xinran Zhang, Hui Tian, Wanli Ni, Zhaohui Yang
2025 J jnl
IEEE Trans. Veh. Technol.
Bowen Zhao, Qimei Cui, Wanli Ni, Peng Wang, Yanzhao Hou, Xiaofeng Tao
2025 J jnl
IEEE Internet Things Mag.
Wanli Ni, Ruyu Luo, Xinran Zhang, Peng Wang, Wen Wang, Hui Tian
2025 J jnl
IEEE Trans. Commun.
Yuchen Zhang, Wanli Ni, Jianquan Wang, Wanbin Tang, Min Jia, Yonina C. Eldar, Dusit Niyato
2025 J jnl
IEEE Trans. Wirel. Commun.
Yingjie Pei, Wanli Ni, Jin Xu, Xinwei Yue, Xiaofeng Tao, Dusit Niyato
2025 J jnl
IEEE Trans. Wirel. Commun.
Huiqing Ao, Hui Tian, Wanli Ni, Gaofeng Nie, Dusit Niyato
2025 B conf
MASS
Yixuan Yang, Yutong Pan, Junhe Zhang, Wanli Ni
2025 J jnl
CoRR
Hao Wei, Wanli Ni, Wen Wang, Wenjun Xu, Dusit Niyato, Ping Zhang
2025 J jnl
CoRR
Junhe Zhang, Wanli Ni, Peng Wang, Dongyu Wang
2025 J jnl
IEEE Wirel. Commun.
Wanli Ni, Wen Wang, Ailing Zheng, Peng Wang, Changsheng You, Yonina C. Eldar, Dusit Niyato, Robert Schober
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Yifan Miao, Hui Tian, Hao Wu, Wanli Ni, Yang Tian
2024 J jnl
IEEE Trans. Green Commun. Netw.
Jianyang Ren, Wanli Ni, Hui Tian, Gaofeng Nie
2024 J jnl
IEEE Commun. Lett.
Shaoshuai Fan, Shilin Tao, Wanli Ni, Hui Tian
2024 conf
ICASSP Workshops
Wanli Ni, Jiachen Han, Zhijin Qin
2024 J jnl
IEEE Trans. Wirel. Commun.
Ruyu Luo, Hui Tian, Wanli Ni, Julian Cheng, Kwang-Cheng Chen
2024 J jnl
IEEE Trans. Green Commun. Netw.
Xinran Zhang, Hui Tian, Wanli Ni, Zhaohui Yang, Mengying Sun
2024 Misc conf
ICASSP
Mengying Sun, Wanli Ni, Xiaodong Xu, Xiaofeng Tao
2024 conf
ICC
Xinran Zhang, Hui Tian, Wanli Ni, Zhaohui Yang
2024 J jnl
IEEE Wirel. Commun. Lett.
Weiqiang Tong, Wenjun Xu, Fengyu Wang, Wanli Ni, Jinglin Zhang
2024 J jnl
CoRR
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian, Chau Yuen
2024 J jnl
IEEE Internet Things J.
Chuanhong Liu, Caili Guo, Yang Yang, Wanli Ni, Yanquan Zhou, Lei Li, Tony Q. S. Quek
2024 J jnl
IEEE Trans. Veh. Technol.
Yuchen Zhang, Boyu Ning, Wanli Ni, Jianquan Wang, Wanbin Tang, Dusit Niyato
2024 J jnl
IEEE Trans. Wirel. Commun.
Kang An, Yifu Sun, Zhi Lin, Yonggang Zhu, Wanli Ni, Naofal Al-Dhahir, Kai-Kit Wong, Dusit Niyato
2024 J jnl
IEEE Internet Things J.
Wanli Ni, Huiqing Ao, Hui Tian, Yonina C. Eldar, Dusit Niyato
2024 J jnl
CoRR
Yining Wang, Wanli Ni, Wenqiang Yi, Xiaodong Xu, Ping Zhang, Arumugam Nallanathan
2024 J jnl
IEEE Commun. Lett.
Yining Wang, Wanli Ni, Wenqiang Yi, Xiaodong Xu, Ping Zhang, Arumugam Nallanathan
2024 conf
INFOCOM (Workshops)
Haofeng Sun, Hui Tian, Wanli Ni, Jingheng Zheng
2024 conf
ICC Workshops
Huiqing Ao, Hui Tian, Wanli Ni
2024 J jnl
CoRR
Junhe Zhang, Wanli Ni, Dongyu Wang
2024 J jnl
CoRR
Wanli Ni, Ailing Zheng, Wen Wang, Dusit Niyato, Naofal Al-Dhahir, Mérouane Debbah
2024 J jnl
IEEE Trans. Consumer Electron.
Pengcheng Guo, Miao Yu, Wanli Ni, Kang An, Miaomiao Gu
2024 J jnl
IEEE Wirel. Commun. Lett.
Haofeng Sun, Hui Tian, Jingheng Zheng, Wanli Ni
2024 J jnl
IEEE Trans. Veh. Technol.
Hao Wei, Wen Wang, Wanli Ni, Dusit Niyato
2024 J jnl
IEEE Trans. Veh. Technol.
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian, Yonina C. Eldar, Dusit Niyato
2024 J jnl
IEEE Trans. Wirel. Commun.
Wen Wang, Wanli Ni, Hui Tian, Yonina C. Eldar, Rui Zhang
2024 J jnl
CoRR
Peng Wang, Dongsheng Han, Yashuai Cao, Wanli Ni, Dusit Niyato
2024 J jnl
IEEE Trans. Wirel. Commun.
Peng Wang, Dongsheng Han, Yashuai Cao, Wanli Ni, Dusit Niyato
2024 J jnl
IEEE Internet Things J.
Chunwei Meng, Zhiqing Wei, Dingyou Ma, Wanli Ni, Liyan Su, Zhiyong Feng
2024 J jnl
IEEE Trans. Commun.
Boyang Hu, Hui Tian, Wei Ni, Shaoshuai Fan, Wanli Ni, Ekram Hossain
2024 J jnl
IEEE Trans. Commun.
Chuanhong Liu, Caili Guo, Yang Yang, Wanli Ni, Tony Q. S. Quek
2024 Misc conf
ICASSP
Haofeng Sun, Hui Tian, Wanli Ni, Jingheng Zheng
2024 J jnl
IEEE Signal Process. Lett.
Yifan Miao, Wanli Ni, Hui Tian
2024 conf
ICASSP Workshops
Peng Wang, Yashuai Cao, Wanli Ni, Dongsheng Han
2024 J jnl
IEEE Wirel. Commun. Lett.
Yuchen Zhang, Wanli Ni, Yijie Mao, Boyu Ning, Sa Xiao, Wanbin Tang, Dusit Niyato
2024 J jnl
CoRR
Wanli Ni, Ruyu Luo, Xinran Zhang, Peng Wang, Wen Wang, Hui Tian
2024 conf
GLOBECOM (Workshops)
Haofeng Sun, Hui Tian, Jingheng Zheng, Wanli Ni
2024 J jnl
IEEE Trans. Wirel. Commun.
Jingheng Zheng, Hui Tian, Wanli Ni, Gaofeng Nie, Wenchao Jiang, Tony Q. S. Quek
2024 J jnl
CoRR
Yingjie Pei, Wanli Ni, Jin Xu, Xinwei Yue, Xiaofeng Tao, Dusit Niyato
2024 J jnl
IEEE Commun. Lett.
Hao Wei, Wanli Ni, Wenjun Xu, Wenchao Jiang, Dusit Niyato, Ping Zhang
2024 J jnl
IEEE Internet Things J.
Jiachen Han, Wanli Ni, Li Li
2024 J jnl
CoRR
Wanli Ni, Zhaohui Yang
2024 J jnl
IEEE Trans. Veh. Technol.
Xin Lin, Aijun Liu, Wanli Ni, Kang An, Chen Han, Zhixiang Gao, Symeon Chatzinotas
2024 J jnl
CoRR
Wanli Ni, Wen Wang, Ailing Zheng, Peng Wang, Changsheng You, Yonina C. Eldar, Dusit Niyato, Robert Schober
2023 B conf
GLOBECOM
Jingheng Zheng, Wanli Ni, Hui Tian, Wenchao Jiang, Tony Q. S. Quek
2023 J jnl
CoRR
Jianyang Ren, Wanli Ni, Hui Tian, Gaofeng Nie
2023 conf
ICC Workshops
Yuxin Wang, Jingheng Zheng, Wanli Ni, Hui Tian
2023 J jnl
CoRR
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian
2023 J jnl
IEEE Commun. Lett.
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian
2023 J jnl
IEEE Commun. Lett.
Hao Wei, Wanli Ni, Wenjun Xu, Fengyu Wang, Dusit Niyato, Ping Zhang
2023 J jnl
IEEE Commun. Lett.
Yingjie Yan, Ying Wang, Wanli Ni, Dusit Niyato
2023 J jnl
IEEE Trans. Commun.
Ruyu Luo, Wanli Ni, Hui Tian, Julian Cheng, Kwang-Cheng Chen
2023 conf
SPAWC
Wen Wang, Wanli Ni, Hui Tian, Zhaohui Yang, Changsheng You, Dusit Niyato
2023 J jnl
IEEE Internet Things J.
Wen Wang, Wanli Ni, Hui Tian
2023 Misc conf
ICASSP
Wen Wang, Wanli Ni, Hui Tian, Yonina C. Eldar
2023 J jnl
CoRR
Wen Wang, Wanli Ni, Hui Tian, Yonina C. Eldar, Rui Zhang
2023 J jnl
IEEE Wirel. Commun. Lett.
Ailing Zheng, Wanli Ni, Wen Wang, Hui Tian
2023 J jnl
CoRR
Wen Wang, Wanli Ni, Hui Tian, Naofal Al-Dhahir
2023 J jnl
IEEE Trans. Commun.
Wen Wang, Wanli Ni, Hui Tian, Naofal Al-Dhahir
2023 conf
ICC
Yingjie Yan, Ying Wang, Junwei Zhao, Wanli Ni
2023 conf
ICC Workshops
Yuchen Zhang, Yichi Zhang, Jianquan Wang, Sa Xiao, Wanli Ni, Wanbin Tang
2023 conf
GLOBECOM (Workshops)
Yichi Zhang, Yuchen Zhang, Jianquan Wang, Wanli Ni, Sa Xiao, Wanbin Tang
2023 J jnl
CoRR
Yuchen Zhang, Wanli Ni, Jianquan Wang, Wanbin Tang, Min Jia, Yonina C. Eldar, Dusit Niyato
2023 B conf
GLOBECOM
Yuchen Zhang, Wanli Ni, Wanbin Tang, Yonina C. Eldar, Dusit Niyato
2023 J jnl
CoRR
Wanli Ni, Jingheng Zheng, Hui Tian
2023 J jnl
IEEE Internet Things J.
Wanli Ni, Jingheng Zheng, Hui Tian
2023 Misc conf
ICASSP
Wanli Ni, Jingheng Zheng, Yonina C. Eldar, Changsheng You, Kaibin Huang
2023 J jnl
CoRR
Jingheng Zheng, Wanli Ni, Hui Tian, Deniz Gündüz, Tony Q. S. Quek, Zhu Han
2023 J jnl
IEEE Trans. Wirel. Commun.
Jingheng Zheng, Wanli Ni, Hui Tian, Deniz Gündüz, Tony Q. S. Quek, Zhu Han
2023 J jnl
IEEE Wirel. Commun. Lett.
Wen Wang, Wanli Ni, Hui Tian, Yonina C. Eldar, Dusit Niyato
2022 J jnl
IEEE Trans. Wirel. Commun.
Jingheng Zheng, Hui Tian, Wanli Ni, Wei Ni, Ping Zhang
2022 J jnl
CoRR
Jingheng Zheng, Hui Tian, Wanli Ni, Wei Ni, Ping Zhang
2022 conf
INFOCOM Workshops
Wanli Ni, Xufeng Liu, Hui Tian
2022 conf
VTC Fall
Xinran Zhang, Hui Tian, Wanli Ni, Mengying Sun
2022 conf
GLOBECOM (Workshops)
Weilai Li, Wanli Ni, Ruyu Luo, Hui Tian, Zhaohui Yang, Chongwen Huang
2022 B conf
WCNC
Yuxing Ruan, Gaofeng Nie, Wanli Ni, Hui Tian, Jianyang Ren
2022 J jnl
CoRR
Ruyu Luo, Wanli Ni, Hui Tian, Julian Cheng
2022 J jnl
IEEE Trans. Veh. Technol.
Ruyu Luo, Wanli Ni, Hui Tian, Julian Cheng
2022 J jnl
IEEE Internet Things J.
Wanli Ni, Yuanwei Liu, Zhaohui Yang, Hui Tian, Xuemin Shen
2022 J jnl
IEEE Trans. Wirel. Commun.
Wanli Ni, Yuanwei Liu, Zhaohui Yang, Hui Tian, Xuemin Shen
2022 J jnl
IEEE Trans. Veh. Technol.
Wen Wang, Wanli Ni, Hui Tian, Lingyang Song
2022 B conf
GLOBECOM
Wen Wang, Wanli Ni, Hui Tian, Naofal Al-Dhahir
2022 J jnl
IEEE Internet Things J.
Meihui Hua, Hui Tian, Xinchen Lyu, Wanli Ni, Gaofeng Nie
2022 conf
ICC Workshops
Wen Wang, Wanli Ni, Hui Tian, Zhaohui Yang, Chongwen Huang, Kai-Kit Wong
2022 J jnl
IEEE Internet Things J.
Wanli Ni, Yuanwei Liu, Yonina C. Eldar, Zhaohui Yang, Hui Tian
2022 J jnl
IEEE J. Sel. Top. Signal Process.
Wen Wang, Wanli Ni, Hui Tian, Zhaohui Yang, Chongwen Huang, Kai-Kit Wong
2022 J jnl
CoRR
Wen Wang, Wanli Ni, Hui Tian, Zhaohui Yang, Chongwen Huang, Kai-Kit Wong
2022 conf
INFOCOM Workshops
Jingheng Zheng, Wanli Ni, Hui Tian, Deniz Gündüz, Tony Q. S. Quek
2022 conf
ICC
Wanli Ni, Yuanwei Liu, Hui Tian, Yonina C. Eldar, Kaibin Huang
2022 conf
GLOBECOM (Workshops)
Xufeng Liu, Wanli Ni, Hui Tian, Yuan Wu
2022 J jnl
IEEE Commun. Lett.
Jianyang Ren, Wanli Ni, Hui Tian
2022 J jnl
CoRR
Jianyang Ren, Wanli Ni, Hui Tian
2022 conf
INFOCOM Workshops
Ruyu Luo, Wanli Ni, Hui Tian
2021 B conf
PIMRC
Ruyu Luo, Hui Tian, Wanli Ni
2021 conf
WCNC Workshops
Weilai Li, Wanli Ni, Hui Tian, Meihui Hua
2021 J jnl
CoRR
Weilai Li, Wanli Ni, Hui Tian, Meihui Hua
2021 B conf
GLOBECOM
Wanli Ni, Yuanwei Liu, Yonina C. Eldar, Zhaohui Yang, Hui Tian
2021 conf
ICCC Workshops
Meihui Hua, Wanli Ni, Hui Tian, Gaofeng Nie
2021 J jnl
CoRR
Wanli Ni, Yuanwei Liu, Zhaohui Yang, Hui Tian, Xuemin Shen
2021 conf
ICC Workshops
Jianyang Ren, Junshuai Sun, Hui Tian, Wanli Ni, Gaofeng Nie, Yingying Wang
2021 conf
HPCC/DSS/SmartCity/DependSys
Xinran Zhang, Gaofeng Nie, Wanli Ni, Hui Tian
2021 J jnl
CoRR
Meihui Hua, Hui Tian, Xinchen Lyu, Wanli Ni, Gaofeng Nie
2021 conf
ICC Workshops
Meihui Hua, Hui Tian, Wanli Ni
2021 conf
INFOCOM Workshops
Wanli Ni, Yuanwei Liu, Zhaohui Yang, Hui Tian
2021 B conf
PIMRC
Jingheng Zheng, Wanli Ni, Hui Tian, Yingying Wang
2021 J jnl
CoRR
Jingheng Zheng, Wanli Ni, Hui Tian
2021 conf
ICCC Workshops
Yuwei Li, Wanli Ni, Hui Tian, Meihui Hua, Shaoshuai Fan
2021 B conf
PIMRC
Wen Wang, Hui Tian, Wanli Ni, Meihui Hua
2021 J jnl
IEEE Trans. Wirel. Commun.
Wanli Ni, Xiao Liu, Yuanwei Liu, Hui Tian, Yue Chen
2021 J jnl
CoRR
Wanli Ni, Yuanwei Liu, Yonina C. Eldar, Zhaohui Yang, Hui Tian
2021 J jnl
IEEE Wirel. Commun. Lett.
Wen Wang, Hui Tian, Wanli Ni
2021 conf
GLOBECOM (Workshops)
Wen Wang, Wanli Ni, Hui Tian
2020 J jnl
CoRR
Yuwei Li, Wanli Ni, Hui Tian, Meihui Hua, Shaoshuai Fan
2020 J jnl
CoRR
Wanli Ni, Yuanwei Liu, Zhaohui Yang, Hui Tian, Xuemin Shen
2020 conf
GLOBECOM (Workshops)
Wanli Ni, Xiao Liu, Yuanwei Liu, Hui Tian, Yue Chen
2020 J jnl
CoRR
Wanli Ni, Xiao Liu, Yuanwei Liu, Hui Tian, Yue Chen
2020 J jnl
CoRR
Wen Wang, Hui Tian, Wanli Ni, Meihui Hua
2020 conf
GLOBECOM (Workshops)
Wanli Ni, Yuanwei Liu, Hui Tian
2020 conf
WCSP
Guoliang Hao, Wanli Ni, Hui Tian, Leilei Cao
2020 B conf
PIMRC
Wanli Ni, Hui Tian, Shaoshuai Fan, Gaofeng Nie
2020 J jnl
CoRR
Wanli Ni, Xiao Liu, Yuanwei Liu, Hui Tian, Yue Chen
2019 B conf
PIMRC
Meihui Hua, Hui Tian, Wanli Ni, Shaoshuai Fan
2019 B conf
WCNC
Wanli Ni, Hui Tian, Shaoshuai Fan, Baoling Liu
tests/unit/test_decompile_decompiler.py
← Index tests/unit/test_decompile_decompiler.py python
"""Unit tests (mocked BN) for bninja/decompiler.py — BinaryNinjaDecompiler."""
import sys
import json
import time
import pytest
from unittest.mock import MagicMock, patch, mock_open

from tests.unit.conftest_binja_stubs import (
    install_binja_stubs,
    MockFunction,
    MockBasicBlock,
    MockDisassemblyLine,
    MockToken,
    MockSymbol,
    MockBinaryView,
    MockEdge,
    SymbolType,
    InstructionTextTokenType,
    BranchType,
)

install_binja_stubs()

from redb.extractors.decompiler.bninja.decompiler import (
    BinaryNinjaDecompiler,
    is_lib_or_thunk,
)
from redb.extractors.decompiler.bninja.function_type import FunctionType


# ============================================================================
# 10a. BinaryNinjaDecompiler
# ============================================================================


class TestBinaryNinjaDecompilerLogError:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.bv = None
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            return d

    def test_log_error_appends(self):
        d = self._make_decompiler()
        d.log_error("test error", "func1", 0x1000, Exception("boom"), "extract")
        assert len(d.errors) == 1

    def test_log_error_schema(self):
        d = self._make_decompiler()
        d.log_error("test error", "func1", 0x1000, Exception("boom"), "extract")
        error = d.errors[0]
        expected_keys = [
            "function_name",
            "function_address",
            "error_location",
            "error_message",
            "error_details",
            "error_type",
            "timestamp",
        ]
        for key in expected_keys:
            assert key in error, f"Missing key: {key}"


class TestBinaryNinjaDecompilerIsTooFewBlocks:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.MIN_FUNCTION_SIZE = 10
            return d

    def test_is_too_few_blocks_none(self):
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = None
        assert d.is_too_few_blocks(func) is False

    def test_is_too_few_blocks_empty(self):
        # Empty basic_blocks now returns True because Binja creates function
        # stubs with empty blocks before analysis completes — we no longer
        # skip these so they get filtered downstream instead.
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = []
        assert d.is_too_few_blocks(func) is True

    def test_is_too_few_blocks_small_single(self):
        d = self._make_decompiler()
        block = MagicMock()
        block.disassembly_text = [MagicMock() for _ in range(5)]  # < 10
        func = MagicMock()
        func.basic_blocks = [block]
        assert d.is_too_few_blocks(func) is False

    def test_is_too_few_blocks_large_single(self):
        d = self._make_decompiler()
        block = MagicMock()
        block.disassembly_text = [MagicMock() for _ in range(15)]  # >= 10
        func = MagicMock()
        func.basic_blocks = [block]
        assert d.is_too_few_blocks(func) is True

    def test_is_too_few_blocks_multiple(self):
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = [MagicMock(), MagicMock()]
        assert d.is_too_few_blocks(func) is True


class TestIsLibOrThunk:
    def test_is_lib_or_thunk_user(self):
        func = MagicMock()
        func.symbol.type = SymbolType.FunctionSymbol
        func.is_thunk = False
        assert is_lib_or_thunk(func) is True  # NOT filtered

    def test_is_lib_or_thunk_thunk(self):
        func = MagicMock()
        func.symbol.type = SymbolType.FunctionSymbol
        func.is_thunk = True
        assert is_lib_or_thunk(func) is False  # Filtered out

    def test_is_lib_or_thunk_external(self):
        func = MagicMock()
        func.symbol.type = SymbolType.ImportedFunctionSymbol
        func.is_thunk = False
        assert is_lib_or_thunk(func) is False  # Filtered out


class TestBinaryNinjaDecompilerExtract:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.bv = MagicMock()
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            d.arch = MagicMock()
            return d

    def test_extract_success(self):
        d = self._make_decompiler()
        mock_results = {
            "decompiled": [{"test": True}],
            "disassembled": [],
            "cfg": [],
            "llil": [],
            "errors": [],
            "strings": [],
            "mlil": [],
        }
        with patch.object(d, "analyze_binary", return_value=mock_results):
            result = d.extract()
            assert result is True
            assert d.analysis_results == mock_results

    def test_extract_failure(self):
        d = self._make_decompiler()
        with patch.object(d, "analyze_binary", return_value=None):
            result = d.extract()
            assert result is False

    def test_tag(self):
        d = self._make_decompiler()
        assert d.tag() == "DECOMPILED"


class TestBinaryNinjaDecompilerAnalyzeBinary:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            d.arch = MagicMock()
            d.MIN_FUNCTION_SIZE = 10
            return d

    def test_analyze_binary_links_hlil_disasm(self):
        """Bi-directional hash linkage between decompiled and disassembled."""
        d = self._make_decompiler()
        d.bv = MagicMock()
        d.bv.functions = []
        # Mock methods to return controlled data
        with patch.object(d, "extract_hlil") as mock_hlil, \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg", return_value=None), \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_hlil.return_value = {
                "decompiled_function_hash": "HLIL_HASH",
                "decompiled_function_name": "test",
                "decompiled_function": "code",
            }
            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }

            # Manually feed one function
            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["decompiled"]:
                hlil_r = results["decompiled"][0]
                disasm_r = results["disassembled"][0]
                assert hlil_r["disassembled_function_hash"] == "DISASM_HASH"
                assert disasm_r["decompiled_function_hash"] == "HLIL_HASH"

    def test_analyze_binary_links_llil_disasm(self):
        """Bi-directional linkage between LLIL and disassembly."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg", return_value=None), \
             patch.object(d, "extract_lowlevel") as mock_llil:

            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_llil.return_value = {
                "sha256_llil": "LLIL_HASH",
                "tlsh_llil": "tlsh_val",
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["llil"]:
                llil_r = results["llil"][0]
                assert llil_r["disassembled_function_hash"] == "DISASM_HASH"

    def test_analyze_binary_links_cfg_disasm(self):
        """CFG gets disassembled_function_hash."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg") as mock_cfg, \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_cfg.return_value = {
                "function_address": 0x1000,
                "cyclomatic_complexity": 3,
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["cfg"]:
                cfg_r = results["cfg"][0]
                assert cfg_r["disassembled_function_hash"] == "DISASM_HASH"

    def test_analyze_binary_sets_cyclomatic(self):
        """cyclomatic_complexity set on disasm from CFG."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg") as mock_cfg, \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_disasm.return_value = {
                "disassembled_function_hash": "HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_cfg.return_value = {
                "function_address": 0x1000,
                "cyclomatic_complexity": 7,
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["disassembled"]:
                disasm_r = results["disassembled"][0]
                assert disasm_r.get("cyclomatic_complexity") == 7


class TestApplyGoReSym:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.bv = MagicMock()
            return d

    def test_apply_goresym_user_functions(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        data = {
            "UserFunctions": [{"Start": 0x1000, "FullName": "main.main"}],
        }
        with patch("builtins.open", mock_open(read_data=json.dumps(data))):
            d._BinaryNinjaDecompiler__apply_goresym()
            d.bv.define_user_symbol.assert_called()

    def test_apply_goresym_std_functions(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        data = {
            "StdFunctions": [{"Start": 0x2000, "FullName": "runtime.main"}],
        }
        with patch("builtins.open", mock_open(read_data=json.dumps(data))):
            d._BinaryNinjaDecompiler__apply_goresym()
            d.bv.define_user_symbol.assert_called()

    def test_apply_goresym_invalid_json(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        with patch("builtins.open", mock_open(read_data="not json {")):
            d._BinaryNinjaDecompiler__apply_goresym()
            # Should log error but not crash
            d.log.log_error if hasattr(d.log, 'log_error') else None
            # Just verify no exception raised