# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# /*================Fixed Disabled Windows CUDA10.x MKL(PR-CI-Windows) unittests===========================*/
# TODO: fix these unittest that is bound to fail
disable_wingpu_test="^test_model$|\
^test_dataloader_early_reset_deprecated$|\
^test_add_reader_dependency_deprecated$|\
^test_add_reader_dependency_for_interpretercore$|\
^test_decoupled_py_reader_deprecated$|\
^test_decoupled_py_reader_deprecated_static_build$|\
^test_generator_dataloader_deprecated$|\
^test_parallel_dygraph_sync_batch_norm$|\
^test_py_reader_using_executor$|\
^test_decoupled_py_reader_data_check_deprecated$|\
^test_fleet_base_single$|\
^test_multiprocess_dataloader_iterable_dataset_dynamic$|\
^test_py_reader_combination$|\
^test_py_reader_pin_memory$|\
^test_py_reader_push_pop$|\
^test_reader_reset_deprecated$|\
^test_imperative_se_resnext$|\
^test_dataloader_keep_order_deprecated$|\
^test_dataloader_unkeep_order_deprecated$|\
^test_multiprocess_dataloader_iterable_dataset_static$|\
^test_fuse_bn_act_pass_deprecated$|\
^test_fuse_bn_act_pass_deprecated_static_build$|\
^test_fuse_bn_add_act_pass$|\
^test_gather_op$|\
^test_activation_op$|\
^test_activation_op_zero_size$|\
^test_norm_nn_grad$|\
^test_bilinear_interp_op$|\
^disable_wingpu_test$"

