blob: 385084785eb0a7283c2033eb68abe15c7738c1b5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.ignite.gatling.check
import io.gatling.commons.validation.SuccessWrapper
import io.gatling.core.check.CheckBuilder
import io.gatling.core.check.CheckMaterializer
import io.gatling.core.check.CountCriterionExtractor
import io.gatling.core.check.Extractor
import io.gatling.core.check.FindAllCriterionExtractor
import io.gatling.core.check.FindCriterionExtractor
import io.gatling.core.check.Preparer
import io.gatling.core.session.Expression
import io.gatling.core.session.ExpressionSuccessWrapper
/**
* Support checks for the Ignite key-value operations results represented as a list of entries.
*/
trait IgniteKeyValueEntriesCheckSupport extends IgniteKeyValueCheckSupport {
/**
* Check of Key-Value operation result represented as a list of entries.
*/
trait EntriesCheckType
/**
* Type of key-value operation entry.
*
* @tparam K Type of the cache key.
* @tparam V Type of the operation result.
* @param key Key.
* @param value Result.
*/
case class Entry[K, V](key: K, value: V)
/**
* Type of the ignite key-value operation result prepared for check input.
*
* @tparam K Type of the cache key.
* @tparam V Type of the operation result.
*/
type EntriesResult[K, V] = Seq[Entry[K, V]]
/**
* Materializer for Ignite key-value result check.
*
* Transform the raw response (which is a map) into sequence of entries which will be used as an input for check.
*
* @tparam K Type of the cache key.
* @tparam V Type of the operation result.
*/
class EntriesCheckMaterializer[K, V]
extends CheckMaterializer[EntriesCheckType, IgniteCheck[K, V], RawResult[K, V], EntriesResult[K, V]](specializer = identity) {
/**
* @return Preparer which converts map to list of entries.
*/
override protected def preparer: Preparer[RawResult[K, V], EntriesResult[K, V]] = _.filter { case (_, v) =>
v != null
}.toList.map(e => Entry(e._1, e._2)).success
}
/**
* @tparam K Type of the cache key.
* @tparam V Type of the operation result.
* @return Implicit materiolizer for Ignite key-value result check.
*/
implicit def entriesCheckMaterializer[K, V]: EntriesCheckMaterializer[K, V] = new EntriesCheckMaterializer[K, V]
/**
* Builder for the Ignite key-value operations result check exposed as an `entries` DSL function.
*
* @tparam K Type of the cache key.
* @tparam V Type of the operation result.
* @return Ignite check builder.
*/
def entries[K, V]: CheckBuilder.MultipleFind.Default[EntriesCheckType, EntriesResult[K, V], Entry[K, V]] =
new CheckBuilder.MultipleFind.Default[EntriesCheckType, EntriesResult[K, V], Entry[K, V]](displayActualValue = true) {
override protected def findExtractor(occurrence: Int): Expression[Extractor[EntriesResult[K, V], Entry[K, V]]] =
new FindCriterionExtractor[EntriesResult[K, V], Int, Entry[K, V]](
"entry",
occurrence,
occurrence,
p => p.drop(occurrence).headOption.success
).expressionSuccess
override protected def findAllExtractor: Expression[Extractor[EntriesResult[K, V], Seq[Entry[K, V]]]] =
new FindAllCriterionExtractor[EntriesResult[K, V], Int, Entry[K, V]](
"entry",
0,
p => Some(p).success
).expressionSuccess
override protected def countExtractor: Expression[Extractor[EntriesResult[K, V], Int]] =
new CountCriterionExtractor[EntriesResult[K, V], Int](
"entry",
0,
p => Some(p.size).success
).expressionSuccess
}
}