text: /*
   *
   *    Copyright (c) 2021 Project CHIP Authors
   *    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.
   */
  #include <lib/support/UnitTestRegistration.h>
  #include <protocols/bdx/BdxUri.h>
  
  #include <cstring>
  #include <nlunit-test.h>
  
  using namespace ::chip;
  
  namespace {
  
  CharSpan ToSpan(const char * str)
  {
      return CharSpan(str, strlen(str));
  }
  
  void TestParseURI(nlTestSuite * inSuite, void * inContext)
  {
      NodeId nodeId;
      CharSpan file;
  
      const auto parse = [&](const char * uri) { return bdx::ParseURI(ToSpan(uri), nodeId, file); };
  
      // Happy path
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/file_name") == CHIP_NO_ERROR);
      NL_TEST_ASSERT(inSuite, nodeId == 0x1234567890ABCDEFULL);
      NL_TEST_ASSERT(inSuite, file.data_equal(ToSpan("file_name")));
  
      // File designator may contain slashes
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/file/na/me") == CHIP_NO_ERROR);
      NL_TEST_ASSERT(inSuite, nodeId == 0x1234567890ABCDEFULL);
      NL_TEST_ASSERT(inSuite, file.data_equal(ToSpan("file/na/me")));
  
      // Wrong scheme
      NL_TEST_ASSERT(inSuite, parse("bdy://1234567890ABCDEF/file_name") == CHIP_ERROR_INVALID_SCHEME_PREFIX);
  
      // Node ID contains non-hex digit
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEG/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID);
  
      // Node ID too short
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDE/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID);
  
      // Node ID too long
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEFEF/file_name") == CHIP_ERROR_MISSING_URI_SEPARATOR);
  
      // Node ID to non-operational
      NL_TEST_ASSERT(inSuite, parse("bdx://FFFFFFFFFFFFFFFF/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID);
  
      // No file designator
      NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/") == CHIP_ERROR_INVALID_STRING_LENGTH);
  }
  
  void TestMakeURI(nlTestSuite * inSuite, void * inContext)
  {
      char uriBuffer[128];
      MutableCharSpan uri(uriBuffer);
  
      // Happy path
      NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file_name"), uri) == CHIP_NO_ERROR);
      NL_TEST_ASSERT(inSuite, uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file_name")));
  
      // File designator with slashes
      uri = MutableCharSpan(uriBuffer);
      NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file/na/me"), uri) == CHIP_NO_ERROR);
      NL_TEST_ASSERT(inSuite, uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file/na/me")));
  
      // Empty file designator
      uri = MutableCharSpan(uriBuffer);
      NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri) != CHIP_NO_ERROR);
  
      // Too small buffer
      uri = MutableCharSpan(uriBuffer, 31);
      NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri) != CHIP_NO_ERROR);
  }
  
  // clang-format off
  const nlTest sTests[] =
  {
      NL_TEST_DEF("TestParseURI", TestParseURI),
      NL_TEST_DEF("TestMakeURI", TestMakeURI),
      NL_TEST_SENTINEL()
  };
  // clang-format on
  
  nlTestSuite sSuite = { "Test BDX URI", &sTests[0], nullptr, nullptr };
  } // namespace
  
  int TestBdxUri()
  {
      // Run test suit against one context
      nlTestRunner(&sSuite, nullptr);
  
      return (nlTestRunnerStats(&sSuite));
  }
  
  CHIP_REGISTER_TEST_SUITE(TestBdxUri)
  