# /*================Fixed Disabled Windows CUDA12.0 MKL(PR-CI-Windows) unittests===========================*/
# TODO: fix these unittest that is bound to fail
disable_wingpu_cuda12_test="^test_cholesky_op$|\
^test_cholesky_solve_op$|\
^test_eigh_op$|\
^test_eigvalsh_op$|\
^test_lu_op$|\
^test_math_op_patch_var_base$|\
^test_cudnn_bn_add_relu$|\
^test_linalg_pinv_op$|\
^test_pca_lowrank$|\
^test_qr_op$|\
^test_sparse_matmul_op$|\
^test_svd_op$|\
^test_mul_op$|\
^test_bmn$|\
^test_memory_efficient_attention$|\
^test_tril_triu_op$|\
^test_elementwise_add_onednn_op$|\
^test_comp_high_grad$|\
^test_multi_precision_fp16_train$|\
^test_imperative_skip_op$|\
^test_qat$|\
^test_standalone_cuda_graph_multi_stream_deprecated$|\
^test_standalone_cuda_graph_multi_stream_deprecated_static_build$|\
^test_save_load$|\
^test_conv_transpose_nn_grad$|\
^test_dygraph_spectral_norm$|\
^test_lambv2_op$|\
^test_retain_graph$|\
^test_switch_autotune$|\
^test_elementwise_div_op$|\
^test_elementwise_mul_op$|\
^test_conv2d_api_deprecated$|\
^test_fused_gemm_epilogue_pass$|\
^test_cuda_graphed_layer$|\
^test_quant_linear_op$|\
^test_sot_resnet$|\
^test_sot_resnet50_backward$|\
^test_amp_api$|\
^test_asp_optimize_dynamic$|\
^test_asp_optimize_static$|\
^test_asp_save_load$|\
^test_fuse_resnet_unit$|\
^test_conv2d_transpose_op$|\
^test_dygraph_multi_forward$|\
^test_instance_norm_op_v2$|\
^test_rnn_op$|\
^test_prim_amp$|\
^test_cumprod_op$|\
^test_elementwise_sub_op$|\
^test_amp_decorate$|\
^test_amp_promote$|\
^test_cudnn_norm_conv$|\
^test_basic_api_transformation$|\
^test_conv2d_transpose_op_depthwise_conv$|\
^test_conv3d_transpose_part2_op$|\
^test_dygraph_mnist_fp16$|\
^test_sparse_conv_op$|\
^test_sparse_conv_op_static_build$|\
^test_conv2d_transpose_onednn_op$|\
^test_ptq$|\
^test_stub$|\
^test_lu_unpack_op$|\
^test_softmax_with_cross_entropy_op$|\
^test_fused_gemm_epilogue_op$|\
^test_fused_gemm_epilogue_grad_op$|\
^test_fused_gemm_epilogue_op_with_es$|\
^test_fused_gemm_epilogue_grad_op_with_es$|\
^test_matmul_op_static_build$|\
^test_matmul_v2_op_static_build$|\
^test_image_classification$|\
^test_apply_pass_to_program_deprecated$|\
^test_mobile_net$|\
^test_IntermediateLayerGetter$|\
^test_pad3d_op$|\
^paddle_infer_api_test$|\
^device_context_test_cuda_graph$|\
^test_fused_linear_param_grad_add$|\
^test_fused_matmul_bias$|\
^test_tensordot$|\
^test_cuda_graph$|\
^test_cuda_graph_partial_graph_static_run$|\
^test_cuda_graph_static_mode$|\
^test_matrix_rank_op$|\
^test_sparse_pca_lowrank$|\
^test_zero_dim_no_backward_api$|\
^test_zero_dim_sundry_dygraph_api$|\
^test_zero_dim_sundry_static_api_part1$|\
^test_zero_dim_sundry_static_api_part2$|\
^test_zero_dim_sundry_static_api_part3$|\
^test_zero_dim_sundry_static_api_part4$|\
^paddle_infer_api_copy_tensor_tester$|\
^cudnn_helper_test$|\
^test_analyzer_small_dam$|\
^test_analyzer_transformer_deprecated$|\
^test_analyzer_int8_mobilenetv3_large$|\
^test_analyzer_bfloat16_mobilenetv3_large$|\
^test_api_impl$|\
^test_onednn_conv_affine_channel_fuse_pass$|\
^test_onednn_conv_gelu_fuse_pass$|\
^test_onednn_conv_hard_sigmoid_fuse_pass$|\
^test_onednn_conv_hard_swish_fuse_pass$|\
^test_onednn_conv_mish_fuse_pass$|\
^test_onednn_conv_transpose_bias_fuse_pass$|\
^test_onednn_depthwise_conv_pass$|\
^test_onednn_matmul_elementwise_add_fuse_pass$|\
^test_onednn_matmul_v2_elementwise_add_fuse_pass$|\
^test_onednn_matmul_v2_transpose_reshape_fuse_pass$|\
^test_onednn_mish_op$|\
^test_onednn_pad3d_op$|\
^test_onednn_prelu_op$|\
^test_onednn_shuffle_channel_detect_pass$|\
^test_onednn_batch_norm_act_fuse_pass$|\
^test_onednn_conv_bias_fuse_pass$|\
^test_onednn_conv_bn_fuse_pass$|\
^test_onednn_conv_concat_activation_fuse_pass$|\
^test_onednn_conv_elementwise_add_fuse_pass$|\
^test_onednn_matmul_transpose_reshape_fuse_pass$|\
^test_onednn_multi_gru_fuse_pass$|\
^test_onednn_multi_gru_seq_fuse_pass$|\
^test_onednn_reshape_transpose_matmul_fuse_pass$|\
^test_conv2d_layer_deprecated$|\
^test_conv3d_layer$|\
^test_decorator$|\
^test_flash_attention$|\
^test_flash_attention_deterministic$|\
^test_conv3d_onednn_op$|\
^test_functional_conv2d$|\
^test_functional_conv2d_transpose$|\
^test_functional_conv3d$|\
^test_functional_conv3d_transpose$|\
^test_imperative_layer_children$|\
^test_inference_api_deprecated$|\
^test_trans_layout_op$|\
^test_pool2d_op$|\
^test_conv3d_transpose_op$|\
^test_linalg_cond$|\
^test_eigh_op_static_build$|\
^test_einsum_op$|\
^test_sequence_pool$|\
^test_conv2d_op$|\
^test_graph_send_ue_recv_op$|\
^test_recognize_digits$|\
^test_mnist$|\
^test_mnist_amp$|\
^test_hapi_amp$|\
^test_imperative_mnist_sorted_gradient$|\
^test_imperative_qat_lsq$|\
^test_argsort_op$|\
^test_image_classification_fp16$|\
^test_imperative_double_grad$|\
^test_se_resnet$|\
^test_standalone_executor_aot_choose_kernel$|\
^test_imperative_qat_user_defined$|\
^test_mnist_pure_fp16$|\
^test_callback_reduce_lr_on_plateau$|\
^test_callback_visualdl$|\
^test_callback_wandb$|\
^test_user_defined_quantization$|\
^test_quantization_scale_pass_deprecated$|\
^test_quantization_pass$|\
^test_imperative_qat$|\
^test_graph$|\
^test_executor_and_mul$|\
^test_gru_unit_op$|\
^test_matmul_op$|\
^test_decoupled_py_reader_data_check_deprecated$|\
^test_decoupled_py_reader_deprecated$|\
^test_generator_dataloader_deprecated$|\
^test_py_reader_combination$|\
^test_reader_reset_deprecated$|\
^test_decoupled_py_reader_deprecated_static_build$|\
^test_multiprocess_dataloader_iterable_dataset_dynamic$|\
^test_multiprocess_dataloader_iterable_dataset_static$|\
^test_dataloader_keep_order_deprecated$|\
^test_dataloader_unkeep_order_deprecated$|\
^test_add_reader_dependency_deprecated$|\
^test_fuse_bn_act_pass_deprecated$|\
^test_fuse_bn_act_pass_deprecated_static_build$|\
^test_fuse_bn_add_act_pass$|\
^test_model$|\
^test_dataloader_early_reset_deprecated$|\
^test_add_reader_dependency_deprecated$|\
^test_conv2d_fusion_op$|\
^test_fused_conv2d_add_act_op$|\
^test_audio_datasets$|\
^test_signal$|\
^test_stft_op$|\
^test_trt_convert_flatten_contiguous_range$|\
^test_trt_convert_gather$|\
^test_trt_convert_index_select$|\
^test_trt_convert_lookup_table$|\
^test_trt_convert_prelu$|\
^test_trt_convert_bilinear_interp_v2$|\
^test_trt_convert_leaky_relu$|\
^test_reverse_roll_fuse_pass$|\
^test_trt_convert_einsum$|\
^test_trt_convert_roi_align$|\
^test_trt_convert_temporal_shift$|\
^test_trt_convert_mish$|\
^test_trt_convert_pad3d$|\
^test_trt_convert_yolo_box$|\
^test_merge_layernorm_fuse_pass$|\
^test_trt_convert_instance_norm$|\
^test_skip_merge_layernorm_fuse_pass$|\
^test_trt_float64$|\
^test_trt_convert_arg_max$|\
^test_trt_convert_arg_min$|\
^test_trt_convert_assign$|\
^test_trt_convert_cast$|\
^test_trt_convert_compare_and_logical$|\
^test_trt_convert_concat$|\
^test_preln_layernorm_x_fuse_pass$|\
^test_trt_convert_argsort$|\
^test_trt_remove_amp_strategy_op_pass$|\
^test_trt_convert_bitwise_and$|\
^test_trt_convert_bitwise_or$|\
^test_trt_convert_scatter$|\
^test_trt_convert_solve$|\
^test_quant_linear_fuse_pass$|\
^test_trt_explicit_quantization$|\
^test_trt_nearest_interp_v2_op$|\
^test_trt_pool3d_op$|\
^test_trt_convert_anchor_generator$|\
^test_trt_convert_softmax$|\
^test_trt_convert_strided_slice$|\
^test_layernorm_shift_partition_pass$|\
^test_trt_convert_multihead_matmul$|\
^test_trt_convert_reshape$|\
^test_trt_convert_split$|\
^test_trt_convert_squeeze2$|\
^test_trt_convert_sum$|\
^test_trt_convert_transpose$|\
^test_trt_convert_unsqueeze2$|\
^test_simplify_with_basic_ops_pass_autoscan$|\
^test_trt_convert_nearest_interp$|\
^test_trt_pool_op$|\
^test_trt_convert_clip$|\
^test_trt_convert_grid_sampler$|\
^test_trt_convert_p_norm$|\
^new_profiler_test$|\
^save_load_version_compat_test$|\
^disable_wingpu_cuda12_test$"

