1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import usb from '@ohos.usb';
17import CheckEmptyUtils from './CheckEmptyUtils.js';
18import EventConstants from './EventConstants.js';
19import parameter from '@ohos.systemparameter';
20import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'
21
22/* usb device pipe test */
23describe('UsbDevicePipeJsFunctionsTest', function () {
24  var gDeviceList
25  var gPipe
26
27  beforeAll(function () {
28    console.log('*************Usb Unit UsbDevicePipeJsFunctionsTest Begin*************');
29    var Version = usb.getVersion()
30    console.info('usb unit begin test getversion :' + Version)
31    // version > 17  host currentMode = 2 device currentMode = 1
32    var usbPortList = usb.getPorts()
33    if (usbPortList.length > 0) {
34      if (usbPortList[0].status.currentMode == 1) {
35        usb.setPortRoles(usbPortList[0].id, usb.SOURCE, usb.HOST).then(data => {
36          console.info('usb case setPortRoles return: ' + data);
37        }).catch(error => {
38          console.info('usb case setPortRoles error : ' + error);
39        });
40        console.log('*************Usb Unit switch to host Begin*************');
41      }
42    }
43
44    gDeviceList = usb.getDevices();
45    gPipe = usb.connectDevice(gDeviceList[0])
46    console.info('usb unit connectDevice gPipe ret : ' + JSON.stringify(gPipe));
47  })
48
49  beforeEach(function () {
50    console.info('beforeEach: *************Usb Unit Test Case*************');
51  })
52  afterEach(function () {
53    console.info('afterEach: *************Usb Unit Test Case*************');
54  })
55
56  afterAll(function () {
57    var isPipClose = usb.closePipe(gPipe)
58    console.info('usb unit close gPipe ret : ' + isPipClose);
59    console.log('*************Usb Unit UsbDevicePipeJsFunctionsTest End*************');
60  })
61
62  function findInitPoint(testParam, j) {
63    var bfind = false
64    for (var k = 0; k < testParam.config.interfaces[j].endpoints.length; k++) {
65      var endpoint = testParam.config.interfaces[j].endpoints[k];
66      if (endpoint.type == EventConstants.USB_ENDPOINT_XFER_BULK) {
67        bfind = true
68        if (endpoint.direction == usb.USB_REQUEST_DIR_TO_DEVICE) {
69          testParam.maxOutSize = endpoint.maxPacketSize;
70          testParam.outEndpoint = endpoint;
71        } else if (endpoint.direction == usb.USB_REQUEST_DIR_FROM_DEVICE) {
72          testParam.maxInSize = endpoint.maxPacketSize;
73          testParam.inEndpoint = endpoint
74        }
75      }
76    }
77    if (bfind) {
78      testParam.interface = testParam.config.interfaces[j]
79      return bfind
80    }
81    return false
82  }
83
84  function getFlag(testParam, j) {
85    if (testParam.config.interfaces[j].endpoints.length == 0) {
86      return false
87    }
88
89    if (testParam.config.interfaces[j].clazz != 10 ||
90      testParam.config.interfaces[j].subclass != 0 ||
91      testParam.config.interfaces[j].protocol != 2) {
92      return false
93    }
94    return true
95  }
96
97  function initPoint(testParam) {
98    for (var j = 0; j < testParam.config.interfaces.length; j++) {
99      if (getFlag(testParam, j) == true) {
100        if (findInitPoint(testParam, j) == true) {
101          break
102        }
103      }
104    }
105  }
106
107  // 预制传输相关参数
108  function getTransferTestParam() {
109    var testParam = {
110      config: null,
111      device: null,
112      pip: null,
113      inEndpoint: null,
114      interface: null,
115      outEndpoint: null,
116      usbRequest: null,
117      sendData: '',
118      isClaimed: 0,
119      maxInSize: 1024,
120      maxOutSize: 1024
121    }
122
123    console.info('usb case  gDeviceList.length: ' + gDeviceList.length);
124    for (var i = 0; i < gDeviceList.length; i++) {
125      testParam.device = gDeviceList[i]
126      testParam.config = testParam.device.configs[0]
127      testParam.pip = gPipe
128      initPoint(testParam)
129    }
130    return testParam
131  }
132
133  /**
134   * @tc.number    : SUB_USB_bulk_transfer_test_01
135   * @tc.name      : bulkTransfer
136   * @tc.desc      : 批量传输 收数据
137   */
138  it('SUB_USB_bulk_transfer_test_01', 0, function () {
139    console.info('usb bulk_transfer_test_01 begin');
140    var testParam = getTransferTestParam()
141    if (testParam.interface == null || testParam.inEndpoint == null) {
142      expect(false).assertTrue();
143      return
144    }
145
146    testParam.isClaimed = usb.claimInterface(testParam.pip, testParam.interface, true);
147    expect(testParam.isClaimed).assertEqual(0);
148
149    console.info('usb case readData begin');
150    var tmpUint8Array = new Uint8Array(testParam.maxInSize);
151    usb.bulkTransfer(testParam.pip, testParam.inEndpoint, tmpUint8Array, 5000).then(data => {
152      console.info('usb case readData tmpUint8Array buffer : ' + CheckEmptyUtils.ab2str(tmpUint8Array));
153      console.info('usb case readData ret: ' + data);
154      console.info('usb case bulk_transfer_test_01 :  PASS');
155      expect(data >= 0).assertTrue();
156    }).catch(error => {
157      console.info('usb case readData error : ' + JSON.stringify(error));
158      expect(false).assertTrue();
159    });
160  })
161
162  /**
163   * @tc.number    : SUB_USB_bulk_transfer_test_02
164   * @tc.name      : bulkTransfer
165   * @tc.desc      : 批量传输 发数据
166   */
167  it('SUB_USB_bulk_transfer_test_02', 0, function () {
168    console.info('usb bulk_transfer_test_02 begin');
169    var testParam = getTransferTestParam()
170    if (testParam.interface == null || testParam.outEndpoint == null) {
171      expect(false).assertTrue();
172      return
173    }
174
175    testParam.isClaimed = usb.claimInterface(testParam.pip, testParam.interface, true);
176    expect(testParam.isClaimed).assertEqual(0);
177
178    testParam.sendData = 'send default';
179    try {
180      testParam.sendData = parameter.getSync('test_usb', 'default');
181      console.log('usb parameter ' + JSON.stringify(testParam.sendData));
182    } catch (e) {
183      console.log('usb parameter getSync unexpected error: ' + e);
184    }
185
186    var tmpUint8Array = CheckEmptyUtils.str2ab(testParam.sendData);
187    usb.bulkTransfer(testParam.pip, testParam.outEndpoint, tmpUint8Array, 5000).then(data => {
188      console.info('usb case bulk_transfer_test_02 ret: ' + data);
189      console.info('usb case bulk_transfer_test_02 send data: ' + testParam.sendData);
190      console.info('usb case bulk_transfer_test_02 :  PASS');
191      expect(true).assertTrue();
192    }).catch(error => {
193      console.info('usb write error : ' + JSON.stringify(error));
194      expect(false).assertTrue();
195    });
196
197  })
198
199  /**
200   * @tc.number    : SUB_USB_claim_interface_test_01
201   * @tc.name      : claimInterface
202   * @tc.desc      : 获取接口 并释放
203   */
204  it('SUB_USB_claim_interface_test_01', 0, function () {
205    console.info('usb claim_interface_test_01 begin');
206    if (gDeviceList.length == 0) {
207      console.info('usb 01 case get_device_list is null')
208      expect(gDeviceList.length).assertEqual(-1);
209      return
210    }
211
212    if (gDeviceList[0].configs.length == 0) {
213      console.info('usb 01 case current device.configs.length = 0');
214      expect(false).assertTrue();
215      return
216    }
217
218    for (var j = 0; j < gDeviceList[0].configs.length; j++) {
219      if (gDeviceList[0].configs[j].interfaces.length == 0) {
220        console.info('usb case current device.configs.interfaces.length = 0');
221      }
222      for (var k = 0; k < gDeviceList[0].configs[j].interfaces.length; k++) {
223        var isClaim = usb.claimInterface(gPipe, gDeviceList[0].configs[j].interfaces[k], true)
224        console.info('usb case claimInterface function return: ' + isClaim);
225        expect(isClaim).assertEqual(0);
226        if (isClaim == 0) {
227          isClaim = usb.releaseInterface(gPipe, gDeviceList[0].configs[j].interfaces[k])
228          console.info('usb case releaseInterface function return: ' + isClaim);
229          expect(isClaim).assertEqual(0);
230          gPipe = usb.connectDevice(gDeviceList[0])
231        }
232      }
233    }
234
235    console.info('usb claim_interface_test_01 :  PASS');
236    expect(true).assertTrue();
237  })
238
239  function getTransferParam(iCmd, iReqType, iValue, iIndex) {
240    var tmpUint8Array = new Uint8Array(512);
241    var requestCmd = iCmd
242    var requestType = iReqType
243    var value = iValue;
244    var index = iIndex;
245    var controlParam = {
246      request: requestCmd,
247      reqType: requestType,
248      value: value,
249      index: index,
250      data: tmpUint8Array
251    }
252    return controlParam
253  }
254
255  /**
256   * @tc.number    : SUB_USB_set_configuration_test_01
257   * @tc.name      : setConfiguration
258   * @tc.desc      : 设置设备接口
259   */
260  it('SUB_USB_set_configuration_test_01', 0, function () {
261    console.info('usb set_configuration_test_01 begin');
262    if (gDeviceList.length == 0) {
263      console.info('usb case get_device_list is null')
264      expect(false).assertTrue();
265      return
266    }
267
268    gPipe = usb.connectDevice(gDeviceList[0])
269    for (var j = 0; j < gDeviceList[0].configs.length; j++) {
270      var ret = usb.setConfiguration(gPipe, gDeviceList[0].configs[j])
271      console.info('usb case setConfiguration return : ' + ret);
272      expect(ret).assertEqual(0);
273    }
274
275    console.info('usb set_configuration_test_01 :  PASS');
276    expect(true).assertTrue();
277  })
278
279  /**
280   * @tc.number    : SUB_USB_set_configuration_test_02
281   * @tc.name      : setConfiguration
282   * @tc.desc      : 反向测试 设置设备接口
283   */
284  it('SUB_USB_set_configuration_test_02', 0, function () {
285    console.info('usb set_configuration_test_02 begin');
286    if (gDeviceList.length == 0) {
287      console.info('usb case get_device_list is null')
288      expect(false).assertTrue();
289      return
290    }
291
292    for (var j = 0; j < gDeviceList[0].configs.length; j++) {
293      var config = JSON.parse(JSON.stringify(gDeviceList[0].configs[j]));
294      config.id = 255
295      var ret = usb.setConfiguration(gPipe, config)
296      console.info('usb case setConfiguration return : ' + ret);
297      expect(ret).assertLess(0);
298    }
299
300    console.info('usb set_configuration_test_02 :  PASS');
301  })
302
303  /**
304   * @tc.number    : SUB_USB_set_interface_test_01
305   * @tc.name      : setInterface
306   * @tc.desc      : 设置设备接口
307   */
308  it('SUB_USB_set_interface_test_01', 0, function () {
309    console.info('usb set_interface_test_01 begin');
310    if (gDeviceList.length == 0) {
311      console.info('usb case get_device_list is null')
312      expect(false).assertTrue();
313      return
314    }
315
316    for (var j = 0; j < gDeviceList[0].configs.length; j++) {
317      var isClaim = usb.claimInterface(gPipe, gDeviceList[0].configs[j].interfaces[0], true)
318      expect(isClaim).assertEqual(0)
319      if (isClaim == 0) {
320        var ret = usb.setInterface(gPipe, gDeviceList[0].configs[j].interfaces[0])
321        expect(ret).assertEqual(0);
322        console.info('usb case setInterface return : ' + ret);
323      }
324    }
325
326    console.info('usb set_interface_test_01 :  PASS');
327    expect(true).assertTrue();
328  })
329
330  /**
331   * @tc.number    : SUB_USB_set_interface_test_02
332   * @tc.name      : setInterface
333   * @tc.desc      : 反向测试 设置设备接口
334   */
335  it('SUB_USB_set_interface_test_02', 0, function () {
336    console.info('usb set_interface_test_02 begin');
337    if (gDeviceList.length == 0) {
338      console.info('usb case get_device_list is null')
339      expect(false).assertTrue()
340      return
341    }
342
343    for (var j = 0; j < gDeviceList[0].configs.length; j++) {
344      var isClaim = usb.claimInterface(gPipe, gDeviceList[0].configs[j].interfaces[0], true)
345      expect(isClaim).assertEqual(0)
346      if (isClaim == 0) {
347        var tmpInterface = JSON.parse(JSON.stringify(gDeviceList[0].configs[j].interfaces[0]));
348        tmpInterface.id = 234
349        var ret = usb.setInterface(gPipe, tmpInterface)
350        expect(ret).assertLess(0)
351        console.info('usb case setInterface return : ' + ret)
352      }
353    }
354
355    console.info('usb set_interface_test_02 :  PASS');
356    expect(true).assertTrue();
357  })
358
359  function callControlTransfer(pip, controlParam, timeout, caseName) {
360    usb.controlTransfer(pip, controlParam, timeout).then(data => {
361      console.info('usb controlTransfer ret data : ' + data + ' ' + caseName);
362      console.info('usb controlTransfer controlParam.data buffer : ' + controlParam.data + ' ' + caseName);
363      console.info('usb' + caseName + ':  PASS');
364      expect(true).assertTrue();
365    }).catch(error => {
366      console.info('usb controlTransfer error : ' + JSON.stringify(error));
367      console.info('usb' + caseName + ':  PASS');
368      expect(false).assertTrue();
369    });
370  }
371
372  /**
373   * @tc.number    : SUB_USB_control_transfer_test_01
374   * @tc.name      : controlTransfer
375   * @tc.desc      : 控制传输 GetDescriptor: cmd 6 reqType 128 value 512 index 0
376   */
377  it('SUB_USB_control_transfer_test_01', 0, function () {
378    console.info('usb control_transfer_test_01 begin');
379    var testParam = getTransferTestParam()
380    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
381      expect(false).assertTrue();
382      return
383    }
384
385    var timeout = 5000;
386    var controlParam = getTransferParam(6, (usb.USB_REQUEST_DIR_FROM_DEVICE)
387        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_DEVICE & 0x1f), (2 << 8), 0)
388    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_01 GetDescriptor')
389  })
390
391  /**
392   * @tc.number    : SUB_USB_control_transfer_test_02
393   * @tc.name      : controlTransfer
394   * @tc.desc      : 控制传输 GetStatus: cmd 0 reqType 128 value 0 index 0
395   */
396  it('SUB_USB_control_transfer_test_02', 0, function () {
397    console.info('usb control_transfer_test_02 begin');
398    var testParam = getTransferTestParam()
399    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
400      expect(false).assertTrue();
401      return
402    }
403
404    var timeout = 5000;
405    var controlParam = getTransferParam(0, (usb.USB_REQUEST_DIR_FROM_DEVICE)
406        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_DEVICE & 0x1f), 0, 0)
407    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_02 GetStatus')
408  })
409
410  /**
411   * @tc.number    : SUB_USB_control_transfer_test_03
412   * @tc.name      : controlTransfer
413   * @tc.desc      : 控制传输 GetConfiguration: cmd 8 reqType 128 value 0 index 0
414   */
415  it('SUB_USB_control_transfer_test_03', 0, function () {
416    console.info('usb control_transfer_test_03 begin');
417    var testParam = getTransferTestParam()
418    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
419      expect(false).assertTrue();
420      return
421    }
422
423    var timeout = 5000;
424    var controlParam = getTransferParam(8, (usb.USB_REQUEST_DIR_FROM_DEVICE)
425        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_DEVICE & 0x1f), 0, 0)
426    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_03 GetConfiguration')
427  })
428
429  /**
430   * @tc.number    : SUB_USB_control_transfer_test_04
431   * @tc.name      : controlTransfer
432   * @tc.desc      : 控制传输 GetInterface: cmd 10 reqType 129 value 0 index 1
433   */
434  it('SUB_USB_control_transfer_test_04', 0, function () {
435    console.info('usb control_transfer_test_04 begin');
436    var testParam = getTransferTestParam()
437    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
438      expect(false).assertTrue();
439      return
440    }
441
442    var timeout = 5000;
443    var controlParam = getTransferParam(10, (usb.USB_REQUEST_DIR_FROM_DEVICE)
444        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_INTERFACE & 0x1f), 0, 1)
445    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_04 GetInterface')
446  })
447
448  /**
449   * @tc.number    : SUB_USB_control_transfer_test_05
450   * @tc.name      : controlTransfer
451   * @tc.desc      : 控制传输 ClearFeature: cmd 1 reqType 0 value 0 index 0
452   */
453  it('SUB_USB_control_transfer_test_05', 0, function () {
454    console.info('usb control_transfer_test_05 begin');
455    var testParam = getTransferTestParam()
456    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
457      expect(false).assertTrue();
458      return
459    }
460
461    var timeout = 5000;
462    var controlParam = getTransferParam(1, (usb.USB_REQUEST_DIR_TO_DEVICE)
463        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_DEVICE & 0x1f), 0, 0)
464    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_05 ClearFeature')
465  })
466
467  /**
468   * @tc.number    : SUB_USB_control_transfer_test_06
469   * @tc.name      : controlTransfer
470   * @tc.desc      : 控制传输 ClearFeature: cmd 1 reqType 0 value 0 index 0
471   */
472   it('SUB_USB_control_transfer_test_06', 0, function () {
473    console.info('usb control_transfer_test_06 begin');
474    var testParam = getTransferTestParam()
475    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
476      expect(false).assertTrue();
477      return
478    }
479
480    var timeout = 5000;
481    var controlParam = getTransferParam(255, (usb.USB_REQUEST_DIR_FROM_DEVICE)
482        | (usb.USB_REQUEST_TYPE_STANDARD << 5) | (usb.USB_REQUEST_TARGET_INTERFACE & 0x1f), (2 << 8), 0)
483    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_06 ClearFeature')
484  })
485
486  /**
487   * @tc.number    : SUB_USB_control_transfer_test_07
488   * @tc.name      : controlTransfer
489   * @tc.desc      : 控制传输 ClearFeature: cmd 1 reqType 0 value 0 index 0
490   */
491   it('SUB_USB_control_transfer_test_07', 0, function () {
492    console.info('usb control_transfer_test_07 begin');
493    var testParam = getTransferTestParam()
494    if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
495      expect(false).assertTrue();
496      return
497    }
498
499    var timeout = 5000;
500    var controlParam = getTransferParam(255, (usb.USB_REQUEST_DIR_TO_DEVICE)
501        | (usb.USB_REQUEST_TYPE_CLASS << 5) | (usb.USB_REQUEST_TARGET_ENDPOINT & 0x1f), (2 << 8), 0)
502    callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_07 ClearFeature')
503  })
504
505  /**
506   * @tc.number    : SUB_USB_control_transfer_test_08
507   * @tc.name      : controlTransfer
508   * @tc.desc      : 控制传输 ClearFeature: cmd 1 reqType 0 value 0 index 0
509   */
510    it('SUB_USB_control_transfer_test_08', 0, function () {
511      console.info('usb control_transfer_test_08 begin');
512      var testParam = getTransferTestParam()
513      if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
514        expect(false).assertTrue();
515        return
516      }
517
518      var timeout = 5000;
519      var controlParam = getTransferParam(255, (usb.USB_REQUEST_DIR_TO_DEVICE)
520          | (usb.USB_REQUEST_TYPE_VENDOR << 5) | (usb.USB_REQUEST_TARGET_OTHER & 0x1f), (2 << 8), 0)
521      callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_08 ClearFeature')
522    })
523
524  /**
525   * @tc.number    : SUB_USB_control_transfer_test_09
526   * @tc.name      : controlTransfer
527   * @tc.desc      : 控制传输 ClearFeature: cmd 1 reqType 0 value 0 index 0
528   */
529      it('SUB_USB_control_transfer_test_09', 0, function () {
530        console.info('usb control_transfer_test_09 begin');
531        var testParam = getTransferTestParam()
532        if (testParam.inEndpoint == null || testParam.interface == null || testParam.outEndpoint == null) {
533          expect(false).assertTrue();
534          return
535        }
536
537        var timeout = 5000;
538        var controlParam = getTransferParam(255, (usb.USB_REQUEST_DIR_TO_DEVICE)
539            | (usb.USB_REQUEST_TYPE_CLASS << 5) | (usb.USB_REQUEST_TARGET_OTHER & 0x1f), 0, 0)
540        callControlTransfer(testParam.pip, controlParam, timeout, 'control_transfer_test_09 ClearFeature')
541      })
542
543})
544