/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import usb from '@ohos.usb';
import CheckEmptyUtils from './CheckEmptyUtils.js';
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'


/* usb core functions test */
describe('UsbCoreJsFunctionsTestEx', function () {
  var gDeviceList
  beforeAll(function () {
    console.log('*************Usb Unit UsbCoreJsFunctionsTestEx Begin*************');
    var Version = usb.getVersion()
    console.info('begin test getversion :' + Version)
    // version > 17  host currentMode = 2 device currentMode = 1
    var usbPortList = usb.getPorts()
    if (usbPortList.length > 0) {
      if (usbPortList[0].status.currentMode == 1) {
        usb.setPortRoles(usbPortList[0].id, usb.SOURCE, usb.HOST).then(data => {
          console.info('usb case setPortRolesEx return: ' + data);
        }).catch(error => {
          console.info('usb case setPortRolesEx error : ' + error);
        });
        console.log('*************Usb Unit Begin switch to host*************');
      }
    }
    gDeviceList = usb.getDevices();
  })
  beforeEach(function () {
    console.info('beforeEach: *************Usb Unit Test CaseEx*************');
  })
  afterEach(function () {
    console.info('afterEach: *************Usb Unit Test CaseEx*************');
  })
  afterAll(function () {
    console.log('*************Usb Unit UsbCoreJsFunctionsTestEx End*************');
  })


  /**
   * @tc.number    : SUB_USB_connect_device_02
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 错误参数 devAddress 打开设备
   */
  it('SUB_USB_connect_device_02', 0, function () {
    console.info('usb connect_device_02 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 02 requestRight error:' + error);
      });
      console.info('usb 02 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.devAddress = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' devAddress ' + device.devAddress);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertTrue();

    console.info('usb connect_device_02 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_03
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 busNum错误参数 打开设备
   */
  it('SUB_USB_connect_device_03', 0, function () {
    console.info('usb connect_device_03 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 03 requestRight error:' + error);
      });
      console.info('usb 03 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.busNum = 2 + 1000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' busNum ' + device.busNum);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertTrue();
    console.info('usb connect_device_03 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_04
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 serial错误参数 打开设备
   */
  it('SUB_USB_connect_device_04', 0, function () {
    console.info('usb connect_device_04 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 04 requestRight error:' + error);
      });
      console.info('usb 04 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.serial = 'asdfsd'
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' serial ' + device.serial);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_04 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_05
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 name错误参数 打开设备
   */
  it('SUB_USB_connect_device_05', 0, function () {
    console.info('usb connect_device_05 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 05 requestRight error:' + error);
      });
      console.info('usb 05 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.name = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) + ' name ' + device.name);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_05 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_06
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 manufacturerName错误参数 打开设备
   */
  it('SUB_USB_connect_device_06', 0, function () {
    console.info('usb connect_device_06 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 06 requestRight error:' + error);
      });
      console.info('usb 06 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.manufacturerName = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' manufacturerName ' + device.manufacturerName);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_06 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_07
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 productName错误参数 打开设备
   */
  it('SUB_USB_connect_device_07', 0, function () {
    console.info('usb connect_device_07 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 07 requestRight error:' + error);
      });
      console.info('usb 07 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.productName = 'sdfsdfe'
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' productName ' + device.productName);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_07 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_08
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 version错误参数 打开设备
   */
  it('SUB_USB_connect_device_08', 0, function () {
    console.info('usb connect_device_08 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 08 requestRight error:' + error);
      });
      console.info('usb 08 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.version = 'gwefsdf'
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' version ' + device.version);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_08 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_09
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 vendorId错误参数 打开设备
   */
  it('SUB_USB_connect_device_09', 0, function () {
    console.info('usb connect_device_09 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 09 requestRight error:' + error);
      });
      console.info('usb 09 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.vendorId = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' vendorId ' + device.vendorId);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_09 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_10
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 productId错误参数 打开设备
   */
  it('SUB_USB_connect_device_10', 0, function () {
    console.info('usb connect_device_10 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 10 requestRight error:' + error);
      });
      console.info('usb 10 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.productId = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) +
      ' productId ' + device.productId);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_10 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_11
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 clazz错误参数 打开设备
   */
  it('SUB_USB_connect_device_11', 0, function () {
    console.info('usb connect_device_11 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 11 requestRight error:' + error);
      });
      console.info('usb 11 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.clazz = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) + ' clazz ' + device.clazz);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_11 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_12
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 subclass错误参数 打开设备
   */
  it('SUB_USB_connect_device_12', 0, function () {
    console.info('usb connect_device_12 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 12 requestRight error:' + error);
      });
      console.info('usb 12 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.subclass = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) + ' subclass ' + device.subclass);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_12 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_connect_device_13
   * @tc.name      : connectDevice
   * @tc.desc      : 反向测试 protocol错误参数 打开设备
   */
  it('SUB_USB_connect_device_13', 0, function () {
    console.info('usb connect_device_13 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }
    var isRight = usb.hasRight(gDeviceList[0].name);
    if (!isRight) {
      usb.requestRight(gDeviceList[0].name).then(hasRight => {
      }).catch(error => {
        console.info('usb 13 requestRight error:' + error);
      });
      console.info('usb 13 requestRight end:');
      CheckEmptyUtils.sleep(3000)
    }

    var device = JSON.parse(JSON.stringify(gDeviceList[0]));
    device.protocol = 2 + 10000
    try {
      var usbDevicePipe = usb.connectDevice(device)
    } catch (err) {
      expect(true).assertTrue();
      console.info('usb connectDevice fail:' + err);
    }
    console.info('usb case connectDevice ret: ' + JSON.stringify(usbDevicePipe) + ' protocol ' + device.protocol);
    expect(CheckEmptyUtils.isEmpty(usbDevicePipe)).assertFalse();
    var isPipClose = usb.closePipe(usbDevicePipe);
    console.info('usb case closePipe ret: ' + isPipClose);
    expect(isPipClose).assertEqual(0);
    console.info('usb connect_device_13 :  PASS');
  })

  /**
   * @tc.number    : SUB_USB_has_right_02
   * @tc.name      : hasRight
   * @tc.desc      : 反向测试 给错误设备名字
   */
  it('SUB_USB_has_right_02', 0, function () {
    console.info('usb has_right_02 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }

    for (var i = 0; i < gDeviceList.length; i++) {
      var deviceName = gDeviceList[i].name
      deviceName = deviceName + '$#'
      var hasRight = usb.hasRight(deviceName)
      console.info('usb has_right ret :' + hasRight);
      expect(hasRight == false).assertTrue();
    }

    console.info('usb has_right_02 :  PASS');
    expect(true).assertTrue();
  })

  /**
   * @tc.number    : SUB_USB_has_right_03
   * @tc.name      : hasRight
   * @tc.desc      : 反向测试 给设备名字为字母
   */
  it('SUB_USB_has_right_03', 0, function () {
    console.info('usb has_right_03 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }

    for (var i = 0; i < gDeviceList.length; i++) {
      var deviceName = gDeviceList[i].name
      deviceName = deviceName + 'abcdg'
      var hasRight = usb.hasRight(deviceName)
      console.info('usb hasRight ret :' + hasRight);
      expect(hasRight == false).assertTrue();
    }

    console.info('usb has_right_03 :  PASS');
    expect(true).assertTrue();
  })

  /**
   * @tc.number    : SUB_USB_request_right_02
   * @tc.name      : requestRight
   * @tc.desc      : 反向测试 错误设备名字 请求权限
   */
  it('SUB_USB_request_right_02', 0, function () {
    console.info('usb request_right_02 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }

    for (var i = 0; i < gDeviceList.length; i++) {
      var diviceName = gDeviceList[i].name
      diviceName = diviceName + '@#'
      usb.requestRight(diviceName).then(hasRight => {
        console.info('usb request_right ret :' + hasRight);
        expect(hasRight).assertFalse();
        console.info('usb request_right_02 :  PASS');
      }).catch(error => {
        expect(error).assertFalse();
        console.info('usb request_right_02 error: ' + error);
      });
    }
  })

  /**
   * @tc.number    : SUB_USB_request_right_03
   * @tc.name      : requestRight
   * @tc.desc      : 反向测试 设备名字为数字 请求权限
   */
  it('SUB_USB_request_right_03', 0, function () {
    console.info('usb request_right_03 begin');
    if (gDeviceList.length == 0) {
      console.info('usb case get_device_list is null')
      expect(false).assertTrue();
      return
    }

    for (var i = 0; i < gDeviceList.length; i++) {
      var diviceName = gDeviceList[i].name
      diviceName = diviceName + '123'
      usb.requestRight(diviceName).then(hasRight => {
        console.info('usb request_right ret :' + hasRight);
        expect(hasRight).assertFalse();
        console.info('usb request_right_03 :  PASS');
      }).catch(error => {
        expect(error).assertFalse();
        console.info('usb request_right_03 error: ' + error);
      });
    }
  })
})