# /*=================Fixed Disabled Windows TRT MKL unittests=======================*/
# TODO: fix these unittest that is bound to fail
disable_win_trt_test="^test_trt_convert_conv2d$|\
^test_trt_convert_fused_conv2d_add_act$|\
^test_trt_convert_conv2d_transpose$|\
^test_trt_convert_depthwise_conv2d$|\
^test_trt_convert_emb_eltwise_layernorm$|\
^test_trt_convert_pool2d$|\
^test_trt_conv3d_op$|\
^test_trt_subgraph_pass$|\
^test_trt_convert_dropout$|\
^test_trt_convert_hard_sigmoid$|\
^test_trt_convert_reduce_mean$|\
^test_trt_convert_reduce_sum$|\
^test_trt_convert_group_norm$|\
^test_trt_convert_batch_norm$|\
^test_trt_convert_activation$|\
^test_trt_convert_depthwise_conv2d_transpose$|\
^test_trt_convert_elementwise$|\
^test_trt_convert_matmul$|\
^test_trt_convert_scale$"

# /*==========Fixed Disabled Windows CUDA11.x inference_api_test(PR-CI-Windows-Inference) unittests=============*/
disable_win_inference_test="^trt_quant_int8_yolov3_r50_test$|\
^test_trt_dynamic_shape_ernie$|\
^test_trt_dynamic_shape_ernie_fp16_ser_deser$|\
^lite_resnet50_test$|\
^test_trt_dynamic_shape_transformer_prune$|\
^lite_mul_model_test$|\
^trt_split_converter_test$|\
^paddle_infer_api_copy_tensor_tester$|\
^test_trt_deformable_conv$|\
^test_imperative_triple_grad$|\
^test_full_name_usage$|\
^test_trt_convert_unary$|\
^test_eigh_op$|\
^test_eigh_op_static_build$|\
^test_fc_op$|\
^test_stack_op$|\
^trt_split_converter_test$|\
^paddle_infer_api_copy_tensor_tester$|\
^test_eager_tensor$|\
^test_einsum_v2$|\
^test_tensor_scalar_type_promotion_static$|\
^test_matrix_power_op$|\
^test_deformable_conv_v1_op$|\
^test_where_index$|\
^test_custom_grad_input$|\
^test_conv3d_transpose_op$|\
^test_conv_elementwise_add_act_fuse_pass$|\
^test_conv_eltwiseadd_bn_fuse_pass$|\
^test_custom_relu_op_setup$|\
^test_conv3d_transpose_part2_op$|\
^test_deform_conv2d$|\
^test_deform_conv2d_deprecated$|\
^test_matmul_op$|\
^test_matmul_op_static_build$|\
^test_basic_api_transformation$|\
^test_deformable_conv_op$|\
^test_variable$|\
^test_onednn_conv_hard_sigmoid_fuse_pass$|\
^test_onednn_conv_hard_swish_fuse_pass$|\
^test_conv_act_onednn_fuse_pass$|\
^test_matmul_scale_fuse_pass$|\
^test_addmm_op$|\
^test_inverse_op$|\
^test_set_value_op$|\
^test_fused_multihead_matmul_op$|\
^test_cudnn_bn_add_relu$|\
^test_cond$|\
^test_conv_bn_fuse_pass$|\
^test_graph_khop_sampler$|\
^test_gru_rnn_op$|\
^test_masked_select_op$|\
^test_ir_fc_fuse_pass_deprecated$|\
^test_fc_elementwise_layernorm_fuse_pass$|\
^test_linalg_pinv_op$|\
^test_math_op_patch_var_base$|\
^test_slice$|\
^test_conv_elementwise_add_fuse_pass$|\
^test_executor_and_mul$|\
^test_analyzer_int8_resnet50$|\
^test_analyzer_int8_mobilenetv1$|\
^test_trt_conv_pass$|\
^test_roll_op$|\
^test_lcm$|\
^test_elementwise_floordiv_op$|\
^test_autograd_functional_dynamic$|\
^test_corr$|\
^test_trt_convert_deformable_conv$|\
^test_conv_elementwise_add2_act_fuse_pass$|\
^test_tensor_scalar_type_promotion_dynamic$|\
^test_model$|\
^test_py_reader_combination$|\
^test_py_reader_push_pop$|\
^test_reader_reset_deprecated$|\
^test_py_reader_pin_memory$|\
^test_multiprocess_dataloader_iterable_dataset_dynamic$|\
^test_multiprocess_dataloader_iterable_dataset_static$|\
^test_add_reader_dependency_deprecated$|\
^test_add_reader_dependency_for_interpretercore$|\
^test_compat$|\
^test_decoupled_py_reader_deprecated$|\
^test_decoupled_py_reader_deprecated_static_build$|\
^test_generator_dataloader_deprecated$|\
^test_py_reader_using_executor$|\
^test_dataloader_keep_order_deprecated$|\
^test_dataloader_unkeep_order_deprecated$|\
^test_fuse_bn_act_pass_deprecated$|\
^test_fuse_bn_act_pass_deprecated_static_build$|\
^test_fuse_bn_add_act_pass$|\
^test_decoupled_py_reader_data_check_deprecated$|\
^test_parallel_dygraph_sync_batch_norm$|\
^test_dataloader_early_reset_deprecated$|\
^test_fleet_base_single$|\
^test_sequence_pool$|\
^test_simplify_with_basic_ops_pass_autoscan$|\
^test_trt_activation_pass$|\
^test_trt_convert_hard_swish$|\
^test_trt_convert_leaky_relu$|\
^test_trt_convert_multihead_matmul$|\
^test_trt_convert_prelu$|\
^test_trt_fc_fuse_quant_dequant_pass$|\
^test_api_impl$|\
^test_tensordot$|\
^disable_win_inference_test$|\
^test_imperative_double_grad$|\
^test_comp_eager_matmul_double_grad$|\
^test_cuda_graph_partial_graph_static_run$|\
^test_imperative_triple_grad$|\
^test_mul_op$|\
^test_quant_linear_op$|\
^test_fused_gemm_epilogue_op$|\
^test_fused_gemm_epilogue_op_with_es$|\
^test_fused_linear_param_grad_add$|\
^test_fused_matmul_bias$|\
^test_fused_gemm_epilogue_pass$|\
^test_params_quantization_onednn_pass$|\
^test_depthwise_conv_onednn_pass$|\
^cc_imp_py_test$|\
^test_depthwise_conv_onednn_pass$|\
^test_compute_propagate_scales_onednn_pass$|\
^test_onednn_placement_pass$|\
^test_shuffle_channel_onednn_detect_pass$|\
^test_cpu_quantize_placement_pass$|\
^test_cpu_quantize_pass$|\
^test_cpu_quantize_squash_pass$|\
^test_cpu_bfloat16_placement_pass$|\
^test_cpu_bfloat16_pass$|\
^test_int8_scale_calculation_onednn_pass$|\
^test_while_api$|\
^test_sparse_matmul_op$|\
^test_standalone_cuda_graph_multi_stream_deprecated$|\
^test_standalone_cuda_graph_multi_stream_deprecated_static_build_deprecated$|\
^test_cuda_graph$|\
^test_cuda_graph_static_mode$|\
^test_cuda_graphed_layer$|\
^test_switch_autotune$|\
^test_nn_margin_rank_loss$|\
^test_no_grad$|\
^test_memory_efficient_attention$|\
^test_fused_flash_attn_pass$|\
^test_convert_mea_2_fa_pass$|\
^test_flash_attention_deterministic$|\
^test_map_op_another_pass$|\
^test_conv2d_add_fuse_pass$|\
^test_cutlass_fused_conv2d_add_act_op$|\
^test_multihead_matmul_roformer_fuse_pass_pir$|\
^test_mobile_net$|\
^test_IntermediateLayerGetter$|\
^test_se_resnet$|\
^test_amp_api$|\
^test_prim_amp$|\
^test_fuse_resnet_unit$|\
^test_dygraph_multi_forward$|\
^test_instance_norm_op_v2$|\
^test_multi_precision_fp16_train$|\
^test_imperative_skip_op$|\
^test_qat$|\
^test_bmn$|\
^test_imperative_layer_children$|\
^test_trans_layout_op$|\
^test_resnet$|\
^test_resnet_amp$|\
^test_resnet_pure_fp16$|\
^test_image_classification_fp16$|\
^test_tensorrt_engine$|\
^test_collect_operator_stats$|\
^test_conv1d_layer$|\
^test_conv1d_transpose_layer$|\
^test_dygraph_weight_norm$|\
^test_mnist$|\
^test_mnist_amp$|\
^test_hapi_amp$|\
^test_imperative_mnist_sorted_gradient$|\
^test_imperative_qat_fuse$|\
^test_imperative_qat_lsq$|\
^test_imperative_qat_matmul$|\
^test_sot_resnet50_backward$|\
^test_asp_optimize_static_deprecated$|\
^test_asp_save_load_deprecated$|\
^test_conv2d_api_deprecated$|\
^test_user_defined_quantization_deprecated$|\
^test_quantization_scale_pass_deprecated$|\
^test_mnist_pure_fp16$|\
^test_callback_reduce_lr_on_plateau$|\
^test_callback_visualdl$|\
^test_imperative_qat$|\
^test_step_profiler$|\
^test_conv2d_bn_fuse_pass$|\
^test_onednn_shape_op$|\
^test_recognize_digits_deprecated$|\
^test_conv2d_layer_deprecated$|\
^test_graph_deprecated$|\
^test_onednn_multi_gru_fuse_pass$|\
^test_onednn_multi_gru_seq_fuse_pass$|\
^test_conv2d_layer$|\
^test_conv3d_layer$|\
^test_initializer$|\
^test_forbid_dynamic_op_api$|\
^test_nn_dtype_device_bias$|\
^test_sot_dynamic_shape$|\
^test_asp_optimize_dynamic_deprecated$|\
^test_amp_decorate$|\
^test_amp_promote$|\
^test_conv2d_transpose_onednn_op$|\
^test_conv2d_transpose_op_depthwise_conv$|\
^test_dygraph_mnist_fp16$|\
^test_stub$|\
^test_save_load$|\
^test_conv_transpose_nn_grad$|\
^test_dygraph_spectral_norm$|\
^test_lambv2_op$|\
^test_retain_graph$|\
^test_multihead_matmul_roformer_fuse_pass$|\
^test_imperative_qat_user_defined$|\
^test_sot_resnet$|\
^test_fused_conv2d_add_act_op$|\
^test_standalone_executor_aot_choose_kernel_deprecated$|\
^test_image_classification_deprecated$|\
^test_functional_conv2d_transpose_deprecated$|\
^test_inference_api_deprecated$|\
^test_inplace_addto_strategy_deprecated$|\
^test_dynamic_shape_infermeta$|\
^test_conv2d_add_act_fuse_pass$|\
^test_conv3d_layer_deprecated$|\
^test_conv3d_transpose_part2_op_deprecated$|\
^test_split_program_deprecated$|\
^test_trt_convert_multihead_matmul_roformer$|\
^test_cudnn_placement_pass$|\
^operator_test$|\
^new_profiler_test$|\
^test_kernel_factory$|\
^save_load_version_compat_test$|\
^trt_mobilenet_test$|\
^trt_disable_tensorrt_half_ops_test$|\
^trt_quant_int8_test$|\
^trt_dynamic_shape_test$|\
^paddle_infer_api_test$|\
^device_context_test_cuda_graph$|\
^cudnn_helper_test$|\
^test_cudnn_norm_conv$"


