Hizmet adı bilinçli HAL testi

Android 9, Vendor Test Suite (VTS) testlerinin çalıştırıldığı cihaza göre belirli bir HAL örneğinin hizmet adını almayı destekler. Hizmet adının farkında olan VTS HAL testlerini çalıştırmak, geliştiricilerin hem hedef hem de ana makine tarafındaki VTS test çalıştırmalarında tedarikçi uzantılarını, birden fazla HAL'yi ve birden fazla HAL örneğini test etmeyi otomatikleştirmesini sağlar.

Hizmet adları hakkında

Çalışan HAL hizmetinin her örneği, bir hizmet adıyla kendini kaydettirir.

Android'in önceki sürümlerinde, VTS HAL testlerini çalıştıran geliştiricilerin getService() içinde test istemcisi için doğru hizmet adını ayarlaması veya adı boş bırakıp varsayılan hizmet adına geri dönmesi gerekiyordu. Bu yaklaşımın dezavantajları şunlardır:

  • Doğru hizmet adını ayarlamak için test geliştiricinin bilgisine güvenilmesi.
  • Varsayılan olarak tek bir hizmet örneğine karşı test etme ile sınırlıdır.
  • Hizmet adlarının manuel olarak bakımı (ör. adlar sabit kodlu olduğundan hizmet adı değişirse manuel olarak güncellenmesi gerekir).

Android 9'da geliştiriciler, test edilen cihaza göre belirli bir HAL örneğinin hizmet adını otomatik olarak alabilir. Bu yaklaşımın avantajları arasında şunlar yer alır:

  • Tedarikçi HAL uzantıları. Örneğin, bir satıcının özelleştirilmiş hizmet adına sahip satıcı cihazlarında çalışan bir camera.provider HAL uygulaması varsa VTS, satıcı örneğini tanımlayabilir ve testi bu örnek üzerinde çalıştırabilir.
  • Birden fazla HAL örneği. Örneğin, graphics.composer HAL'de iki örnek olduğunda (biri "default" hizmet adıyla, diğeri "vr" hizmet adıyla) VTS her iki örneği de tanımlayabilir ve testi her birine karşı çalıştırabilir.
  • Çoklu HAL testi. Birden fazla HAL'yi birden fazla örnekle test ederken kullanılır. Örneğin, KeyMint (eski adıyla Keymaster) ve Gatekeeper HAL'lerinin birlikte nasıl çalıştığını doğrulayan VTS testi çalıştırılırken VTS, bu HAL'ler için tüm hizmet örneği kombinasyonlarını test edebilir.

Hedef tarafı testleri

Hedef tarafı testinde hizmet adı farkındalığını etkinleştirmek için Android 9, aşağıdakiler için arayüzler sağlayan özelleştirilebilir bir test ortamı (VtsHalHidlTargetTestEnvBase) içerir:

  • Testte hedefleme HAL'lerini kaydedin.
  • Kayıtlı tüm HAL'leri listeler.
  • VTS çerçevesi tarafından sağlanan kayıtlı HAL'ler için hizmet adlarını alın.

Ayrıca VTS çerçevesi, aşağıdakiler için çalışma zamanı desteği sağlar:

  • Kayıtlı tüm test HAL'lerini almak için test ikili dosyasını önceden işleme.
  • Çalışan tüm hizmet örneklerini tanımlama ve her örnek için hizmet adını alma (vendor/manifest.xml temel alınarak alınır).
  • Tüm örnek kombinasyonlarını hesaplama (birden fazla HAL testini desteklemek için).
  • Her hizmet örneği (kombinasyon) için yeni bir test oluşturma.

Örnek:

Hedef tarafı testi için çalışma zamanı desteği

1. şekil. Hedef tarafı testi için VTS çerçevesi çalışma zamanı desteği

Hizmet adının farkında olan hedef tarafı testleri ayarlama

