code: def test_vecenv_wrapper_getattr():
      def make_env():
          return CustomGymEnv(
              gym.spaces.Box(low=np.zeros(2), high=np.ones(2))
          )
  
      vec_env = DummyVecEnv([make_env for _ in range(N_ENVS)])
      wrapped = CustomWrapperA(CustomWrapperBB(vec_env))
      assert wrapped.var_a == "a"
      assert wrapped.var_b == "b"
      assert wrapped.var_bb == "bb"
      assert wrapped.func_b() == "b"
      assert wrapped.name_test() == CustomWrapperBB
  
      double_wrapped = CustomWrapperA(CustomWrapperB(wrapped))
      dummy = (
          double_wrapped.var_a
      )  # should not raise as it is directly defined here
      with pytest.raises(
          AttributeError
      ):  # should raise due to ambiguity
          dummy = double_wrapped.var_b
      with pytest.raises(
          AttributeError
      ):  # should raise as does not exist
          dummy = double_wrapped.nonexistent_attribute
      del dummy
  
imports: import collections
  import functools
  import itertools
  import multiprocessing
  import pytest
  import gym
  import numpy
  from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv, VecNormalize, VecFrameStack
label_desc: Use image node_id 9 for calling a global function with example usage: test_vecenv_wrapper_getattr() and returns: CustomGymEnv