pax_global_header00006660000000000000000000000064141761064530014521gustar00rootroot0000000000000052 comment=5269b048c3023f5e5e10500274aebaa20b3c312b go-wildcard-1.0.3/000077500000000000000000000000001417610645300137165ustar00rootroot00000000000000go-wildcard-1.0.3/.gitignore000066400000000000000000000155051417610645300157140ustar00rootroot00000000000000# ---> Go # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Dependency directories (remove the comment below to include it) # vendor/ # ---> VisualStudio ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Mono auto generated files mono_crash.* # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ [Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUnit *.VisualState.xml TestResult.xml nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET Core project.lock.json project.fragment.lock.json artifacts/ # ASP.NET Scaffolding ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Coverlet is a free, cross platform Code Coverage Tool coverage*.json coverage*.xml coverage*.info # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # NuGet Symbol Packages *.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3's project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx *.appxbundle *.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- [Bb]ackup.rdl *- [Bb]ackup ([0-9]).rdl *- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik's JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # BeatPulse healthcheck temp database healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd # ---> VisualStudioCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json *.code-workspace # Local History for Visual Studio Code .history/ # ---> Vim # Swap [._]*.s[a-v][a-z] !*.svg # comment out if you don't need vector files [._]*.sw[a-p] [._]s[a-rt-v][a-z] [._]ss[a-gi-z] [._]sw[a-p] # Session Session.vim Sessionx.vim # Temporary .netrwhist *~ # Auto-generated tag files tags # Persistent undo [._]*.un~ go-wildcard-1.0.3/LICENSE000066400000000000000000000241471417610645300147330ustar00rootroot00000000000000Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. go-wildcard-1.0.3/README.md000066400000000000000000000045351417610645300152040ustar00rootroot00000000000000# Go-wildcard [![Go Report Card](https://goreportcard.com/badge/github.com/IGLOU-EU/go-wildcard)](https://goreportcard.com/report/github.com/IGLOU-EU/go-wildcard) [![Go Reference](https://img.shields.io/badge/api-reference-blue)](https://pkg.go.dev/github.com/IGLOU-EU/go-wildcard) [![Go coverage](https://gocover.io/_badge/github.com/IGLOU-EU/go-wildcard)](https://gocover.io/github.com/IGLOU-EU/go-wildcard) [![Apache V2 License](https://img.shields.io/badge/license-Apache%202-blue)](https://opensource.org/licenses/MIT) >Go-wildcard is forked from [Minio project](https://github.com/minio/minio) >https://github.com/minio/minio/tree/master/pkg/wildcard ## Why This part of Minio project is a very cool, fast and light wildcard pattern matching. Originally the purpose of this fork is to give access to this "lib" under Apache license, without import the entire Minio project ... Two function are available `MatchSimple` and `Match` - `MatchSimple` only covert `*` usage (he is a bit faster) - `Match` support full wildcard matching, `*` and `?` I know Regex, but this is a big part, and it is slow (even prepared regex) ... I know Glob, but most of the time, I only need simple wildcard matching. This library remains under Apache License Version 2.0, but MinIO project is migrated to GNU Affero General Public License 3.0 or later from https://github.com/minio/minio/commit/069432566fcfac1f1053677cc925ddafd750730a ## How to >⚠️ WARNING: Unlike the GNU "libc", this library has no equivalent to "FNM_FILE_NAME". To do this you can use "path/filepath" https://pkg.go.dev/path/filepath#Glob Using this fork ```sh go get github.com/IGLOU-EU/go-wildcard@latest ``` Using Official Minio (GNU Affero General Public License 3.0 or later) >From https://github.com/minio/minio/commit/81d5688d5684bd4d93e7bb691af8cf555a20c28c the minio pkg are moved to https://github.com/minio/pkg ```sh go get github.com/minio/pkg/wildcard@latest ``` ## Quick Example This example shows a Go file which pattern matching ... ```go package main import ( "fmt" wildcard "github.com/IGLOU-EU/go-wildcard" ) func main() { str := "daaadabadmanda" pattern := "da*da*da*" result := wildcard.MatchSimple(pattern, str) fmt.Println(str, pattern, result) pattern = "?a*da*d?*" result = wildcard.Match(pattern, str) fmt.Println(str, pattern, result) } ``` go-wildcard-1.0.3/go.mod000066400000000000000000000000601417610645300150200ustar00rootroot00000000000000module github.com/IGLOU-EU/go-wildcard go 1.16 go-wildcard-1.0.3/wildcard.go000066400000000000000000000040261417610645300160400ustar00rootroot00000000000000/* * MinIO Cloud Storage, (C) 2015, 2016 MinIO, Inc. * * 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 wildcard // MatchSimple - finds whether the text matches/satisfies the pattern string. // supports only '*' wildcard in the pattern. // considers a file system path as a flat name space. func MatchSimple(pattern, name string) bool { if pattern == "" { return name == pattern } if pattern == "*" { return true } // Does only wildcard '*' match. return deepMatchRune([]rune(name), []rune(pattern), true) } // Match - finds whether the text matches/satisfies the pattern string. // supports '*' and '?' wildcards in the pattern string. // unlike path.Match(), considers a path as a flat name space while matching the pattern. // The difference is illustrated in the example here https://play.golang.org/p/Ega9qgD4Qz . func Match(pattern, name string) (matched bool) { if pattern == "" { return name == pattern } if pattern == "*" { return true } // Does extended wildcard '*' and '?' match. return deepMatchRune([]rune(name), []rune(pattern), false) } func deepMatchRune(str, pattern []rune, simple bool) bool { for len(pattern) > 0 { switch pattern[0] { default: if len(str) == 0 || str[0] != pattern[0] { return false } case '?': if len(str) == 0 && !simple { return false } case '*': return deepMatchRune(str, pattern[1:], simple) || (len(str) > 0 && deepMatchRune(str[1:], pattern, simple)) } str = str[1:] pattern = pattern[1:] } return len(str) == 0 && len(pattern) == 0 } go-wildcard-1.0.3/wildcard_test.go000066400000000000000000000315631417610645300171050ustar00rootroot00000000000000/* * MinIO Cloud Storage, (C) 2015, 2016 MinIO, Inc. * * 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 wildcard_test import ( "testing" wildcard "github.com/IGLOU-EU/go-wildcard" ) // TestMatch - Tests validate the logic of wild card matching. // `Match` supports '*' and '?' wildcards. // Sample usage: In resource matching for bucket policy validation. func TestMatch(t *testing.T) { testCases := []struct { pattern string text string matched bool }{ // Test case - 1. // Test case with pattern "*". Expected to match any text. { pattern: "*", text: "s3:GetObject", matched: true, }, // Test case - 2. // Test case with empty pattern. This only matches empty string. { pattern: "", text: "s3:GetObject", matched: false, }, // Test case - 3. // Test case with empty pattern. This only matches empty string. { pattern: "", text: "", matched: true, }, // Test case - 4. // Test case with single "*" at the end. { pattern: "s3:*", text: "s3:ListMultipartUploadParts", matched: true, }, // Test case - 5. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucketMultipartUploads", text: "s3:ListBucket", matched: false, }, // Test case - 6. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucket", text: "s3:ListBucket", matched: true, }, // Test case - 7. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucketMultipartUploads", text: "s3:ListBucketMultipartUploads", matched: true, }, // Test case - 8. // Test case with pattern containing key name with a prefix. Should accept the same text without a "*". { pattern: "my-bucket/oo*", text: "my-bucket/oo", matched: true, }, // Test case - 9. // Test case with "*" at the end of the pattern. { pattern: "my-bucket/In*", text: "my-bucket/India/Karnataka/", matched: true, }, // Test case - 10. // Test case with prefixes shuffled. // This should fail. { pattern: "my-bucket/In*", text: "my-bucket/Karnataka/India/", matched: false, }, // Test case - 11. // Test case with text expanded to the wildcards in the pattern. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Ban", matched: true, }, // Test case - 12. // Test case with the keyname part is repeated as prefix several times. // This is valid. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Ban/Ban/Ban/Ban/Ban", matched: true, }, // Test case - 13. // Test case to validate that `*` can be expanded into multiple prefixes. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Area1/Area2/Area3/Ban", matched: true, }, // Test case - 14. // Test case to validate that `*` can be expanded into multiple prefixes. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/State1/State2/Karnataka/Area1/Area2/Area3/Ban", matched: true, }, // Test case - 15. // Test case where the keyname part of the pattern is expanded in the text. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Bangalore", matched: false, }, // Test case - 16. // Test case with prefixes and wildcard expanded for all "*". { pattern: "my-bucket/In*/Ka*/Ban*", text: "my-bucket/India/Karnataka/Bangalore", matched: true, }, // Test case - 17. // Test case with keyname part being a wildcard in the pattern. { pattern: "my-bucket/*", text: "my-bucket/India", matched: true, }, // Test case - 18. { pattern: "my-bucket/oo*", text: "my-bucket/odo", matched: false, }, // Test case with pattern containing wildcard '?'. // Test case - 19. // "my-bucket?/" matches "my-bucket1/", "my-bucket2/", "my-bucket3" etc... // doesn't match "mybucket/". { pattern: "my-bucket?/abc*", text: "mybucket/abc", matched: false, }, // Test case - 20. { pattern: "my-bucket?/abc*", text: "my-bucket1/abc", matched: true, }, // Test case - 21. { pattern: "my-?-bucket/abc*", text: "my--bucket/abc", matched: false, }, // Test case - 22. { pattern: "my-?-bucket/abc*", text: "my-1-bucket/abc", matched: true, }, // Test case - 23. { pattern: "my-?-bucket/abc*", text: "my-k-bucket/abc", matched: true, }, // Test case - 24. { pattern: "my??bucket/abc*", text: "mybucket/abc", matched: false, }, // Test case - 25. { pattern: "my??bucket/abc*", text: "my4abucket/abc", matched: true, }, // Test case - 26. { pattern: "my-bucket?abc*", text: "my-bucket/abc", matched: true, }, // Test case 27-28. // '?' matches '/' too. (works with s3). // This is because the namespace is considered flat. // "abc?efg" matches both "abcdefg" and "abc/efg". { pattern: "my-bucket/abc?efg", text: "my-bucket/abcdefg", matched: true, }, { pattern: "my-bucket/abc?efg", text: "my-bucket/abc/efg", matched: true, }, // Test case - 29. { pattern: "my-bucket/abc????", text: "my-bucket/abc", matched: false, }, // Test case - 30. { pattern: "my-bucket/abc????", text: "my-bucket/abcde", matched: false, }, // Test case - 31. { pattern: "my-bucket/abc????", text: "my-bucket/abcdefg", matched: true, }, // Test case 32-34. // test case with no '*'. { pattern: "my-bucket/abc?", text: "my-bucket/abc", matched: false, }, { pattern: "my-bucket/abc?", text: "my-bucket/abcd", matched: true, }, { pattern: "my-bucket/abc?", text: "my-bucket/abcde", matched: false, }, // Test case 35. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnop", matched: false, }, // Test case 36. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnopqrst/mnopqr", matched: true, }, // Test case 37. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnopqrst/mnopqrs", matched: true, }, // Test case 38. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnop", matched: false, }, // Test case 39. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnopq", matched: true, }, // Test case 40. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnopqr", matched: true, }, // Test case 41. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopqand", matched: true, }, // Test case 42. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopand", matched: false, }, // Test case 43. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopqand", matched: true, }, // Test case 44. { pattern: "my-bucket/mnop*?", text: "my-bucket/mn", matched: false, }, // Test case 45. { pattern: "my-bucket/mnop*?", text: "my-bucket/mnopqrst/mnopqrs", matched: true, }, // Test case 46. { pattern: "my-bucket/mnop*??", text: "my-bucket/mnopqrst", matched: true, }, // Test case 47. { pattern: "my-bucket/mnop*qrst", text: "my-bucket/mnopabcdegqrst", matched: true, }, // Test case 48. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopqand", matched: true, }, // Test case 49. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopand", matched: false, }, // Test case 50. { pattern: "my-bucket/mnop*?and?", text: "my-bucket/mnopqanda", matched: true, }, // Test case 51. { pattern: "my-bucket/mnop*?and", text: "my-bucket/mnopqanda", matched: false, }, // Test case 52. { pattern: "my-?-bucket/abc*", text: "my-bucket/mnopqanda", matched: false, }, } // Iterating over the test cases, call the function under test and asert the output. for i, testCase := range testCases { actualResult := wildcard.Match(testCase.pattern, testCase.text) if testCase.matched != actualResult { t.Errorf("Test %d: Expected the result to be `%v`, but instead found it to be `%v`", i+1, testCase.matched, actualResult) } } } // TestMatchSimple - Tests validate the logic of wild card matching. // `MatchSimple` supports matching for only '*' in the pattern string. func TestMatchSimple(t *testing.T) { testCases := []struct { pattern string text string matched bool }{ // Test case - 1. // Test case with pattern "*". Expected to match any text. { pattern: "*", text: "s3:GetObject", matched: true, }, // Test case - 2. // Test case with empty pattern. This only matches empty string. { pattern: "", text: "s3:GetObject", matched: false, }, // Test case - 3. // Test case with empty pattern. This only matches empty string. { pattern: "", text: "", matched: true, }, // Test case - 4. // Test case with single "*" at the end. { pattern: "s3:*", text: "s3:ListMultipartUploadParts", matched: true, }, // Test case - 5. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucketMultipartUploads", text: "s3:ListBucket", matched: false, }, // Test case - 6. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucket", text: "s3:ListBucket", matched: true, }, // Test case - 7. // Test case with a no "*". In this case the pattern and text should be the same. { pattern: "s3:ListBucketMultipartUploads", text: "s3:ListBucketMultipartUploads", matched: true, }, // Test case - 8. // Test case with pattern containing key name with a prefix. Should accept the same text without a "*". { pattern: "my-bucket/oo*", text: "my-bucket/oo", matched: true, }, // Test case - 9. // Test case with "*" at the end of the pattern. { pattern: "my-bucket/In*", text: "my-bucket/India/Karnataka/", matched: true, }, // Test case - 10. // Test case with prefixes shuffled. // This should fail. { pattern: "my-bucket/In*", text: "my-bucket/Karnataka/India/", matched: false, }, // Test case - 11. // Test case with text expanded to the wildcards in the pattern. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Ban", matched: true, }, // Test case - 12. // Test case with the keyname part is repeated as prefix several times. // This is valid. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Ban/Ban/Ban/Ban/Ban", matched: true, }, // Test case - 13. // Test case to validate that `*` can be expanded into multiple prefixes. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Area1/Area2/Area3/Ban", matched: true, }, // Test case - 14. // Test case to validate that `*` can be expanded into multiple prefixes. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/State1/State2/Karnataka/Area1/Area2/Area3/Ban", matched: true, }, // Test case - 15. // Test case where the keyname part of the pattern is expanded in the text. { pattern: "my-bucket/In*/Ka*/Ban", text: "my-bucket/India/Karnataka/Bangalore", matched: false, }, // Test case - 16. // Test case with prefixes and wildcard expanded for all "*". { pattern: "my-bucket/In*/Ka*/Ban*", text: "my-bucket/India/Karnataka/Bangalore", matched: true, }, // Test case - 17. // Test case with keyname part being a wildcard in the pattern. { pattern: "my-bucket/*", text: "my-bucket/India", matched: true, }, // Test case - 18. { pattern: "my-bucket/oo*", text: "my-bucket/odo", matched: false, }, // Test case - 11. { pattern: "my-bucket/oo?*", text: "my-bucket/oo???", matched: true, }, // Test case - 12: { pattern: "my-bucket/oo??*", text: "my-bucket/odo", matched: false, }, // Test case - 13: { pattern: "?h?*", text: "?h?hello", matched: true, }, } // Iterating over the test cases, call the function under test and asert the output. for i, testCase := range testCases { actualResult := wildcard.MatchSimple(testCase.pattern, testCase.text) if testCase.matched != actualResult { t.Errorf("Test %d: Expected the result to be `%v`, but instead found it to be `%v`", i+1, testCase.matched, actualResult) } } }