blob: 088821882244599ce62fe7bbf93aad4acfe024d2 [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.jmeter.protocol.http.sampler
import org.apache.jmeter.dsl.DslPrinterTraverser
import org.apache.jmeter.junit.JMeterTestCase
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui
import org.apache.jmeter.testelement.TestElement
import org.apache.jmeter.testelement.TestElementTraverser
import org.apache.jmeter.testelement.property.JMeterProperty
import org.apache.jmeter.treebuilder.dsl.testTree
import org.apache.jmeter.util.JMeterUtils
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.parallel.ResourceLock
import org.junit.jupiter.api.parallel.Resources
import java.util.Locale
@ResourceLock(value = Resources.LOCALE)
class HttpSamplerPrintDslTest : JMeterTestCase() {
companion object {
private var locale = JMeterUtils.getLocale()
@JvmStatic
@BeforeAll
fun setup() {
// Ensure DSL uses English text, otherwise we can't reliably compare expected values
JMeterUtils.setLocale(Locale.ENGLISH)
}
@JvmStatic
@AfterAll
fun tearDown() {
JMeterUtils.setLocale(locale)
}
}
object RemoveDefaultValues : TestElementTraverser {
private val elements = mutableListOf<TestElement>()
private val defaultProps = mutableListOf<MutableList<String>>()
override fun startTestElement(el: TestElement) {
elements += el
defaultProps += mutableListOf<String>()
}
override fun endTestElement(el: TestElement) {
val element = elements.removeLast()
for (propertyName in defaultProps.removeLast()) {
element.removeProperty(propertyName)
}
}
override fun startProperty(key: JMeterProperty) {
val element = elements.last()
val defaultProp = defaultProps.last()
element.schema.properties[key.name]?.let {
if (key.stringValue == it.defaultValueAsString) {
// We can't remove property here as it would break ongoing iterator
// So we remove properties in endTestElement instead
defaultProp += key.name
}
}
}
override fun endProperty(key: JMeterProperty) {
}
}
@Test
fun `http sampler created with UI`() {
val ui = HttpTestSampleGui()
val element = ui.createTestElement()
val tree = testTree {
+element
}
// "arguments" property is assigned in HTTPSamplerBase constructor, so it comes before
// name and guiClass common properties
assertEquals(
"""
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy::class {
props {
it[arguments] = org.apache.jmeter.config.Arguments().apply {
props {
it[name] = "User Defined Variables"
it[guiClass] = "org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel"
it[testClass] = "org.apache.jmeter.config.Arguments"
}
}
it[name] = "HTTP Request"
it[guiClass] = "org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui"
it[method] = "GET"
it[followRedirects] = true
it[useKeepalive] = true
}
}
""".trimIndent().replace("\r\n", "\n"),
DslPrinterTraverser().also { tree.traverse(it) }.toString().replace("\r\n", "\n"),
"HTTP request created with HttpTestSampleGui.createTestElement() should have expected output shape. " +
"DslPrinterTraverser does not print the values which are automatically assigned in constructor, " +
"so the expected output does not have it[testClass] = HTTPSamplerProxy, and empty list in arguments"
)
}
@Test
fun `http sampler created with DSL`() {
val createdWithUi = HttpTestSampleGui().createTestElement()
val createdWithDsl = testTree {
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy::class {
props {
it[arguments] = org.apache.jmeter.config.Arguments().apply {
props {
it[name] = "User Defined Variables"
it[guiClass] = "org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel"
it[testClass] = "org.apache.jmeter.config.Arguments"
}
}
it[name] = "HTTP Request"
it[guiClass] = "org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui"
it[method] = "GET"
it[followRedirects] = true
it[useKeepalive] = true
}
}
}.keys.first() as TestElement
// We compare elements manually, and call assertEquals(toString, toString) so
// the test output looks better (diff in IDE) in case of the failure
// If we use just assertEquals(createdWithUi, createdWithDsl), then there will be no "diff in IDE"
if (createdWithUi != createdWithDsl) {
val abc = createdWithDsl.equals(createdWithDsl)
assertEquals(
DslPrinterTraverser(DslPrinterTraverser.DetailLevel.ALL).append(createdWithUi).toString(),
DslPrinterTraverser(DslPrinterTraverser.DetailLevel.ALL).append(createdWithDsl).toString()
) {
"Elements created with UI and DSL should match since DSL was generated based on the UI-generated element"
}
}
}
@Test
fun `dsl for proxy`() {
val createdWithDsl = testTree {
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy::class {
props {
proxy {
it[host] = "proxyhost"
it[port] = 8080
it[username] = "username"
it[password] = "password"
}
}
}
}.keys.first() as TestElement
assertEquals(
"""
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy::class {
props {
it[proxy.host] = "proxyhost"
it[proxy.port] = 8080
it[proxy.username] = "username"
it[proxy.password] = "password"
}
}
""".trimIndent(),
DslPrinterTraverser().append(createdWithDsl).toString()
) {
"Proxy parameters added with a group should be printed with DslPrinterTraverser"
}
assertEquals(
"proxyhost",
createdWithDsl.getPropertyAsString("HTTPSampler.proxyHost"),
"""getPropertyAsString("HTTPSampler.proxyHost")"""
)
assertEquals(
8080,
createdWithDsl.getPropertyAsInt("HTTPSampler.proxyPort"),
"""getPropertyAsInt("HTTPSampler.proxyPort")"""
)
}
}