Hedef taraflı hizmet adı farkında test için test ortamınızı ayarlamak üzere:

  1. testEnvironment temelinde VtsHalHidlTargetTestEnvBase tanımlayın ve test HAL'lerini kaydedin:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Hizmet adını iletmek için test ortamı tarafından sağlanan getServiceName() öğesini kullanın:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Test ortamını main() ve initTest'ye kaydedin:
    int main(int argc, char** argv) {
            testEnv = new testEnvironment();
            ::testing::AddGlobalTestEnvironment(testEnv);
            ::testing::InitGoogleTest(&argc, argv);
            testEnv->init(argc, argv);
            return RUN_ALL_TESTS();
    }

Ek örnekler için VtsHalCameraProviderV2_4TargetTest.cpp başlıklı makaleyi inceleyin.

VTS ana makine tarafı testleri

VTS ana makine tarafı testleri, hedef cihazdaki test ikilileri yerine ana makine tarafında test komut dosyalarını çalıştırır. Bu testlerde hizmet adı farkındalığını etkinleştirmek için ana makine tarafı şablonlarını kullanarak aynı test komut dosyasını farklı parametrelere karşı birden çok kez çalıştırabilirsiniz (gtest parametreli testine benzer şekilde).

Ana makine tarafı test için çalışma zamanı desteği

Şekil 2. Ana makine tarafında test için VTS çerçevesi çalışma zamanı desteği
  • HAL testi komut dosyası, testteki hedefleme HAL hizmetlerini belirtir.
  • hal_hidl_host_test (param_test alt sınıfı), test komut dosyasından kayıtlı test HAL'lerini alır, test HAL'si için ilgili hizmet adlarını tanımlar ve ardından test parametreleri olarak hizmet adı kombinasyonları (çoklu HAL testi için) oluşturur. Ayrıca, geçerli test senaryosuna iletilen parametreye göre ilgili hizmet adını döndüren bir yöntem getHalServiceName() de sağlar.
  • param_test şablonu, bir parametre listesini kabul etme ve verilen tüm test senaryolarını her parametreye göre çalıştırma mantığını destekler. Yani her test senaryosu için N yeni parametreli test senaryosu oluşturur (N = parametrelerin boyutu). Her birinde belirli bir parametre bulunur.

Hizmet adının bilindiği ana makine tarafı testleri ayarlama

Ana makine tarafında hizmet adı farkında test için test ortamınızı ayarlamak üzere:

  1. Test komut dosyasında hedef HAL hizmetini belirtin:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. getHalServiceName() numarasını arayın ve adı init hal'e iletin:
    self.dut.hal.InitHidlHal(
                target_type='foo',
                target_basepaths=self.dut.libPaths,
                target_version=1.0,
                target_package='android.hardware.foo',
                target_component_name='IFoo',
                hw_binder_service_name
                      =self.getHalServiceName("android.hardware.foo@1.0::IFoo"),
                bits=int(self.abi_bitness))

Ek örnekler için VtsHalMediaOmxStoreV1_0HostTest.py başlıklı makaleyi inceleyin.

Test HAL'lerini kaydetme

Android'in önceki sürümlerinde VTS, <precondition-lshal> seçeneğini kullanarak test HAL'sini tanımlıyordu. Bu seçenek, AndroidTest.xml içinde yapılandırılıyordu. Bu yaklaşımı sürdürmek zordu (çünkü testin doğru şekilde yapılandırılması ve yapılandırmanın buna göre güncellenmesi için geliştiricilerin müdahalesi gerekiyordu) ve bu yaklaşım doğru değildi (çünkü yalnızca paket ve sürüm bilgilerini içeriyor, arayüz bilgilerini içermiyordu).

Android 9'da VTS, hizmet adı farkındalığını kullanarak test HAL'sini tanımlar. Kayıtlı test HAL'leri şu amaçlarla da kullanılabilir:

  • Ön koşul kontrolleri. VTS, bir HAL testi çalıştırmadan önce test edilen HAL'ın hedef cihazda kullanılabilir olduğunu doğrulayabilir ve kullanılabilir değilse testleri atlayabilir (VTS test edilebilirliği kontrolü bölümüne bakın).
  • Kapsam ölçümü VTS, ölçmek istediği test HAL hizmetleri (ör. HAL hizmeti sürecinin kapsamını temizlemek) hakkındaki bilgiler aracılığıyla süreçler arası kod kapsamı ölçümünü destekler.