# /*==========Fixed Disabled Windows CPU OPENBLAS((PR-CI-Windows-OPENBLAS)) unittests==============================*/
# TODO: fix these unittest that is bound to fail
disable_wincpu_test="^jit_kernel_test$|\
^test_analyzer_transformer_deprecated$|\
^test_vision_models$|\
^test_dygraph_multi_forward$|\
^test_imperative_transformer_sorted_gradient$|\
^test_imperative_resnet$|\
^test_imperative_resnet_sorted_gradient$|\
^test_imperative_se_resnext$|\
^test_bmn$|\
^test_mobile_net$|\
^test_build_strategy$|\
^test_se_resnet$|\
^operator_test|\
^new_profiler_test$|\
^save_load_version_compat_test|\
^disable_wincpu_test$"

# these unittest that cost long time, disabled temporarily, Maybe moved to the night
long_time_test="^test_gru_op$|\
^decorator_test$|\
^test_dataset_imdb$|\
^test_datasets$|\
^test_pretrained_model$|\
^test_gather_op$|\
^test_gather_nd_op$|\
^test_sequence_conv$|\
^test_activation_nn_grad$|\
^test_activation_op$|\
^test_activation_op_zero_size$|\
^test_bicubic_interp_v2_op$|\
^test_bilinear_interp_v2_op$|\
^test_crop_tensor_op$|\
^test_cross_entropy2_op$|\
^test_cross_op$|\
^test_elementwise_nn_grad$|\
^test_fused_elemwise_activation_op$|\
^test_imperative_selected_rows_to_lod_tensor$|\
^test_layer_norm_op$|\
^test_layer_norm_op_static_build$|\
^test_multiclass_nms_op$|\
^test_nearest_interp_v2_op$|\
^test_nn_grad$|\
^test_norm_nn_grad$|\
^test_normal$|\
^test_pool3d_op$|\
^test_static_save_load$|\
^test_trilinear_interp_op$|\
^test_trilinear_interp_v2_op$|\
^test_bilinear_interp_op$|\
^test_nearest_interp_op$|\
^test_sequence_conv$|\
^test_sgd_op$|\
^test_transformer$|\
^test_trt_matmul_quant_dequant$|\
^test_strided_slice_op$"


