मल्टी-डिवाइस मॉड्यूल

इस दस्तावेज़ में, एक से ज़्यादा डिवाइसों के लिए मॉड्यूल बनाने का तरीका बताया गया है. साथ ही, इसमें मौजूदा सीमाओं के बारे में भी बताया गया है.

सैंपल

CTS वाई-फ़ाई-अवेयर मल्टी-डिवाइस मॉड्यूल उपलब्ध कराया जाता है. यह वाई-फ़ाई की मदद से, एक डिवाइस से दूसरे डिवाइस पर मैसेज भेजता है और इस बात की पुष्टि करता है कि मैसेज दूसरे डिवाइस पर पहुंच गया है.

मॉड्यूल का सोर्स, packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ पर मौजूद है.

हमने इस उदाहरण में ज़रूरत के हिसाब से टिप्पणियां की हैं.

पहला चरण: मॉड्यूल फ़ोल्डर बनाना

हमारा सुझाव है कि आप अपने कई डिवाइसों वाले मॉड्यूल के लिए, उस सुइट प्रोजेक्ट में एक फ़ोल्डर बनाएं जिससे वह मॉड्यूल जुड़ा है. उदाहरण के लिए: cts/hostsidetests/multidevices/. हमारा सुझाव है कि आप ऐसा करें, ताकि कम से कम शुरुआत में, सभी मल्टी-डिवाइस मॉड्यूल एक साथ रहें. इससे उदाहरणों को ढूंढना आसान हो जाएगा.

इस मॉड्यूल की सभी फ़ाइलों को उनके मॉड्यूल फ़ोल्डर में रखा जाना चाहिए. उदाहरण के लिए: wifi_aware.

दूसरा चरण: टेस्ट बनाना

यहां टेस्ट लॉजिक लागू किया जाता है. यह इस बात पर बहुत ज़्यादा निर्भर करता है कि किस चीज़ की जांच की जा रही है.

Mobly टेस्ट सोर्स बनाएं, जैसे कि: wifi_aware_test.py.

तीसरा चरण: Android.bp फ़ाइल बनाना

packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp जैसी Android.bp फ़ाइल जोड़ें. ऐसा python_test_host मॉड्यूल तय करें:

python_test_host {
    name: "CtsWifiAwareTestCases",
    main: "wifi_aware_test.py",
    srcs: ["wifi_aware_test.py"],
    test_suites: [
        "cts",
        "general-tests",
    ],
    test_options: {
        unit_test: false,
    },
    data: [
          // Package the snippet with the mobly test
        ":wifi_aware_snippet",
    ],
}

डेटा फ़ील्ड की मदद से, टेस्ट के लिए स्निपेट तय करें. इन्हें बाइनरी के साथ पैक किया जाएगा. साथ ही, ATest या लगातार चलने वाले टेस्ट में, इन्हें ढूंढा और इंस्टॉल किया जा सकता है.

Android में, Mobly के बंडल किए गए स्निपेट external/mobly-bundled-snippets/ पर उपलब्ध हैं.

ज़रूरी नहीं: कस्टम स्निपेट बनाना

कई डिवाइसों के लिए बने कुछ मॉड्यूल के लिए, कस्टम Mobly स्निपेट की ज़रूरत पड़ सकती है. सैंपल टेस्ट में, packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java पर वाई-फ़ाई के बारे में जानकारी देने वाला स्निपेट शामिल है. इसे Mobly Snippet Lib की मदद से बनाया गया है. यह Android में external/mobly-snippet-lib/ पर उपलब्ध है.

स्निपेट को स्टैंडर्ड इंस्ट्रुमेंटेशन की तरह Android.bp में android_test नियम के साथ तय किया जाना चाहिए:

android_test {
    name: "wifi_aware_snippet",
    sdk_version: "current",
    srcs: [
        "CallbackUtils.java",
        "WifiAwareSnippet.java",
    ],
    manifest: "AndroidManifest.xml",
    static_libs: [
        "androidx.test.runner",
        "guava",
        "mobly-snippet-lib",
    ],
}

चौथा चरण: मॉड्यूल कॉन्फ़िगरेशन बनाना: AndroidTest.xml

packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml जैसी कोई AndroidTest.xml फ़ाइल जोड़ें. इस टेस्ट कॉन्फ़िगरेशन में, आपको टेस्ट के लिए दो डिवाइसों की जानकारी देनी होगी. जैसे:

<configuration description="Config for CTS Wifi Aware test cases">
    <option name="test-suite-tag" value="cts" />
    <option name="config-descriptor:metadata" key="component" value="wifi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />

    <device name="device1">
        <!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
             So it's a lot easier to install APKs outside the python code.
        -->
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
          <!-- Any python dependencies can be specified and will be installed with pip -->
          <option name="dep-module" value="mobly" />
        </target_preparer>
    </device>
    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
    </device>

    <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
      <!-- The mobly-par-file-name should match the module name -->
      <option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
      <!-- Timeout limit in milliseconds for all test cases of the python binary -->
      <option name="mobly-test-timeout" value="60000" />
    </test>
