/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * 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.
 */

#include "library_namespaces.h"

#include "android-base/result-gmock.h"
#include "gtest/gtest.h"
#include "public_libraries.h"

namespace android {
namespace nativeloader {
namespace {

using ::android::base::testing::HasError;
using ::android::base::testing::HasValue;
using ::android::base::testing::WithMessage;
using ::testing::StartsWith;

static ApiDomain GetProductApiDomain(ApiDomain fallback_domain) {
  // GetApiDomainFromPath returns API_DOMAIN_PRODUCT only if the device is
  // trebleized and has an unbundled product partition.
  return is_product_treblelized() ? API_DOMAIN_PRODUCT : fallback_domain;
}

TEST(LibraryNamespacesTest, TestGetApiDomainFromPath) {
  EXPECT_EQ(GetApiDomainFromPath("/data/somewhere"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/system/somewhere"), API_DOMAIN_SYSTEM);
  EXPECT_EQ(GetApiDomainFromPath("/system_ext/somewhere"), API_DOMAIN_SYSTEM);
  EXPECT_EQ(GetApiDomainFromPath("/systemext/somewhere"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/product/somewhere"), GetProductApiDomain(API_DOMAIN_DEFAULT));
  EXPECT_EQ(GetApiDomainFromPath("/vendor/somewhere"), API_DOMAIN_VENDOR);
  EXPECT_EQ(GetApiDomainFromPath("/system/product/somewhere"),
            GetProductApiDomain(API_DOMAIN_SYSTEM));
  EXPECT_EQ(GetApiDomainFromPath("/system/vendor/somewhere"), API_DOMAIN_VENDOR);

  EXPECT_EQ(GetApiDomainFromPath(""), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("product/somewhere"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/product"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/product/"), GetProductApiDomain(API_DOMAIN_DEFAULT));
  EXPECT_EQ(GetApiDomainFromPath(":/product/"), API_DOMAIN_DEFAULT);

  EXPECT_EQ(GetApiDomainFromPath("/data/somewhere:/product/somewhere"), API_DOMAIN_DEFAULT);
  EXPECT_EQ(GetApiDomainFromPath("/vendor/somewhere:/product/somewhere"), API_DOMAIN_VENDOR);
  EXPECT_EQ(GetApiDomainFromPath("/product/somewhere:/vendor/somewhere"),
            GetProductApiDomain(API_DOMAIN_DEFAULT));
}

TEST(LibraryNamespacesTest, TestGetApiDomainFromPathList) {
  EXPECT_THAT(GetApiDomainFromPathList("/data/somewhere"), HasValue(API_DOMAIN_DEFAULT));
  EXPECT_THAT(GetApiDomainFromPathList("/system/somewhere"), HasValue(API_DOMAIN_DEFAULT));
  EXPECT_THAT(GetApiDomainFromPathList("/system_ext/somewhere"), HasValue(API_DOMAIN_DEFAULT));
  EXPECT_THAT(GetApiDomainFromPathList("/product/somewhere"),
              HasValue(GetProductApiDomain(API_DOMAIN_DEFAULT)));
  EXPECT_THAT(GetApiDomainFromPathList("/vendor/somewhere"), HasValue(API_DOMAIN_VENDOR));
  EXPECT_THAT(GetApiDomainFromPathList("/system/product/somewhere"),
              HasValue(GetProductApiDomain(API_DOMAIN_DEFAULT)));
  EXPECT_THAT(GetApiDomainFromPathList("/system/vendor/somewhere"), HasValue(API_DOMAIN_VENDOR));

  EXPECT_THAT(GetApiDomainFromPathList(""), HasValue(API_DOMAIN_DEFAULT));
  EXPECT_THAT(GetApiDomainFromPathList(":"), HasValue(API_DOMAIN_DEFAULT));
  EXPECT_THAT(GetApiDomainFromPathList(":/vendor/somewhere"), HasValue(API_DOMAIN_VENDOR));
  EXPECT_THAT(GetApiDomainFromPathList("/vendor/somewhere:"), HasValue(API_DOMAIN_VENDOR));

  EXPECT_THAT(GetApiDomainFromPathList("/data/somewhere:/product/somewhere"),
              HasValue(GetProductApiDomain(API_DOMAIN_DEFAULT)));
  EXPECT_THAT(GetApiDomainFromPathList("/system/somewhere:/product/somewhere"),
              HasValue(GetProductApiDomain(API_DOMAIN_DEFAULT)));
  EXPECT_THAT(GetApiDomainFromPathList("/product/somewhere:/system/somewhere"),
              HasValue(GetProductApiDomain(API_DOMAIN_DEFAULT)));
  EXPECT_THAT(GetApiDomainFromPathList("/data/somewhere:/vendor/somewhere"),
              HasValue(API_DOMAIN_VENDOR));
  EXPECT_THAT(GetApiDomainFromPathList("/system/somewhere:/vendor/somewhere"),
              HasValue(API_DOMAIN_VENDOR));
  EXPECT_THAT(GetApiDomainFromPathList("/vendor/somewhere:/system/somewhere"),
              HasValue(API_DOMAIN_VENDOR));

  if (GetProductApiDomain(API_DOMAIN_DEFAULT) == API_DOMAIN_PRODUCT) {
    EXPECT_THAT(
        GetApiDomainFromPathList("/vendor/somewhere:/product/somewhere"),
        HasError(WithMessage(StartsWith("Path list crosses vendor/product partition boundaries"))));
    EXPECT_THAT(
        GetApiDomainFromPathList("/system/somewhere:/product/somewhere:/vendor/somewhere"),
        HasError(WithMessage(StartsWith("Path list crosses vendor/product partition boundaries"))));
  }
}

}  // namespace
}  // namespace nativeloader
}  // namespace android