# /*============================================================================*/

set -e
set +x
NIGHTLY_MODE=$1
PRECISION_TEST=$2
WITH_GPU=$3

# Step1: Print disable_ut_quickly
export PADDLE_ROOT="$(cd "$PWD/../" && pwd )"
if [ ${NIGHTLY_MODE:-OFF} == "ON" ]; then
    nightly_label=""
else
    nightly_label="(RUN_TYPE=NIGHTLY|RUN_TYPE=DIST:NIGHTLY|RUN_TYPE=EXCLUSIVE:NIGHTLY)"
    echo "========================================="
    echo "Unittests with nightly labels  are only run at night"
    echo "========================================="
fi

if disable_ut_quickly=$(python ${PADDLE_ROOT}/tools/get_quick_disable_lt.py); then
    echo "========================================="
    echo "The following unittests have been disabled:"
    echo ${disable_ut_quickly}
    echo "========================================="
else
    disable_ut_quickly=''
fi

# Step2: Check added ut
set +e
cp $PADDLE_ROOT/tools/check_added_ut.sh $PADDLE_ROOT/tools/check_added_ut_win.sh
bash $PADDLE_ROOT/tools/check_added_ut_win.sh
rm -rf $PADDLE_ROOT/tools/check_added_ut_win.sh
if [ -f "$PADDLE_ROOT/added_ut" ];then
    added_uts=^$(awk BEGIN{RS=EOF}'{gsub(/\n/,"$|^");print}' $PADDLE_ROOT/added_ut)$
    ctest -R "(${added_uts})" -E "${disable_win_inference_test}" --output-on-failure -C Release --repeat-until-fail 3;added_ut_error=$?
    #rm -f $PADDLE_ROOT/added_ut
    if [ "$added_ut_error" != 0 ];then
        echo "========================================"
        echo "Added UT should pass three additional executions"
        echo "========================================"
        exit 8;
    fi
