ডিভাইস শেল কমান্ড

VTS টেস্টিং চলাকালীন, টার্গেট-সাইড টেস্ট বাইনারি এক্সিকিউট করতে, প্রপার্টি, এনভায়রনমেন্ট ভেরিয়েবল ও সিস্টেম তথ্য পেতে/সেট করতে এবং Android ফ্রেমওয়ার্ক চালু/বন্ধ করতে শেল কমান্ড ব্যবহার করা হয়। আপনি adb shell কমান্ড বা ডিভাইসে চলা VTS শেল ড্রাইভার ব্যবহার করে VTS ডিভাইস শেল কমান্ড এক্সিকিউট করতে পারবেন (সাজেস্ট করা হয়েছে)।

ADB শেল ব্যবহার করুন

পরীক্ষার সময় USB পোর্ট বন্ধ করে দেওয়া বা ডিভাইস রিবুট করার প্রয়োজন হয় এমন পরীক্ষার ক্ষেত্রে ADB শেল ব্যবহার করতে হবে, কারণ স্থায়ী USB কানেকশন না থাকলে VTS শেল ড্রাইভার উপলভ্য থাকে না। Python টেস্ট স্ক্রিপ্টে থাকা AndroidDevice অবজেক্ট থেকে আপনি ADB শেল ইনভোক করতে পারবেন। উদাহরণ:

  • Android ডিভাইস অবজেক্ট পান:
    self.device = self.android_devices[0]
    
  • একটি শেল কমান্ড ইস্যু করুন:
    result = self.device.adb.shell(‘ls')
    

VTS শেল ড্রাইভার ব্যবহার করা

VTS শেল ড্রাইভার হল একটি এজেন্ট বাইনারি যা ডিভাইসে রান করে এবং শেল কমান্ড এক্সিকিউট করে। ডিফল্ট হিসেবে, VTS শেল ড্রাইভার ব্যবহার করে যদি ড্রাইভার ডিভাইসে রান করে কারণ এই পদ্ধতিতে adb shell কমান্ড ব্যবহার করার চেয়ে কম লেটেন্সি হয়।

ছবি ১. VTS শেল ড্রাইভার।

VTS ফ্রেমওয়ার্ক একাধিক ডিভাইস নিয়ে পরীক্ষা করার সুবিধা দেয়, যেখানে প্রতিটি Android ডিভাইসকে বেস রানারে AndroidDevice অবজেক্ট হিসেবে দেখানো হয়। সাধারণত, VTS ফ্রেমওয়ার্ক প্রতিটি Android ডিভাইসে VTS এজেন্ট ও VTS শেল ড্রাইভার বাইনারি পুশ করে এবং সেইসব ডিভাইসে VTS এজেন্টের সাথে TCP কানেকশন স্থাপন করে।

একটি শেল কমান্ড এক্সিকিউট করতে, হোস্ট-সাইড Python স্ক্রিপ্ট AndroidDevice অবজেক্টের মধ্যে ShellMirror অবজেক্টে একটি ফাংশন কল করে। ShellMirror অবজেক্ট, শেল কমান্ড টেক্সটকে protobuf মেসেজে প্যাক করে এবং Android ডিভাইসে VTS এজেন্টের কাছে (TCP চ্যানেলের মাধ্যমে) পাঠায়। ডিভাইসে রান করা এজেন্ট তারপরে Unix সকেটের মাধ্যমে VTS শেল ড্রাইভারকে শেল কমান্ড ফরওয়ার্ড করে।

VTS শেল ড্রাইভার কোনও শেল কমান্ড পেলে, সেটি হ্যাং হওয়া আটকানোর জন্য ডিভাইস শেলে nohup-এর মাধ্যমে কমান্ডটি এক্সিকিউট করে। তারপর nohup থেকে Stdout, stderr এবং রিটার্ন কোড রিট্রিভ করে VTS এজেন্টের কাছে পাঠানো হয়। অবশেষে, এজেন্ট কমান্ডের ফলাফল(গুলি) একটি protobuf মেসেজে র‍্যাপ করে হোস্টকে উত্তর দেয়।

সুবিধা

adb shell-এর পরিবর্তে VTS শেল ড্রাইভার ব্যবহার করার সুবিধাগুলির মধ্যে রয়েছে:

  • নির্ভরযোগ্যতা। VTS শেল ড্রাইভার ডিফল্ট সেটিংসে কমান্ড এক্সিকিউট করতে nohup ব্যবহার করে। VTS টেস্ট যেহেতু বেশিরভাগ ক্ষেত্রে লোয়ার লেভেল HAL ও কার্নেল টেস্ট, তাই nohup নিশ্চিত করে যে এক্সিকিউশনের সময় শেল কমান্ড যেন হ্যাং না করে।
  • পারফর্ম্যান্স। adb shell কমান্ড কিছু ফলাফল ক্যাশে করলেও (যেমন, ডিরেক্টরিতে ফাইলের তালিকা তৈরি করা) টেস্ট বাইনারি এক্সিকিউট করার মতো টাস্ক পারফর্ম করার সময় এটির কানেকশন ওভারহেড থাকে। VTS শেল ড্রাইভার পুরো টেস্ট চলাকালীন একটি অ্যাক্টিভ কানেকশন বজায় রাখে, তাই একমাত্র ওভারহেড হল USB কমিউনিকেশন। আমাদের পরীক্ষায়, খালি gtest বাইনারিতে ১০০টি কল সহ কোনও কমান্ড এক্সিকিউট করার জন্য VTS শেল ড্রাইভার ব্যবহার করা adb shellব্যবহার করার চেয়ে ২০ শতাংশ দ্রুত হয়; VTS শেল যোগাযোগে প্রচুর লগিং থাকে বলে আসল পার্থক্য আরও বেশি হয়।
  • স্টেট-কিপিং। VTS শেল ড্রাইভার প্রতিটি টার্মিনাল নামের জন্য একটি করে টার্মিনাল সেশন বজায় রাখে (ডিফল্ট টার্মিনাল নাম হল ডিফল্ট)। একটি টার্মিনাল সেশনে সেট করা এনভায়রনমেন্ট ভেরিয়েবল শুধুমাত্র একই সেশনের পরবর্তী কমান্ডের জন্য উপলভ্য।
  • এক্সটেন্ড করা যাবে। VTS ফ্রেমওয়ার্ক ও ডিভাইস ড্রাইভারের মধ্যে শেল কমান্ড কমিউনিকেশন প্রোটোবাফে র‍্যাপ করা থাকে যাতে ভবিষ্যতে সম্ভাব্য কম্প্রেশন, রিমোটিং, এনক্রিপশন ইত্যাদি করা যায়। পারফর্ম্যান্স উন্নত করার জন্য অন্যান্য সম্ভাবনাও উপলভ্য, যার মধ্যে রয়েছে ডিভাইস-সাইড ফলাফল পার্সিং যখন কমিউনিকেশন ওভারহেড ফলাফল স্ট্রিং পার্সিংয়ের চেয়ে বড় হয়ে যায়।

অসুবিধা

adb shell-এর পরিবর্তে VTS শেল ড্রাইভার ব্যবহার করার অসুবিধাগুলি হল:

  • অতিরিক্ত বাইনারি। VTS এজেন্ট ফাইল অবশ্যই ডিভাইসে পুশ করতে হবে এবং টেস্ট এক্সিকিউশনের পরে ক্লিন-আপ করতে হবে।
  • অ্যাক্টিভ কানেকশন থাকতে হবে। পরীক্ষা চলাকালীন হোস্ট ও এজেন্টের মধ্যে TCP কানেকশন হারিয়ে গেলে (USB ডিসকানেক্ট, পোর্ট বন্ধ হয়ে যাওয়া, ডিভাইস ক্র্যাশ করা ইত্যাদি কারণে) ইচ্ছাকৃত বা অনিচ্ছাকৃতভাবে, VTS এজেন্টে কোনও শেল কমান্ড ট্রান্সমিট করা যায় না। এমনকি adb shell-এ অটোমেটিক সুইচ করলেও, ডিসকানেক্ট করার আগে কমান্ডের ফলাফল ও স্টেট অজানা থাকবে।

উদাহরণ

VTS হোস্ট-সাইড Python টেস্ট স্ক্রিপ্টে শেল কমান্ড ব্যবহারের উদাহরণ:

  • Android ডিভাইস অবজেক্ট পান:
    self.device = self.android_devices[0]
    
  • বেছে নেওয়া ডিভাইসের জন্য শেল অবজেক্ট পান:
    self.shell = self.device.shell
    
  • একটি শেল কমান্ড ইস্যু করুন:
    results = self.shell.Execute(‘ls')
    
  • শেল কমান্ডের তালিকা ইস্যু করুন:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

কমান্ডের ফলাফল অবজেক্ট

শেল কমান্ড এক্সিকিউশন থেকে রিটার্ন করা অবজেক্ট হল একটি ডিকশনারি যাতে stdouts, stderrs ও return_codes কী থাকে। শেল কমান্ডটি একটি একক স্ট্রিং বা কমান্ড স্ট্রিংয়ের তালিকা হিসাবে প্রদান করা হয়েছে কিনা তা নির্বিশেষে, ফলাফল ডিকশনারির প্রতিটি মান সর্বদা একটি তালিকা।

কমান্ডের তালিকার রিটার্ন কোড যাচাই করতে, টেস্ট স্ক্রিপ্টকে অবশ্যই ইনডেক্স চেক করতে হবে। উদাহরণ:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

অন্যথায়, স্ক্রিপ্ট প্রতিটি কমান্ড ইন্ডেক্স আলাদাভাবে চেক করতে পারে। উদাহরণ:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')