// Copyright 2024 Google Inc. All rights reserved.
//
// 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
//
//     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 cc

import (
	"android/soong/android"
	"testing"
)

func TestSabi(t *testing.T) {
	bp := `
		cc_library {
			name: "libsabi",
			srcs: ["sabi.cpp"],
			static_libs: ["libdirect"],
			header_abi_checker: {
				enabled: true,
				symbol_file: "libsabi.map.txt",
                ref_dump_dirs: ["abi-dumps"],
			},
		}

		cc_library {
			name: "libdirect",
			srcs: ["direct.cpp"],
			whole_static_libs: ["libtransitive"],
		}

		cc_library {
			name: "libtransitive",
			srcs: ["transitive.cpp"],
		}
	`

	result := android.GroupFixturePreparers(
		PrepareForTestWithCcDefaultModules,
	).RunTestWithBp(t, bp)

	libsabiStatic := result.ModuleForTests("libsabi", "android_arm64_armv8-a_static_sabi")
	sabiObjSDump := libsabiStatic.Output("obj/sabi.sdump")

	libDirect := result.ModuleForTests("libdirect", "android_arm64_armv8-a_static_sabi")
	directObjSDump := libDirect.Output("obj/direct.sdump")

	libTransitive := result.ModuleForTests("libtransitive", "android_arm64_armv8-a_static_sabi")
	transitiveObjSDump := libTransitive.Output("obj/transitive.sdump")

	libsabiShared := result.ModuleForTests("libsabi", "android_arm64_armv8-a_shared")
	sabiLink := libsabiShared.Rule("sAbiLink")

	android.AssertStringListContains(t, "sabi link inputs", sabiLink.Inputs.Strings(), sabiObjSDump.Output.String())
	android.AssertStringListContains(t, "sabi link inputs", sabiLink.Inputs.Strings(), directObjSDump.Output.String())
	android.AssertStringListContains(t, "sabi link inputs", sabiLink.Inputs.Strings(), transitiveObjSDump.Output.String())
}