fi


# Step3: Get precision UT and intersect with parallel UT, generate tools/*_new file
set -e
if [ ${WITH_GPU:-OFF} == "ON" ];then
    export CUDA_VISIBLE_DEVICES=0

    ctest -N | awk -F ': ' '{print $2}' | sed '/^$/d' | sed '$d' > all_ut_list
    num=$(ctest -N | awk -F ': ' '{print $2}' | sed '/^$/d' | sed '$d' | wc -l)
    echo "Windows 1 card TestCases count is $num"
    if [ ${PRECISION_TEST:-OFF} == "ON" ]; then
        python ${PADDLE_ROOT}/tools/get_pr_ut.py || echo "Failed to obtain ut_list !"
    fi

    python ${PADDLE_ROOT}/tools/group_case_for_parallel.py ${PADDLE_ROOT}

fi

failed_test_lists=''
tmp_dir=`mktemp -d`
function collect_failed_tests() {
    set +e
    for file in `ls $tmp_dir`; do
        grep -q 'The following tests FAILED:' $tmp_dir/$file
        exit_code=$?
        if [ $exit_code -ne 0 ]; then
            failuretest=''
        else
            failuretest=`grep -A 10000 'The following tests FAILED:' $tmp_dir/$file | sed 's/The following tests FAILED://g'|sed '/^$/d'`
            failed_test_lists="${failed_test_lists}
            ${failuretest}"
        fi
    done
    set -e
}

function run_unittest_cpu() {
    tmpfile=$tmp_dir/$RANDOM
    (ctest -E "$disable_ut_quickly|$disable_wincpu_test" -LE "${nightly_label}" --output-on-failure -C Release -j 8 | tee $tmpfile) &
    wait;
}