</configuration>

ध्यान दें कि:

  • इस सैंपल टेस्ट में, Mobly पर निर्भरता है. PythonVirtualenvPreparer के लिए, किसी भी डिपेंडेंसी को तय किया जा सकता है और इसे pip की मदद से इंस्टॉल किया जाएगा.
  • mobly-par-file-namefor MoblyBinaryHostTest, Android.bp में मौजूद मॉड्यूल के नाम से मेल खाना चाहिए.
  • टेस्ट के लिए mobly-test-timeout तय करें. यह मिलीसेकंड में होता है और यह पूरी python बाइनरी एक्सीक्यूशन (सभी टेस्ट केस एक साथ) पर लागू होता है. कुछ समस्याओं के मामले में, जांच के मामलों को हमेशा के लिए लटका देने से बचने के लिए, यह ज़रूरी है.
  • हर device टैग में, हर डिवाइस पर अलग सेटअप हो सकता है. Mobly कॉन्फ़िगरेशन को ये टैग उसी क्रम में मिलेंगे जिस क्रम में उन्हें एक्सएमएल में बताया गया है.

स्निपेट के APK इंस्टॉलेशन से जुड़ी जानकारी:

  • पहले POC को अपडेट किया गया है, ताकि कवरेज टीम से बातचीत की वजह से, Target_तैयार होने की वजह से, स्निपेट एपीके इंस्टॉल हो सकें: यह पक्का करने के लिए कि कवरेज मेज़रमेंट को जल्दी मिटाया न जाए: Python बाइनरी में टेस्ट कोड इस्तेमाल करने के बजाय, Harness से अनइंस्टॉल करने से समय की बेहतर गारंटी मिलती है.

पांचवां चरण: स्थानीय तौर पर टेस्ट चलाना: atest

फ़िलहाल, एक से ज़्यादा डिवाइसों पर टेस्ट करने की सुविधा सिर्फ़ फिज़िकल डिवाइसों पर काम करती है. जांच शुरू करने से पहले, पुष्टि करें कि जांच के लिए इस्तेमाल किए जा रहे डिवाइस सही स्थिति में हों. adb devices कमांड से, कनेक्ट किए गए डिवाइसों की सूची दिखनी चाहिए. अगर सूची में ऐसे डिवाइस शामिल हैं जिन्हें टेस्ट करने के लिए नहीं बनाया गया है, तो -s फ़्लैग का इस्तेमाल करके टेस्ट के लिए डिवाइसों की जानकारी दें.

वाई-फ़ाई टेस्ट करने के लिए, पक्का करें कि फ़ैक्ट्री रीसेट करने के बाद, डिवाइसों के लिए वाई-फ़ाई चालू हो.

atest की मदद से, स्थानीय तौर पर टेस्ट चलाया जा सकता है:

$ atest CtsWifiAwareTestCases

आपको atest के आउटपुट में, खास जानकारी वाले हेडर में इस्तेमाल किए गए डिवाइसों की संख्या दिखेगी. जैसे, Test executed with 2 device(s).

समस्या का हल

अगर स्थानीय तौर पर चलाने पर, टेस्ट इन वजहों से पूरा नहीं हो पाता है, तो:

Virtualenv से जुड़ी गड़बड़ी

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

कृपया पक्का करें कि virtualenv आपके PATH में हो. PATH में "~/.local/bin" जोड़ने से, यह समस्या ठीक हो जाएगी. अगर virtualenv इंस्टॉल नहीं है, तो यह तरीका अपनाएं: https://virtualenv.pypa.io/en/latest/installation.html

कम से कम दो कंट्रोलर ऑब्जेक्ट मिलने चाहिए, लेकिन एक मिला

टेस्ट मॉड्यूल, मल्टी-डिवाइस या सिंगल-डिवाइस वाले होते हैं. इनमें कोई मिक्स-मॉड्यूल नहीं होता. अगर एक से ज़्यादा डिवाइसों के बिना, एक से ज़्यादा डिवाइसों के लिए बने मॉड्यूल को चलाने की कोशिश की जाती है, तो आपको यह गड़बड़ी दिखेगी:

Expected to get at least 2 controller objects, got 1

मॉड्यूल को मल्टी-डिवाइस मोड में चलाने से समस्या हल हो जाएगी.

सीटीएस के लिए: इसे ट्रिगर करने के लिए, run cts-multidevces या 'शर्डिंग' का इस्तेमाल किया जा सकता है. उदाहरण के लिए: --shard-count 2.