// Copyright 2021 The Pigweed Authors
//
// 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
//
//     https://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.

/* eslint-env browser, jasmine */
import 'jasmine';

import {
  PacketType,
  RpcPacket,
} from 'packet_proto_tspb/packet_proto_tspb_pb/pw_rpc/internal/packet_pb';
import {Status} from '@pigweed/pw_status';

import * as packets from './packets';

function addTestData(packet: RpcPacket) {
  const payload = new RpcPacket();
  payload.setStatus(321);
  packet.setChannelId(1);
  packet.setServiceId(2);
  packet.setMethodId(3);
  packet.setPayload(payload.serializeBinary());
}

describe('Packets', () => {
  beforeEach(() => {});

  it('encodeRequest sets packet fields', () => {
    const goldenRequest = new RpcPacket();
    goldenRequest.setType(PacketType.REQUEST);
    addTestData(goldenRequest);

    const dataPacket = new RpcPacket();
    dataPacket.setStatus(321);
    const data = packets.encodeRequest([1, 2, 3], dataPacket);
    const packet = RpcPacket.deserializeBinary(data);

    expect(packet.toObject()).toEqual(goldenRequest.toObject());
  });

  it('encodeResponse sets packet fields', () => {
    const goldenResponse = new RpcPacket();
    goldenResponse.setType(PacketType.RESPONSE);
    addTestData(goldenResponse);

    const dataPacket = new RpcPacket();
    dataPacket.setStatus(321);
    const data = packets.encodeResponse([1, 2, 3], dataPacket);
    const packet = RpcPacket.deserializeBinary(data);

    expect(packet.toObject()).toEqual(goldenResponse.toObject());
  });

  it('encodesClientError sets packet fields', () => {
    const packet = new RpcPacket();
    packet.setType(PacketType.REQUEST);
    addTestData(packet);
    const data = packets.encodeClientError(packet, Status.NOT_FOUND);
    const errorPacket = RpcPacket.deserializeBinary(data);

    const golden = new RpcPacket();
    golden.setType(PacketType.CLIENT_ERROR);
    golden.setChannelId(1);
    golden.setServiceId(2);
    golden.setMethodId(3);
    golden.setStatus(Status.NOT_FOUND);

    expect(errorPacket.toObject()).toEqual(golden.toObject());
  });

  it('encodeCancel sets packet fields', () => {
    const goldenCancel = new RpcPacket();
    goldenCancel.setType(PacketType.CLIENT_ERROR);
    goldenCancel.setStatus(Status.CANCELLED);
    goldenCancel.setChannelId(1);
    goldenCancel.setServiceId(2);
    goldenCancel.setMethodId(3);

    const data = packets.encodeCancel([1, 2, 3]);
    const packet = RpcPacket.deserializeBinary(data);
    expect(packet.toObject()).toEqual(goldenCancel.toObject());
  });

  it('decode with serialized request returns request', () => {
    const request = new RpcPacket();
    request.setType(PacketType.REQUEST);
    addTestData(request);

    expect(request.toObject()).toEqual(
      packets.decode(request.serializeBinary()).toObject()
    );
  });

  it('forServer correctly handles RESPONSE and REQUEST types', () => {
    const request = new RpcPacket();
    request.setType(PacketType.REQUEST);
    const response = new RpcPacket();
    response.setType(PacketType.RESPONSE);

    expect(packets.forServer(request)).toBeTrue();
    expect(packets.forServer(response)).toBeFalse();
  });
});
