CycloneTechnology/ChaMP

View on GitHub
champ-ipmi/src/it/scala/com/cyclone/ipmi/client/IpmiClientApiIntegrationTest.scala

Summary

Maintainability
A
0 mins
Test Coverage
package com.cyclone.ipmi.client

import akka.actor.ActorSystem
import akka.testkit.ImplicitSender
import com.cyclone.akka.{ActorSystemComponent, ActorSystemShutdown}
import com.cyclone.command.{OperationDeadline, TimeoutContext}
import com.cyclone.ipmi._
import com.cyclone.ipmi.command.chassis.GetChassisStatus
import com.cyclone.ipmi.protocol._
import com.cyclone.ipmi.protocol.rakp.RmcpPlusAndRakpStatusCodeErrors
import org.scalatest.{Inside, Matchers, WordSpecLike}
import scalaz.EitherT._
import scalaz.Scalaz._
import scalaz._

import scala.concurrent.duration._

/**
  * Integration test for the [[IpmiClient]] API
  */
class IpmiClientApiIntegrationTest
    extends BaseIntegrationTest
    with WordSpecLike
    with Matchers
    with Inside
    with ImplicitSender
    with ActorSystemShutdown {

  val versionRequirement = IpmiVersionRequirement.V20IfSupported

  class Fixture extends ActorIpmiClientComponent with TestIpmiManagerComponent with ActorSystemComponent {
    implicit val actorSystem: ActorSystem = system

    val connection = ipmiClient.connectionFor(host, port).futureValue

    implicit val timeoutContext: TimeoutContext = TimeoutContext(deadline = OperationDeadline.fromNow(10.seconds))
  }

  "an ipmi api" must {
    "allow creating a session" in new Fixture {
      connection.negotiateSession(credentials, versionRequirement).futureValue shouldBe ().right
    }

    "fail to create session e.g. when use wrong password" in new Fixture {
      connection
        .negotiateSession(IpmiCredentials("ADMIN", "ss"), versionRequirement)
        .futureValue shouldBe RmcpPlusAndRakpStatusCodeErrors.InvalidIntegrityCheckValue.left
    }

    "execute a command" in new Fixture {
      val r = for {
        _      <- eitherT(connection.negotiateSession(credentials, versionRequirement))
        result <- eitherT(connection.executeCommandOrError(GetChassisStatus.Command))
      } yield result

      inside(r.run.futureValue) {
        case \/-(x) => x shouldBe a[GetChassisStatus.CommandResult]
      }
    }
  }

  "closes session" in new Fixture {
    connection.closedown().futureValue shouldBe ()
  }
}