@@ -970,3 +970,89 @@ TEST(
970970 EXPECT_EQ (ZE_RESULT_SUCCESS , zeCommandQueueDestroy (commandQueue));
971971 EXPECT_EQ (ZE_RESULT_SUCCESS , zeContextDestroy (context));
972972}
973+
974+ // /////////////////////////////////////////////////////////////////////////////
975+ // Handle Lifetime Tests
976+ //
977+ // These tests validate the ZE_ENABLE_HANDLE_LIFETIME feature of the validation
978+ // layer. Handle lifetime tracking registers handles when they are created and
979+ // validates them on every subsequent API call, returning
980+ // ZE_RESULT_ERROR_INVALID_NULL_HANDLE for any unregistered handle.
981+ //
982+ // The tests are run as separate CTest invocations with the environment:
983+ // ZE_ENABLE_VALIDATION_LAYER=1
984+ // ZE_ENABLE_HANDLE_LIFETIME=1
985+ // ZE_ENABLE_NULL_DRIVER=1
986+
987+ // Regression test: driver handles obtained via zeInitDrivers must be registered
988+ // in the handle lifetime tracker so that subsequent API calls succeed.
989+ // Before the fix, zeInitDrivers had no handle-registration epilogue (unlike
990+ // zeDriverGet), causing zeDeviceGet to return ZE_RESULT_ERROR_INVALID_NULL_HANDLE.
991+ TEST (
992+ HandleLifetimeValidation,
993+ GivenHandleLifetimeEnabledWhenCallingzeDeviceGetWithDriverHandleFromzeInitDriversThenSucceeds) {
994+
995+ ze_init_driver_type_desc_t driverTypeDesc = {};
996+ driverTypeDesc.stype = ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC ;
997+ driverTypeDesc.pNext = nullptr ;
998+ driverTypeDesc.flags = UINT32_MAX ;
999+
1000+ uint32_t count = 0 ;
1001+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeInitDrivers (&count, nullptr , &driverTypeDesc));
1002+ EXPECT_GT (count, 0 );
1003+
1004+ std::vector<ze_driver_handle_t > drivers (count);
1005+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeInitDrivers (&count, drivers.data (), &driverTypeDesc));
1006+
1007+ // Regression: driver handles from zeInitDrivers must be registered with the
1008+ // handle lifetime tracker so that zeDeviceGet does not fail with
1009+ // ZE_RESULT_ERROR_INVALID_NULL_HANDLE.
1010+ uint32_t deviceCount = 0 ;
1011+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDeviceGet (drivers[0 ], &deviceCount, nullptr ));
1012+ EXPECT_GT (deviceCount, 0 );
1013+
1014+ std::vector<ze_device_handle_t > devices (deviceCount);
1015+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDeviceGet (drivers[0 ], &deviceCount, devices.data ()));
1016+ }
1017+
1018+ // Verify that driver handles obtained via zeDriverGet are registered correctly
1019+ // and can be used with zeDeviceGet when handle lifetime tracking is enabled.
1020+ TEST (
1021+ HandleLifetimeValidation,
1022+ GivenHandleLifetimeEnabledWhenCallingzeDeviceGetWithDriverHandleFromzeDriverGetThenSucceeds) {
1023+
1024+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeInit (ZE_INIT_FLAG_GPU_ONLY ));
1025+
1026+ uint32_t driverCount = 0 ;
1027+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDriverGet (&driverCount, nullptr ));
1028+ EXPECT_GT (driverCount, 0 );
1029+
1030+ std::vector<ze_driver_handle_t > drivers (driverCount);
1031+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDriverGet (&driverCount, drivers.data ()));
1032+
1033+ uint32_t deviceCount = 0 ;
1034+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDeviceGet (drivers[0 ], &deviceCount, nullptr ));
1035+ EXPECT_GT (deviceCount, 0 );
1036+
1037+ std::vector<ze_device_handle_t > devices (deviceCount);
1038+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeDeviceGet (drivers[0 ], &deviceCount, devices.data ()));
1039+ }
1040+
1041+ // Verify that calling an API with a null (unregistered) handle returns
1042+ // ZE_RESULT_ERROR_INVALID_NULL_HANDLE when handle lifetime tracking is enabled.
1043+ TEST (
1044+ HandleLifetimeValidation,
1045+ GivenHandleLifetimeEnabledWhenCallingzeDeviceGetWithNullDriverHandleThenReturnsInvalidHandle) {
1046+
1047+ ze_init_driver_type_desc_t driverTypeDesc = {};
1048+ driverTypeDesc.stype = ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC ;
1049+ driverTypeDesc.pNext = nullptr ;
1050+ driverTypeDesc.flags = UINT32_MAX ;
1051+
1052+ uint32_t count = 0 ;
1053+ EXPECT_EQ (ZE_RESULT_SUCCESS , zeInitDrivers (&count, nullptr , &driverTypeDesc));
1054+
1055+ // A null handle is never registered; the handle lifetime checker must reject it.
1056+ uint32_t deviceCount = 0 ;
1057+ EXPECT_EQ (ZE_RESULT_ERROR_INVALID_NULL_HANDLE , zeDeviceGet (nullptr , &deviceCount, nullptr ));
1058+ }
0 commit comments