function run_unittest_gpu() {
    test_case=$1
    parallel_job=$2
    parallel_level_base=${CTEST_PARALLEL_LEVEL:-1}
    if [ "$2" == "" ]; then
        parallel_job=$parallel_level_base
    else
        # set parallel_job according to CUDA memory and suggested parallel num,
        # the latter is derived in linux server with 16G CUDA memory.
        cuda_memory=$(nvidia-smi --query-gpu=memory.total --format=csv | tail -1 | awk -F ' ' '{print $1}')
        parallel_job=$(($2 * $cuda_memory / 16000))
        if [ $parallel_job -lt 1 ]; then
            parallel_job=1
        fi
    fi
    echo "************************************************************************"
    echo "********These unittests run $parallel_job job each time with 1 GPU**********"
    echo "************************************************************************"
    export CUDA_VISIBLE_DEVICES=0

    if nvcc --version | grep 11.2; then
        echo "CUDA version is 11.2, disable win_inference_test"
        disable_wingpu_test=${disable_win_inference_test}
    fi

    if nvcc --version | grep 11.7; then
        echo "CUDA version is 11.7, disable win_inference_test"
        disable_wingpu_test=${disable_win_inference_test}
    fi

    if nvcc --version | grep 12.0; then
        echo "CUDA version is 12.0, disable wingpu_cuda12_test"
        disable_wingpu_test=${disable_wingpu_cuda12_test}
    fi

    tmpfile=$tmp_dir/$RANDOM
    (ctest -R "$test_case" -E "$disable_ut_quickly|$disable_wingpu_test|$disable_win_trt_test|$long_time_test" -LE "${nightly_label}" --output-on-failure -C Release -j $parallel_job | tee $tmpfile ) &
    wait;
}

