// Copyright 2026 The BoringSSL 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.

package runner

func addServerPaddingTests() {
	// Base server padding test: shim request padding, runner sends padding.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-ExpectPadding",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(10)),
			},
		},
		flags: []string{
			"-request-server-padding", "10",
			"-expect-server-sent-requested-padding",
		},
	})
	// Test that padding of 0 works.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-ZeroPaddingRequested",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(0)),
			},
		},
		flags: []string{
			"-request-server-padding", "0",
			"-expect-server-sent-requested-padding",
		},
	})
	// Test that padding of 16k works.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-16kPadding",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(16384)),
			},
		},
		flags: []string{
			"-request-server-padding", "16384",
			"-expect-server-sent-requested-padding",
		},
	})
	// Server sends less than requested padding; should fail the
	// connection.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-NotEnoughPadding",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(5)),
			},
		},
		flags: []string{
			"-request-server-padding", "10",
		},
		shouldFail:         true,
		expectedError:      ":DECODE_ERROR:",
		expectedLocalError: "remote error: error decoding message",
	})
	// Server sends more than requested padding; should fail the
	// connection.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-TooMuchPadding",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(50)),
			},
		},
		flags: []string{
			"-request-server-padding", "10",
		},
		shouldFail:         true,
		expectedError:      ":DECODE_ERROR:",
		expectedLocalError: "remote error: error decoding message",
	})
	// Test server not sending padding in response to a padding request; should
	// not fail connection but also should not be counted as server sent correct
	// amount of padding.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-NoPaddingSent",
		testType: clientTest,
		config: Config{
			MinVersion: VersionTLS13,
		},
		flags: []string{
			"-request-server-padding", "10",
		},
	})
	// TLS 1.2 connection should send no padding back without error.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-TLS12-NoPadding",
		testType: clientTest,
		config: Config{
			MaxVersion: VersionTLS12,
		},
		flags: []string{
			"-request-server-padding", "10",
		},
	})
	// TLS 1.2 connection sending padding should result in a failed connection.
	testCases = append(testCases, testCase{
		name:     "ServerPadding-TLS12-PaddingSent",
		testType: clientTest,
		config: Config{
			MaxVersion: VersionTLS12,
			Bugs: ProtocolBugs{
				SendServerPaddingLength: new(uint16(10)),
			},
		},
		flags: []string{
			"-request-server-padding", "10",
		},
		shouldFail:         true,
		expectedError:      ":UNEXPECTED_EXTENSION:",
		expectedLocalError: "remote error: unsupported extension",
	})

	// Base test; runner doesn't ask for padding, shim doesn't send padding.
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-NotRequested",
		testType: serverTest,
		config: Config{
			MinVersion: VersionTLS13,
		},
	})
	// Shim doesn't support padding.
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-NoServerSupport",
		testType: serverTest,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(10)),
		},
	})
	// Runner requests padding, shim sends padding.
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-BasicPadding",
		testType: serverTest,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(10)),
			Bugs: ProtocolBugs{
				ExpectedServerPadding: true,
			},
		},
		flags: []string{
			"-server-supports-padding",
		},
	})
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-ZeroPadding",
		testType: serverTest,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(0)),
			Bugs: ProtocolBugs{
				ExpectedServerPadding: true,
			},
		},
		flags: []string{
			"-server-supports-padding",
		},
	})
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-16kPadding",
		testType: serverTest,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(16384)),
			Bugs: ProtocolBugs{
				ExpectedServerPadding: true,
			},
		},
		flags: []string{
			"-server-supports-padding",
		},
	})
	// Runner request over the max amount of padding, server responds without
	// padding extension.
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-OverMax",
		testType: serverTest,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(16385)),
		},
		flags: []string{
			"-server-supports-padding",
		},
	})
	// Runner requests padding but with TLS 1.2 connection. Connection should
	// not fail, but no padding extension should be expected.
	testCases = append(testCases, testCase{
		name:     "ServerPaddingServer-TLS12",
		testType: serverTest,
		config: Config{
			MaxVersion:           VersionTLS12,
			RequestServerPadding: new(uint16(1024)),
		},
		flags: []string{
			"-server-supports-padding",
		},
	})

	// Runner requests padding, and then does a resumption handshake. Shim should
	// send server padding on initial handshake, but not resumption handshake.
	testCases = append(testCases, testCase{
		name:          "ServerPaddingServer-ResumeSession",
		testType:      serverTest,
		resumeSession: true,
		config: Config{
			MinVersion:           VersionTLS13,
			RequestServerPadding: new(uint16(10)),
			Bugs: ProtocolBugs{
				ExpectedServerPadding: true,
			},
		},
		flags: []string{
			"-server-supports-padding",
		},
	})
}
