Hizmet adını gözeten HAL testi

Android 9, Tedarikçi Test Paketi (VTS) testlerinin çalıştırıldığı cihaza bağlı olarak belirli bir HAL örneğinin hizmet adını edinmeye yönelik destek içerir. Hizmet adına duyarlı VTS HAL testleri çalıştırmak, geliştiricilerin hem hedef hem de ana makine tarafı VTS test çalıştırmalarında tedarikçi firma uzantılarını, birden fazla HAL'yi ve birden çok HAL örneğini test etmeyi otomatikleştirmesini sağlar.

Hizmet adları hakkında

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

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

  • Doğru hizmet adını ayarlamak için test geliştiricisinin bilgisine güvenir.
  • Varsayılan olarak tek bir hizmet örneğiyle testle sınırlıdır.
  • Hizmet adlarının manuel olarak bakımı (ör. adlar sabit kodlandığından, hizmet adı değişirse manuel olarak güncellenmelidir.

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 test için destek yer alır:

  • Tedarikçi firma HAL uzantıları. Örneğin, bir tedarikçinin özelleştirilmiş bir servis adıyla tedarikçi cihazlarında çalışan camera.provider HAL uygulaması varsa VTS, tedarikçi örneğini tanımlayabilir ve teste karşı çalıştırabilir.
  • Birden fazla HAL örneği. Örneğin, graphics.composer HAL'nin iki örneği (biri hizmet adı "default" ve diğeri "vr") olduğunda, VTS her iki örneği de tanımlayabilir ve her birinde testi çalıştırabilir.
  • Çoklu HAL testi. Birden fazla HAL'i birden fazla örnekle test ederken kullanılır. Örneğin, anahtar yöneticisi ve kapı bekçisi HAL'inin birlikte nasıl çalıştığını doğrulayan VTS testi çalıştırıldığında VTS, bu HAL'ler için tüm hizmet örneği kombinasyonlarını test edebilir.

Hedef taraf testleri

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

  • Teste hedefleme HAL'lerini kaydedin.
  • Kayıtlı tüm HAL'leri listeleyin.
  • 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ında destek sağlar:

  • Kayıtlı tüm test HAL'lerini almak için test ikilisini ön işleme.
  • Çalışan tüm hizmet örneklerini tanımlama ve her bir örneğin hizmet adını alma (vendor/manifest.xml'ye göre 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 taraflı test için çalışma zamanı desteği

Şekil 1. Hedef taraflı test için VTS çerçevesi çalışma zamanı desteği

Hizmet adı bilinçli hedef tarafı testleri oluşturma

Test ortamınızı hedef taraf hizmet adına duyarlı testlere yönelik olarak ayarlamak için:

  1. VtsHalHidlTargetTestEnvBase temel alınarak bir testEnvironment 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 bölümlerine 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();
    }

Daha fazla örnek için VtsHalCameraProviderV2_4TargetTest.cpp bölümüne bakın.

VTS ana makine tarafında testler

VTS ana makine taraflı testleri, hedef cihazdaki test ikili dosyaları yerine ana makine tarafında test komut dosyalarını çalıştırır. Bu testler için hizmet adı farkındalığını etkinleştirmek amacıyla, aynı test komut dosyasını farklı parametrelerle birden çok kez çalıştırmak için ana makine tarafı şablonlarını kullanabilirsiniz (gtest parametreli testine benzer).

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

Şekil 2. Barındırıcı taraflı test için VTS çerçevesi çalışma zamanında destek
  • hal test komut dosyası, testteki hedefleme HAL hizmetlerini belirtir.
  • hal_hidl_host_test sınıfı (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 örneğine iletilen parametreye göre ilgili hizmet adını döndüren getHalServiceName() yöntemini de sağlar.
  • param_test şablonu, bir parametre listesini kabul etme ve verilen tüm test durumlarını her parametre için çalıştırma mantığını destekler. Yani her test senaryosu için N yeni parametreli test senaryosu (N = parametrelerin boyutu) oluşturur.

Hizmet adı bilinçli ana makine tarafı testleri oluşturma

Test ortamınızı ana makine tarafı hizmet adına duyarlı testlere yönelik olarak ayarlamak için:

  1. Test komut dosyasında hedef HAL hizmetini belirtin:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. getHalServiceName() işlevini çağırı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))

Daha fazla örnek için VtsHalMediaOmxStoreV1_0HostTest.py bölümüne bakın.

Test HAL'lerini kaydetme

Android'in önceki sürümlerinde VTS, AndroidTest.xml bölümünde yapılandırılmış <precondition-lshal> seçeneğini kullanarak test HAL'ini tanımladı. Bu yaklaşımın sürdürülmesi zordu (testin doğru şekilde yapılandırılması ve yapılandırmanın uygun şekilde güncellenmesi için geliştiricilere ihtiyaç duyuluyordu) ve yanlıştı (arayüz bilgilerini değil, yalnızca paket ve sürüm bilgilerini içeriyordu).

Android 9'da VTS, hizmet adı farkındalığını kullanarak test HAL'ini tanımlar. Kayıtlı test HAL'leri aşağıdakiler için de yararlıdır:

  • Ön koşul kontrolleri. VTS, HAL testi çalıştırmadan önce test HAL'inin hedef cihazda mevcut olup olmadığını onaylayabilir ve mevcut değilse testleri atlayabilir (VTS test edilebilirlik kontrolüne bakın).
  • Kapsam ölçümü. VTS, ölçmek istediği (yani hal hizmet işleminin kapsamını temizlemek için) test HAL hizmetleri hakkındaki bilgiler aracılığıyla işlemler arası kod kapsamı ölçümünü destekler.