20#include <boost/test/unit_test.hpp>
36#include <wx/filename.h>
37#include <wx/stdpaths.h>
44std::string symbolPayload(
const char* aName )
47 + wxS(
"remote_symbol_lib.kicad_sym" );
49 wxFFile file( libPath, wxS(
"rb" ) );
50 BOOST_REQUIRE_MESSAGE( file.IsOpened(),
"Could not open " << libPath );
55 body.Replace( wxS(
"TestResistor" ), wxString::FromUTF8( aName ) );
57 return std::string( body.ToUTF8() );
61wxString sha256Hex(
const std::string& aPayload )
64 picosha2::hash256_hex_string( aPayload.begin(), aPayload.end(), hashHex );
65 return wxString::FromUTF8( hashHex.c_str() );
71 wxString
path = wxFileName::CreateTempFileName( wxS(
"remote-symbol-import" ) );
83 metadata.
api_base_url = wxString(
"https://provider.example.test/api" );
102 manifest.
part_id = wxString(
"acme-res-10k" );
106 const std::string symbolBlob = symbolPayload(
"R" );
108 symbol.
name = wxString(
"acme-res-10k.kicad_sym" );
109 symbol.
content_type = wxString(
"application/x-kicad-symbol" );
110 symbol.
size_bytes =
static_cast<long long>( symbolBlob.size() );
111 symbol.
sha256 = sha256Hex( symbolBlob );
112 symbol.
download_url = wxString(
"https://provider.example.test/downloads/acme-res-10k.kicad_sym" );
118 footprint.
asset_type = wxString(
"footprint" );
119 footprint.
name = wxString(
"R_0603.pretty" );
120 footprint.
content_type = wxString(
"application/x-kicad-footprint" );
122 footprint.
sha256 = wxString(
"8d8090740282c9ec23541a148af0ae57543e0da581e00e714e066dc4a1adefb0" );
123 footprint.
download_url = wxString(
"https://provider.example.test/downloads/R_0603.pretty" );
126 footprint.
target_name = wxString(
"R_0603_1608Metric" );
128 manifest.
assets = { symbol, footprint };
138 const wxString outputDir = tempDir();
148 wxUnusedVar( aError );
151 if( aUrl.EndsWith( wxString(
"acme-res-10k.kicad_sym" ) ) )
153 aResponse.
content_type = wxString(
"application/x-kicad-symbol" );
154 const std::string payload = symbolPayload(
"R" );
155 aResponse.
payload.assign( payload.begin(), payload.end() );
159 aResponse.
content_type = wxString(
"application/x-kicad-footprint" );
160 const std::string payload =
"(module \"R_0603_1608Metric\" (layer \"F.Cu\"))\n";
161 aResponse.
payload.assign( payload.begin(), payload.end() );
168 BOOST_REQUIRE( job.Import( provider(), importContext(), manifest(),
false, error ) );
170 wxFileName symbolPath( outputDir, wxString() );
171 symbolPath.AppendDir( wxString(
"symbols" ) );
172 symbolPath.SetFullName( wxString(
"testremote_device.kicad_sym" ) );
173 BOOST_CHECK( symbolPath.FileExists() );
175 wxFileName footprintPath( outputDir, wxString() );
176 footprintPath.AppendDir( wxString(
"footprints" ) );
177 footprintPath.AppendDir( wxString(
"testremote_resistor_smd.pretty" ) );
178 footprintPath.SetFullName( wxString(
"R_0603_1608Metric.kicad_mod" ) );
179 BOOST_CHECK( footprintPath.FileExists() );
186 LIB_SYMBOL* loaded = plugin->LoadSymbol( symbolPath.GetFullPath(), wxString(
"R" ) );
189 std::string(
"testremote_resistor_smd:R_0603_1608Metric" ) );
194 const wxString outputDir = tempDir();
204 wxUnusedVar( aError );
207 if( aUrl.EndsWith( wxString(
"acme-res-10k.kicad_sym" ) ) )
209 aResponse.
content_type = wxString(
"application/x-kicad-symbol" );
210 const std::string payload = symbolPayload(
"WrongName" );
211 aResponse.
payload.assign( payload.begin(), payload.end() );
215 aResponse.
content_type = wxString(
"application/x-kicad-footprint" );
216 const std::string payload =
"(module \"R_0603_1608Metric\" (layer \"F.Cu\"))\n";
217 aResponse.
payload.assign( payload.begin(), payload.end() );
224 BOOST_CHECK( !job.Import( provider(), importContext(), manifest(),
false, error ) );
225 BOOST_CHECK( !error.IsEmpty() );
230 const wxString outputDir = tempDir();
238 multiManifest.
part_id = wxString(
"acme-res-10k" );
241 const std::string symbolBlob = symbolPayload(
"R" );
242 symbolAsset.
asset_type = wxString(
"symbol" );
243 symbolAsset.
name = wxString(
"acme-res-10k.kicad_sym" );
244 symbolAsset.
content_type = wxString(
"application/x-kicad-symbol" );
245 symbolAsset.
size_bytes =
static_cast<long long>( symbolBlob.size() );
246 symbolAsset.
sha256 = sha256Hex( symbolBlob );
247 symbolAsset.
download_url = wxString(
"https://provider.example.test/downloads/acme-res-10k.kicad_sym" );
251 const std::string fpBlob0603 =
"(module \"R_0603_1608Metric\" (layer \"F.Cu\"))\n";
252 const std::string fpBlob0805 =
"(module \"R_0805_2012Metric\" (layer \"F.Cu\"))\n";
255 fpPrimary.
asset_type = wxString(
"footprint" );
256 fpPrimary.
name = wxString(
"R_0603.pretty" );
257 fpPrimary.
content_type = wxString(
"application/x-kicad-footprint" );
258 fpPrimary.
size_bytes =
static_cast<long long>( fpBlob0603.size() );
259 fpPrimary.
sha256 = sha256Hex( fpBlob0603 );
260 fpPrimary.
download_url = wxString(
"https://provider.example.test/downloads/R_0603.kicad_mod" );
262 fpPrimary.
target_name = wxString(
"R_0603_1608Metric" );
266 fpAlt.
name = wxString(
"R_0805.pretty" );
267 fpAlt.
content_type = wxString(
"application/x-kicad-footprint" );
268 fpAlt.
size_bytes =
static_cast<long long>( fpBlob0805.size() );
269 fpAlt.
sha256 = sha256Hex( fpBlob0805 );
270 fpAlt.
download_url = wxString(
"https://provider.example.test/downloads/R_0805.kicad_mod" );
272 fpAlt.
target_name = wxString(
"R_0805_2012Metric" );
276 multiManifest.
assets = { symbolAsset, fpPrimary, fpAlt };
281 wxUnusedVar( aError );
284 if( aUrl.EndsWith( wxString(
"acme-res-10k.kicad_sym" ) ) )
286 aResponse.
content_type = wxString(
"application/x-kicad-symbol" );
287 aResponse.
payload.assign( symbolBlob.begin(), symbolBlob.end() );
291 if( aUrl.EndsWith( wxString(
"R_0805.kicad_mod" ) ) )
293 aResponse.
content_type = wxString(
"application/x-kicad-footprint" );
294 aResponse.
payload.assign( fpBlob0805.begin(), fpBlob0805.end() );
298 aResponse.
content_type = wxString(
"application/x-kicad-footprint" );
299 aResponse.
payload.assign( fpBlob0603.begin(), fpBlob0603.end() );
305 BOOST_REQUIRE( job.Import( provider(), importContext(), multiManifest,
false, error ) );
307 wxFileName symbolPath( outputDir, wxString() );
308 symbolPath.AppendDir( wxString(
"symbols" ) );
309 symbolPath.SetFullName( wxString(
"testremote_device.kicad_sym" ) );
315 LIB_SYMBOL* loaded = plugin->LoadSymbol( symbolPath.GetFullPath(), wxString(
"R" ) );
319 std::string(
"testremote_resistor_smd:R_0603_1608Metric" ) );
323 if( filters.GetCount() == 1 )
REMOTE_PROVIDER_SETTINGS m_RemoteSymbol
Define a library symbol object.
wxArrayString GetFPFilters() const
wxString GetFootprintProp() const
static std::string ToStdString(const wxString &aStr)
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
T * GetAppSettings(const char *aFilename)
std::vector< REMOTE_PROVIDER_PART_ASSET > assets
std::vector< uint8_t > payload
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(ImportWritesDownloadedAssets)
BOOST_CHECK_EQUAL(result, "25.4")