function unittests_retry(){
    is_retry_execute=0
    wintest_error=1
    retry_time=3
    exec_times=0
    exec_retry_threshold=30
    retry_unittests=$(echo "${failed_test_lists}" | grep -oEi "\-.+\(" | sed 's/(//' | sed 's/- //' )
    need_retry_ut_counts=$(echo "$retry_unittests" |awk -F ' ' '{print }'| sed '/^$/d' | wc -l)
    retry_unittests_regular=$(echo "$retry_unittests" |awk -F ' ' '{print }' | awk 'BEGIN{ all_str=""}{if (all_str==""){all_str=$1}else{all_str=all_str"$|^"$1}} END{print "^"all_str"$"}')
    tmpfile=$tmp_dir/$RANDOM

    if [ $need_retry_ut_counts -lt $exec_retry_threshold ];then
            retry_unittests_record=''
            while ( [ $exec_times -lt $retry_time ] )
                do
                    retry_unittests_record="$retry_unittests_record$failed_test_lists"
                    if ( [[ "$exec_times" == "0" ]] );then
                        cur_order='first'
                    elif ( [[ "$exec_times" == "1" ]] );then
                        cur_order='second'
                        if [[ "$failed_test_lists" == "" ]]; then
                            break
                        else
                            retry_unittests=$(echo "${failed_test_lists}" | grep -oEi "\-.+\(" | sed 's/(//' | sed 's/- //' )
                            retry_unittests_regular=$(echo "$retry_unittests" |awk -F ' ' '{print }' | awk 'BEGIN{ all_str=""}{if (all_str==""){all_str=$1}else{all_str=all_str"$|^"$1}} END{print "^"all_str"$"}')
                        fi
                    elif ( [[ "$exec_times" == "2" ]] );then
                        cur_order='third'
                    fi
                    echo "========================================="
                    echo "This is the ${cur_order} time to re-run"
                    echo "========================================="
                    echo "The following unittest will be re-run:"
                    echo "${retry_unittests}"
                    echo "========================================="
                    rm -f $tmp_dir/*
                    failed_test_lists=''
                    (ctest -R "($retry_unittests_regular)" --output-on-failure -C Release -j 1 | tee $tmpfile ) &
                    wait;
                    collect_failed_tests
                    exec_times=$(echo $exec_times | awk '{print $0+1}')
                done
    else
        # There are more than 30 failed unit tests, so no unit test retry
        is_retry_execute=1
    fi
    rm -f $tmp_dir/*
}

function show_ut_retry_result() {
    if [[ "$is_retry_execute" != "0" ]];then
        failed_test_lists_ult=`echo "${failed_test_lists}"`
        echo "========================================="
        echo "There are more than 30 failed unit tests, so no unit test retry!!!"
        echo "========================================="
        echo "${failed_test_lists_ult}"
        exit 8;
    else
        retry_unittests_ut_name=$(echo "$retry_unittests_record" | grep -oEi "\-.+\(" | sed 's/(//' | sed 's/- //' )
        retry_unittests_record_judge=$(echo ${retry_unittests_ut_name}| tr ' ' '\n' | sort | uniq -c | awk '{if ($1 >=3) {print $2}}')
        if [ -z "${retry_unittests_record_judge}" ];then
            echo "========================================"
            echo "There are failed tests, which have been successful after re-run:"
            echo "========================================"
            echo "The following tests have been re-run:"
            echo "${retry_unittests_record}"
        else
            failed_ut_re=$(echo "${retry_unittests_record_judge}" | awk 'BEGIN{ all_str=""}{if (all_str==""){all_str=$1}else{all_str=all_str"|"$1}} END{print all_str}')
            echo "========================================"
            echo "There are failed tests, which have been executed re-run,but success rate is less than 50%:"
            echo "Summary Failed Tests... "
            echo "========================================"
            echo "The following tests FAILED: "
            echo "${retry_unittests_record}" | grep -E "$failed_ut_re"
            exit 8;
        fi
    fi
}

# Step4: Run UT gpu or cpu
set +e
export FLAGS_call_stack_level=2
if [ "${WITH_GPU:-OFF}" == "ON" ];then

    single_ut_mem_0_startTime_s=`date +%s`
    if [ ${WIN_UNITTEST_LEVEL:-2} == "0" ]; then
        echo "ipipe_log_param_1_mem_0_TestCases_Total_Time: 0 s"
    else
        while read line
        do
            run_unittest_gpu "$line" 16
        done < $PADDLE_ROOT/tools/single_card_tests_mem0_new
        single_ut_mem_0_endTime_s=`date +%s`
        single_ut_mem_0_Time_s=`expr $single_ut_mem_0_endTime_s - $single_ut_mem_0_startTime_s`
        echo "ipipe_log_param_1_mem_0_TestCases_Total_Time: $single_ut_mem_0_Time_s s"
    fi

    single_ut_startTime_s=`date +%s`
    while read line
    do
        num=`echo $line | awk -F"$" '{print NF-1}'`
        para_num=`expr $num / 2`
        if [ $para_num -eq 0 ]; then
            para_num=4
        fi
        run_unittest_gpu "$line" $para_num
    done < $PADDLE_ROOT/tools/single_card_tests_new
    single_ut_endTime_s=`date +%s`
    single_ut_Time_s=`expr $single_ut_endTime_s - $single_ut_startTime_s`
    echo "ipipe_log_param_1_TestCases_Total_Time: $single_ut_Time_s s"

    multiple_ut_mem_0_startTime_s=`date +%s`
    while read line
    do
        run_unittest_gpu "$line" 10
    done < $PADDLE_ROOT/tools/multiple_card_tests_mem0_new
    multiple_ut_mem_0_endTime_s=`date +%s`
    multiple_ut_mem_0_Time_s=`expr $multiple_ut_mem_0_endTime_s - $multiple_ut_mem_0_startTime_s`
    echo "ipipe_log_param_2_mem0_TestCases_Total_Time: $multiple_ut_mem_0_Time_s s"

    multiple_ut_startTime_s=`date +%s`
    while read line
    do
        num=`echo $line | awk -F"$" '{print NF-1}'`
        para_num=`expr $num / 2`
        if [ $para_num -eq 0 ]; then
            para_num=4
        fi
        run_unittest_gpu "$line" $para_num

    done < $PADDLE_ROOT/tools/multiple_card_tests_new
    multiple_ut_endTime_s=`date +%s`
    multiple_ut_Time_s=`expr $multiple_ut_endTime_s - $multiple_ut_startTime_s`
    echo "ipipe_log_param_2_TestCases_Total_Time: $multiple_ut_Time_s s"


    exclusive_ut_mem_0_startTime_s=`date +%s`
    while read line
    do
        run_unittest_gpu "$line" 10
    done < $PADDLE_ROOT/tools/exclusive_card_tests_mem0_new
    exclusive_ut_mem_0_endTime_s=`date +%s`
    exclusive_ut_mem_0_Time_s=`expr $exclusive_ut_mem_0_endTime_s - $exclusive_ut_mem_0_startTime_s`
    echo "ipipe_log_param_-1_mem0_TestCases_Total_Time: $exclusive_ut_mem_0_Time_s s"

    exclusive_ut_startTime_s=`date +%s`
    while read line
    do
        num=`echo $line | awk -F"$" '{print NF-1}'`
        para_num=`expr $num / 2`
        if [ $para_num -eq 0 ]; then
            para_num=4
        fi
        run_unittest_gpu "$line" $para_num
    done < $PADDLE_ROOT/tools/exclusive_card_tests_new
    exclusive_ut_endTime_s=`date +%s`
    exclusive_ut_Time_s=`expr $exclusive_ut_endTime_s - $exclusive_ut_startTime_s`
    echo "ipipe_log_param_-1_TestCases_Total_Time: $exclusive_ut_Time_s s"

    noparallel_ut_startTime_s=`date +%s`
    while read line
    do
        run_unittest_gpu "$line" 8
    done < $PADDLE_ROOT/tools/no_parallel_case_file
    noparallel_ut_endTime_s=`date +%s`
    noparallel_ut_Time_s=`expr $noparallel_ut_endTime_s - $noparallel_ut_startTime_s`
    echo "ipipe_log_param_noparallel_TestCases_Total_Time: $noparallel_ut_Time_s s"
else
    run_unittest_cpu
fi
collect_failed_tests
set -e
rm -f $tmp_dir/*
if [[ "$failed_test_lists" != "" ]]; then
    unittests_retry
    show_ut_retry_result
fi
