github.com/cs3org/reva/v2@v2.27.7/pkg/app/registry/micro/micro_test.go (about) 1 // Copyright 2018-2021 CERN 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // In applying this license, CERN does not waive the privileges and immunities 16 // granted to it by virtue of its status as an Intergovernmental Organization 17 // or submit itself to any jurisdiction. 18 19 package micro 20 21 import ( 22 "context" 23 "testing" 24 "time" 25 26 registrypb "github.com/cs3org/go-cs3apis/cs3/app/registry/v1beta1" 27 "github.com/google/uuid" 28 oreg "github.com/owncloud/ocis/v2/ocis-pkg/registry" 29 mreg "go-micro.dev/v4/registry" 30 ) 31 32 func init() { 33 _ = oreg.GetRegistry(oreg.Inmemory()) 34 } 35 36 func TestFindProviders(t *testing.T) { 37 38 testCases := []struct { 39 name string 40 mimeTypes []*mimeTypeConfig 41 regProviders []*registrypb.ProviderInfo 42 mimeType string 43 expectedRes []*registrypb.ProviderInfo 44 expectedErr error 45 registryNamespace string 46 }{ 47 { 48 name: "no mime types registered", 49 registryNamespace: "noMimeTypesRegistered", 50 mimeTypes: []*mimeTypeConfig{}, 51 mimeType: "SOMETHING", 52 expectedErr: mreg.ErrNotFound, 53 }, 54 { 55 name: "one provider registered for one mime type", 56 registryNamespace: "oneProviderRegistererdForOneMimeType", 57 mimeTypes: []*mimeTypeConfig{ 58 { 59 MimeType: "text/json", 60 Extension: "json", 61 Name: "JSON File", 62 Icon: "https://example.org/icons&file=json.png", 63 DefaultApp: "some Address", 64 }, 65 }, 66 regProviders: []*registrypb.ProviderInfo{ 67 { 68 MimeTypes: []string{"text/json"}, 69 Address: "127.0.0.1:65535", 70 Name: "some Name", 71 }, 72 }, 73 mimeType: "text/json", 74 expectedErr: nil, 75 expectedRes: []*registrypb.ProviderInfo{ 76 { 77 MimeTypes: []string{"text/json"}, 78 Address: "127.0.0.1:65535", 79 Name: "some Name", 80 }, 81 }, 82 }, 83 { 84 name: "more providers registered for one mime type", 85 registryNamespace: "moreProvidersRegisteredForOneMimeType", 86 mimeTypes: []*mimeTypeConfig{ 87 { 88 MimeType: "text/json", 89 Extension: "json", 90 Name: "JSON File", 91 Icon: "https://example.org/icons&file=json.png", 92 DefaultApp: "provider2", 93 }, 94 }, 95 regProviders: []*registrypb.ProviderInfo{ 96 { 97 MimeTypes: []string{"text/json"}, 98 Address: "127.0.0.1:65535", 99 Name: "provider1", 100 }, 101 { 102 MimeTypes: []string{"text/json"}, 103 Address: "127.0.0.2:65535", 104 Name: "provider2", 105 }, 106 { 107 MimeTypes: []string{"text/json"}, 108 Address: "127.0.0.3:65535", 109 Name: "provider3", 110 }, 111 }, 112 mimeType: "text/json", 113 expectedErr: nil, 114 expectedRes: []*registrypb.ProviderInfo{ 115 { 116 MimeTypes: []string{"text/json"}, 117 Address: "127.0.0.1:65535", 118 Name: "provider1", 119 }, 120 { 121 MimeTypes: []string{"text/json"}, 122 Address: "127.0.0.2:65535", 123 Name: "provider2", 124 }, 125 { 126 MimeTypes: []string{"text/json"}, 127 Address: "127.0.0.3:65535", 128 Name: "provider3", 129 }, 130 }, 131 }, 132 { 133 name: "more providers registered for different mime types", 134 registryNamespace: "moreProvidersRegisteredForDifferentMimeTypes", 135 mimeTypes: []*mimeTypeConfig{ 136 { 137 MimeType: "text/json", 138 Extension: "json", 139 Name: "JSON File", 140 Icon: "https://example.org/icons&file=json.png", 141 DefaultApp: "provider2", 142 }, 143 { 144 MimeType: "text/xml", 145 Extension: "xml", 146 Name: "XML File", 147 Icon: "https://example.org/icons&file=xml.png", 148 DefaultApp: "provider1", 149 }, 150 }, 151 regProviders: []*registrypb.ProviderInfo{ 152 { 153 MimeTypes: []string{"text/json", "text/xml"}, 154 Address: "127.0.0.1:65535", 155 Name: "provider1", 156 }, 157 { 158 MimeTypes: []string{"text/json"}, 159 Address: "127.0.0.2:65535", 160 Name: "provider2", 161 }, 162 { 163 MimeTypes: []string{"text/xml"}, 164 Address: "127.0.0.3:65535", 165 Name: "provider3", 166 }, 167 }, 168 mimeType: "text/json", 169 expectedErr: nil, 170 expectedRes: []*registrypb.ProviderInfo{ 171 { 172 MimeTypes: []string{"text/json", "text/xml"}, 173 Address: "127.0.0.1:65535", 174 Name: "provider1", 175 }, 176 { 177 MimeTypes: []string{"text/json"}, 178 Address: "127.0.0.2:65535", 179 Name: "provider2", 180 }, 181 }, 182 }, 183 } 184 185 for _, tt := range testCases { 186 187 ctx := context.TODO() 188 189 // register all the providers 190 for _, p := range tt.regProviders { 191 err := registerWithMicroReg(tt.registryNamespace, p) 192 if err != nil { 193 t.Error("unexpected error adding a new provider in the registry:", err) 194 } 195 } 196 197 registry, err := New(map[string]interface{}{ 198 "mime_types": tt.mimeTypes, 199 "namespace": tt.registryNamespace, // TODO: move this to a const 200 }) 201 202 if err != nil { 203 t.Error("unexpected error creating the registry:", err) 204 } 205 206 providers, err := registry.FindProviders(ctx, tt.mimeType) 207 208 // check that the error returned by FindProviders is the same as the expected 209 if tt.expectedErr != err { 210 t.Errorf("different error returned: got=%v expected=%v", err, tt.expectedErr) 211 } 212 213 // expected: slice of pointers, got: slice of pointers with weird opague notation 214 if !providersEquals(providers, tt.expectedRes) { 215 t.Errorf("providers list different from expected: \n\tgot=%v\n\texp=%v", providers, tt.expectedRes) 216 } 217 218 } 219 220 } 221 222 // func TestFindProvidersWithPriority(t *testing.T) { 223 // 224 // testCases := []struct { 225 // name string 226 // mimeTypes []*mimeTypeConfig 227 // regProviders []*registrypb.ProviderInfo 228 // mimeType string 229 // expectedRes []*registrypb.ProviderInfo 230 // expectedErr error 231 // registryNamespace string 232 // }{ 233 // { 234 // name: "no mime types registered", 235 // registryNamespace: "noMimeTypesRegistered", 236 // mimeTypes: []*mimeTypeConfig{}, 237 // mimeType: "SOMETHING", 238 // expectedErr: mreg.ErrNotFound, 239 // }, 240 // { 241 // name: "one provider registered for one mime type", 242 // registryNamespace: "oneProviderRegisteredForOneMimeType", 243 // mimeTypes: []*mimeTypeConfig{ 244 // { 245 // MimeType: "text/json", 246 // Extension: "json", 247 // Name: "JSON File", 248 // Icon: "https://example.org/icons&file=json.png", 249 // DefaultApp: "some Address", 250 // }, 251 // }, 252 // regProviders: []*registrypb.ProviderInfo{ 253 // { 254 // MimeTypes: []string{"text/json"}, 255 // Address: "127.0.0.1:65535", 256 // Name: "some Name", 257 // Opaque: &typesv1beta1.Opaque{ 258 // Map: map[string]*typesv1beta1.OpaqueEntry{ 259 // "priority": { 260 // Decoder: "plain", 261 // Value: []byte("100"), 262 // }, 263 // }, 264 // }, 265 // }, 266 // }, 267 // mimeType: "text/json", 268 // expectedErr: nil, 269 // expectedRes: []*registrypb.ProviderInfo{ 270 // { 271 // MimeTypes: []string{"text/json"}, 272 // Address: "127.0.0.1:65535", 273 // Name: "some Name", 274 // }, 275 // }, 276 // }, 277 // { 278 // name: "more providers registered for one mime type", 279 // registryNamespace: "moreProvidersRegisteredForOneMimeType", 280 // mimeTypes: []*mimeTypeConfig{ 281 // { 282 // MimeType: "text/json", 283 // Extension: "json", 284 // Name: "JSON File", 285 // Icon: "https://example.org/icons&file=json.png", 286 // DefaultApp: "provider2", 287 // }, 288 // }, 289 // regProviders: []*registrypb.ProviderInfo{ 290 // { 291 // MimeTypes: []string{"text/json"}, 292 // Address: "127.0.0.1:65535", 293 // Name: "provider1", 294 // Opaque: &typesv1beta1.Opaque{ 295 // Map: map[string]*typesv1beta1.OpaqueEntry{ 296 // "priority": { 297 // Decoder: "plain", 298 // Value: []byte("10"), 299 // }, 300 // }, 301 // }, 302 // }, 303 // { 304 // MimeTypes: []string{"text/json"}, 305 // Address: "127.0.0.2:65535", 306 // Name: "provider2", 307 // Opaque: &typesv1beta1.Opaque{ 308 // Map: map[string]*typesv1beta1.OpaqueEntry{ 309 // "priority": { 310 // Decoder: "plain", 311 // Value: []byte("20"), 312 // }, 313 // }, 314 // }, 315 // }, 316 // { 317 // MimeTypes: []string{"text/json"}, 318 // Address: "127.0.0.3:65535", 319 // Name: "provider3", 320 // Opaque: &typesv1beta1.Opaque{ 321 // Map: map[string]*typesv1beta1.OpaqueEntry{ 322 // "priority": { 323 // Decoder: "plain", 324 // Value: []byte("5"), 325 // }, 326 // }, 327 // }, 328 // }, 329 // }, 330 // mimeType: "text/json", 331 // expectedErr: nil, 332 // expectedRes: []*registrypb.ProviderInfo{ 333 // { 334 // MimeTypes: []string{"text/json"}, 335 // Address: "127.0.0.2:65535", 336 // Name: "provider2", 337 // }, 338 // { 339 // MimeTypes: []string{"text/json"}, 340 // Address: "127.0.0.1:65535", 341 // Name: "provider1", 342 // }, 343 // { 344 // MimeTypes: []string{"text/json"}, 345 // Address: "127.0.0.3:65535", 346 // Name: "provider3", 347 // }, 348 // }, 349 // }, 350 // { 351 // name: "more providers registered for different mime types", 352 // registryNamespace: "moreProvidersRegisteredForDifferentMimeTypes", 353 // mimeTypes: []*mimeTypeConfig{ 354 // { 355 // MimeType: "text/json", 356 // Extension: "json", 357 // Name: "JSON File", 358 // Icon: "https://example.org/icons&file=json.png", 359 // DefaultApp: "provider2", 360 // }, 361 // { 362 // MimeType: "text/xml", 363 // Extension: "xml", 364 // Name: "XML File", 365 // Icon: "https://example.org/icons&file=xml.png", 366 // DefaultApp: "provider1", 367 // }, 368 // }, 369 // regProviders: []*registrypb.ProviderInfo{ 370 // { 371 // MimeTypes: []string{"text/json", "text/xml"}, 372 // Address: "127.0.0.1:65535", 373 // Name: "provider1", 374 // Opaque: &typesv1beta1.Opaque{ 375 // Map: map[string]*typesv1beta1.OpaqueEntry{ 376 // "priority": { 377 // Decoder: "plain", 378 // Value: []byte("5"), 379 // }, 380 // }, 381 // }, 382 // }, 383 // { 384 // MimeTypes: []string{"text/json"}, 385 // Address: "127.0.0.2:65535", 386 // Name: "provider2", 387 // Opaque: &typesv1beta1.Opaque{ 388 // Map: map[string]*typesv1beta1.OpaqueEntry{ 389 // "priority": { 390 // Decoder: "plain", 391 // Value: []byte("100"), 392 // }, 393 // }, 394 // }, 395 // }, 396 // { 397 // MimeTypes: []string{"text/xml"}, 398 // Address: "127.0.0.3:65535", 399 // Name: "provider3", 400 // Opaque: &typesv1beta1.Opaque{ 401 // Map: map[string]*typesv1beta1.OpaqueEntry{ 402 // "priority": { 403 // Decoder: "plain", 404 // Value: []byte("20"), 405 // }, 406 // }, 407 // }, 408 // }, 409 // }, 410 // mimeType: "text/json", 411 // expectedErr: nil, 412 // expectedRes: []*registrypb.ProviderInfo{ 413 // { 414 // MimeTypes: []string{"text/json"}, 415 // Address: "127.0.0.2:65535", 416 // Name: "provider2", 417 // }, 418 // { 419 // MimeTypes: []string{"text/json", "text/xml"}, 420 // Address: "127.0.0.1:65535", 421 // Name: "provider1", 422 // }, 423 // }, 424 // }, 425 // { 426 // name: "more providers registered for different mime types2", 427 // registryNamespace: "moreProvidersRegisteredForDifferentMimeTypes2", 428 // mimeTypes: []*mimeTypeConfig{ 429 // { 430 // MimeType: "text/json", 431 // Extension: "json", 432 // Name: "JSON File", 433 // Icon: "https://example.org/icons&file=json.png", 434 // DefaultApp: "provider2", 435 // }, 436 // { 437 // MimeType: "text/xml", 438 // Extension: "xml", 439 // Name: "XML File", 440 // Icon: "https://example.org/icons&file=xml.png", 441 // DefaultApp: "provider1", 442 // }, 443 // }, 444 // regProviders: []*registrypb.ProviderInfo{ 445 // { 446 // MimeTypes: []string{"text/json", "text/xml"}, 447 // Address: "127.0.0.1:65535", 448 // Name: "provider1", 449 // Opaque: &typesv1beta1.Opaque{ 450 // Map: map[string]*typesv1beta1.OpaqueEntry{ 451 // "priority": { 452 // Decoder: "plain", 453 // Value: []byte("5"), 454 // }, 455 // }, 456 // }, 457 // }, 458 // { 459 // MimeTypes: []string{"text/json"}, 460 // Address: "127.0.0.2:65535", 461 // Name: "provider2", 462 // Opaque: &typesv1beta1.Opaque{ 463 // Map: map[string]*typesv1beta1.OpaqueEntry{ 464 // "priority": { 465 // Decoder: "plain", 466 // Value: []byte("100"), 467 // }, 468 // }, 469 // }, 470 // }, 471 // { 472 // MimeTypes: []string{"text/xml"}, 473 // Address: "127.0.0.3:65535", 474 // Name: "provider3", 475 // Opaque: &typesv1beta1.Opaque{ 476 // Map: map[string]*typesv1beta1.OpaqueEntry{ 477 // "priority": { 478 // Decoder: "plain", 479 // Value: []byte("20"), 480 // }, 481 // }, 482 // }, 483 // }, 484 // }, 485 // mimeType: "text/xml", 486 // expectedErr: nil, 487 // expectedRes: []*registrypb.ProviderInfo{ 488 // { 489 // MimeTypes: []string{"text/xml"}, 490 // Address: "127.0.0.3:65535", 491 // Name: "provider3", 492 // }, 493 // { 494 // MimeTypes: []string{"text/json", "text/xml"}, 495 // Address: "127.0.0.1:65535", 496 // Name: "provider1", 497 // }, 498 // }, 499 // }, 500 // } 501 // 502 // for _, tt := range testCases { 503 // 504 // t.Run(tt.name, func(t *testing.T) { 505 // 506 // ctx := context.TODO() 507 // 508 // // register all the providers 509 // for _, p := range tt.regProviders { 510 // err := registerWithMicroReg(tt.registryNamespace, p) 511 // if err != nil { 512 // t.Fatal("unexpected error adding a new provider in the registry:", err) 513 // } 514 // } 515 // 516 // registry, err := New(map[string]interface{}{ 517 // "mime_types": tt.mimeTypes, 518 // "namespace": tt.registryNamespace, 519 // }) 520 // 521 // if err != nil { 522 // t.Fatal("unexpected error creating the registry:", err) 523 // } 524 // 525 // providers, err := registry.FindProviders(ctx, tt.mimeType) 526 // 527 // // check that the error returned by FindProviders is the same as the expected 528 // if tt.expectedErr != err { 529 // t.Fatalf("different error returned: got=%v expected=%v", err, tt.expectedErr) 530 // } 531 // 532 // if !providersEquals(providers, tt.expectedRes) { 533 // t.Fatalf("providers list different from expected: \n\tgot=%v\n\texp=%v", providers, tt.expectedRes) 534 // } 535 // 536 // }) 537 // 538 // } 539 // 540 // } 541 542 func TestListSupportedMimeTypes(t *testing.T) { 543 testCases := []struct { 544 name string 545 registryNamespace string 546 mimeTypes []*mimeTypeConfig 547 newProviders []*registrypb.ProviderInfo 548 expected []*registrypb.MimeTypeInfo 549 }{ 550 { 551 name: "one mime type - no provider registered", 552 registryNamespace: "oneMimeTypeNoProviderRegistered", 553 mimeTypes: []*mimeTypeConfig{ 554 { 555 MimeType: "text/json", 556 Extension: "json", 557 Name: "JSON File", 558 Icon: "https://example.org/icons&file=json.png", 559 DefaultApp: "provider2", 560 }, 561 }, 562 newProviders: []*registrypb.ProviderInfo{}, 563 expected: []*registrypb.MimeTypeInfo{ 564 { 565 MimeType: "text/json", 566 Ext: "json", 567 AppProviders: []*registrypb.ProviderInfo{}, 568 Name: "JSON File", 569 Icon: "https://example.org/icons&file=json.png", 570 DefaultApplication: "provider2", 571 }, 572 }, 573 }, 574 { 575 name: "one mime type - only default provider registered", 576 registryNamespace: "oneMimeTypenOnlyDefaultProviderRegistered", 577 mimeTypes: []*mimeTypeConfig{ 578 { 579 MimeType: "text/json", 580 Extension: "json", 581 Name: "JSON File", 582 Icon: "https://example.org/icons&file=json.png", 583 DefaultApp: "provider1", 584 }, 585 }, 586 newProviders: []*registrypb.ProviderInfo{ 587 { 588 MimeTypes: []string{"text/json"}, 589 Address: "127.0.0.1:65535", 590 Name: "provider1", 591 }, 592 }, 593 expected: []*registrypb.MimeTypeInfo{ 594 { 595 MimeType: "text/json", 596 Ext: "json", 597 AppProviders: []*registrypb.ProviderInfo{ 598 { 599 MimeTypes: []string{"text/json"}, 600 Address: "127.0.0.1:65535", 601 Name: "provider1", 602 }, 603 }, 604 DefaultApplication: "provider1", 605 Name: "JSON File", 606 Icon: "https://example.org/icons&file=json.png", 607 }, 608 }, 609 }, 610 { 611 name: "one mime type - more providers", 612 registryNamespace: "oneMimeTypeMoreProviders", 613 mimeTypes: []*mimeTypeConfig{ 614 { 615 MimeType: "text/json", 616 Extension: "json", 617 Name: "JSON File", 618 Icon: "https://example.org/icons&file=json.png", 619 DefaultApp: "JSON_DEFAULT_PROVIDER", 620 }, 621 }, 622 newProviders: []*registrypb.ProviderInfo{ 623 { 624 MimeTypes: []string{"text/json"}, 625 Address: "127.0.0.2:65535", 626 Name: "NOT_DEFAULT_PROVIDER", 627 }, 628 { 629 MimeTypes: []string{"text/json"}, 630 Address: "127.0.0.1:65535", 631 Name: "JSON_DEFAULT_PROVIDER", 632 }, 633 }, 634 expected: []*registrypb.MimeTypeInfo{ 635 { 636 MimeType: "text/json", 637 Ext: "json", 638 AppProviders: []*registrypb.ProviderInfo{ 639 { 640 MimeTypes: []string{"text/json"}, 641 Address: "127.0.0.2:65535", 642 Name: "NOT_DEFAULT_PROVIDER", 643 }, 644 { 645 MimeTypes: []string{"text/json"}, 646 Address: "127.0.0.1:65535", 647 Name: "JSON_DEFAULT_PROVIDER", 648 }, 649 }, 650 DefaultApplication: "JSON_DEFAULT_PROVIDER", 651 Name: "JSON File", 652 Icon: "https://example.org/icons&file=json.png", 653 }, 654 }, 655 }, 656 { 657 name: "multiple mime types", 658 registryNamespace: "multipleMimeTypes", 659 mimeTypes: []*mimeTypeConfig{ 660 { 661 MimeType: "text/json", 662 Extension: "json", 663 Name: "JSON File", 664 Icon: "https://example.org/icons&file=json.png", 665 DefaultApp: "JSON_DEFAULT_PROVIDER", 666 }, 667 { 668 MimeType: "text/xml", 669 Extension: "xml", 670 Name: "XML File", 671 Icon: "https://example.org/icons&file=xml.png", 672 DefaultApp: "XML_DEFAULT_PROVIDER", 673 }, 674 }, 675 newProviders: []*registrypb.ProviderInfo{ 676 { 677 MimeTypes: []string{"text/json", "text/xml"}, 678 Address: "127.0.0.1:65535", 679 Name: "NOT_DEFAULT_PROVIDER2", 680 }, 681 { 682 MimeTypes: []string{"text/xml"}, 683 Address: "127.0.0.2:65535", 684 Name: "NOT_DEFAULT_PROVIDER1", 685 }, 686 { 687 MimeTypes: []string{"text/xml", "text/json"}, 688 Address: "127.0.0.3:65535", 689 Name: "JSON_DEFAULT_PROVIDER", 690 }, 691 { 692 MimeTypes: []string{"text/xml", "text/json"}, 693 Address: "127.0.0.4:65535", 694 Name: "XML_DEFAULT_PROVIDER", 695 }, 696 }, 697 expected: []*registrypb.MimeTypeInfo{ 698 { 699 MimeType: "text/json", 700 Ext: "json", 701 AppProviders: []*registrypb.ProviderInfo{ 702 { 703 MimeTypes: []string{"text/json", "text/xml"}, 704 Address: "127.0.0.1:65535", 705 Name: "NOT_DEFAULT_PROVIDER2", 706 }, 707 { 708 MimeTypes: []string{"text/xml", "text/json"}, 709 Address: "127.0.0.3:65535", 710 Name: "JSON_DEFAULT_PROVIDER", 711 }, 712 { 713 MimeTypes: []string{"text/xml", "text/json"}, 714 Address: "127.0.0.2:65535", 715 Name: "XML_DEFAULT_PROVIDER", 716 }, 717 }, 718 DefaultApplication: "JSON_DEFAULT_PROVIDER", 719 Name: "JSON File", 720 Icon: "https://example.org/icons&file=json.png", 721 }, 722 { 723 MimeType: "text/xml", 724 Ext: "xml", 725 AppProviders: []*registrypb.ProviderInfo{ 726 { 727 MimeTypes: []string{"text/json", "text/xml"}, 728 Address: "127.0.0.1:65535", 729 Name: "NOT_DEFAULT_PROVIDER2", 730 }, 731 { 732 MimeTypes: []string{"text/xml"}, 733 Address: "127.0.0.2:65535", 734 Name: "NOT_DEFAULT_PROVIDER1", 735 }, 736 { 737 MimeTypes: []string{"text/xml", "text/json"}, 738 Address: "127.0.0.3:65535", 739 Name: "JSON_DEFAULT_PROVIDER", 740 }, 741 { 742 MimeTypes: []string{"text/xml", "text/json"}, 743 Address: "127.0.0.4:65535", 744 Name: "XML_DEFAULT_PROVIDER", 745 }, 746 }, 747 DefaultApplication: "XML_DEFAULT_PROVIDER", 748 Name: "XML File", 749 Icon: "https://example.org/icons&file=xml.png", 750 }, 751 }, 752 }, 753 } 754 755 for _, tt := range testCases { 756 t.Run(tt.name, func(t *testing.T) { 757 758 ctx := context.TODO() 759 760 // add all the providers 761 for _, p := range tt.newProviders { 762 err := registerWithMicroReg(tt.registryNamespace, p) 763 if err != nil { 764 t.Fatal("unexpected error creating adding new providers:", err) 765 } 766 } 767 768 registry, err := New(map[string]interface{}{ 769 "mime_types": tt.mimeTypes, 770 "namespace": tt.registryNamespace, 771 }) 772 if err != nil { 773 t.Fatal("unexpected error creating the registry:", err) 774 } 775 776 got, err := registry.ListSupportedMimeTypes(ctx) 777 if err != nil { 778 t.Error("unexpected error listing supported mime types:", err) 779 } 780 781 if !mimeTypesEquals(got, tt.expected) { 782 t.Errorf("mime types list different from expected: \n\tgot=%v\n\texp=%v", got, tt.expected) 783 } 784 785 }) 786 } 787 } 788 789 func TestSetDefaultProviderForMimeType(t *testing.T) { 790 testCases := []struct { 791 name string 792 registryNamespace string 793 mimeTypes []*mimeTypeConfig 794 newDefault struct { 795 mimeType string 796 provider *registrypb.ProviderInfo 797 } 798 newProviders []*registrypb.ProviderInfo 799 }{ 800 { 801 name: "set new default - no new providers", 802 registryNamespace: "setNewDefaultNoNewProviders", 803 mimeTypes: []*mimeTypeConfig{ 804 { 805 MimeType: "text/json", 806 Extension: "json", 807 Name: "JSON File", 808 Icon: "https://example.org/icons&file=json.png", 809 DefaultApp: "JSON_DEFAULT_PROVIDER", 810 }, 811 }, 812 newProviders: []*registrypb.ProviderInfo{ 813 { 814 MimeTypes: []string{"text/json"}, 815 Address: "127.0.0.1:65535", 816 Name: "JSON_DEFAULT_PROVIDER", 817 }, 818 { 819 MimeTypes: []string{"text/json"}, 820 Address: "127.0.0.2:65535", 821 Name: "NEW_DEFAULT", 822 }, 823 }, 824 newDefault: struct { 825 mimeType string 826 provider *registrypb.ProviderInfo 827 }{ 828 mimeType: "text/json", 829 provider: ®istrypb.ProviderInfo{ 830 MimeTypes: []string{"text/json"}, 831 Address: "127.0.0.2:65535", 832 Name: "NEW_DEFAULT", 833 }, 834 }, 835 }, 836 { 837 name: "set default - other providers (one is the previous default)", 838 registryNamespace: "setDefaultOtherProvidersOneIsThePreviousDefault", 839 mimeTypes: []*mimeTypeConfig{ 840 { 841 MimeType: "text/json", 842 Extension: "json", 843 Name: "JSON File", 844 Icon: "https://example.org/icons&file=json.png", 845 DefaultApp: "JSON_DEFAULT_PROVIDER", 846 }, 847 }, 848 newProviders: []*registrypb.ProviderInfo{ 849 { 850 MimeTypes: []string{"text/json"}, 851 Address: "127.0.0.4:65535", 852 Name: "NO_DEFAULT_PROVIDER", 853 }, 854 { 855 MimeTypes: []string{"text/json"}, 856 Address: "127.0.0.2:65535", 857 Name: "NEW_DEFAULT", 858 }, 859 { 860 MimeTypes: []string{"text/json"}, 861 Address: "127.0.0.1:65535", 862 Name: "JSON_DEFAULT_PROVIDER", 863 }, 864 { 865 MimeTypes: []string{"text/json"}, 866 Address: "127.0.0.3:65535", 867 Name: "OTHER_PROVIDER", 868 }, 869 }, 870 newDefault: struct { 871 mimeType string 872 provider *registrypb.ProviderInfo 873 }{ 874 mimeType: "text/json", 875 provider: ®istrypb.ProviderInfo{ 876 MimeTypes: []string{"text/json"}, 877 Address: "127.0.0.2:65535", 878 Name: "NEW_DEFAULT", 879 }, 880 }, 881 }, 882 } 883 884 for _, tt := range testCases { 885 t.Run(tt.name, func(t *testing.T) { 886 887 ctx := context.TODO() 888 889 // add other provider to move things around internally :) 890 for _, p := range tt.newProviders { 891 err := registerWithMicroReg(tt.registryNamespace, p) 892 if err != nil { 893 t.Error("unexpected error adding a new provider:", err) 894 } 895 } 896 897 registry, err := New(map[string]interface{}{ 898 "mime_types": tt.mimeTypes, 899 "namespace": tt.registryNamespace, 900 }) 901 if err != nil { 902 t.Error("unexpected error creating a new registry:", err) 903 } 904 905 err = registry.SetDefaultProviderForMimeType(ctx, tt.newDefault.mimeType, tt.newDefault.provider) 906 if err != nil { 907 t.Error("unexpected error setting a default provider for mime type:", err) 908 } 909 910 // check if the new default is the one set 911 got, err := registry.GetDefaultProviderForMimeType(ctx, tt.newDefault.mimeType) 912 if err != nil { 913 t.Error("unexpected error getting the default app provider:", err) 914 } 915 916 if !equalsProviderInfo(got, tt.newDefault.provider) { 917 t.Errorf("provider differ from expected:\n\tgot=%v\n\texp=%v", got, tt.newDefault.provider) 918 } 919 920 }) 921 } 922 } 923 924 func equalsMimeTypeInfo(m1, m2 *registrypb.MimeTypeInfo) bool { 925 return m1.Description == m2.Description && 926 m1.AllowCreation == m2.AllowCreation && 927 providersEquals(m1.AppProviders, m2.AppProviders) && 928 m1.Ext == m2.Ext && 929 m1.MimeType == m2.MimeType && 930 m1.Name == m2.Name && 931 m1.DefaultApplication == m2.DefaultApplication 932 } 933 934 func mimeTypesEquals(l1, l2 []*registrypb.MimeTypeInfo) bool { 935 if len(l1) != len(l2) { 936 return false 937 } 938 939 if len(l1) < 1 && len(l2) < 1 { 940 return true 941 } 942 943 for _, left := range l1 { 944 for _, right := range l2 { 945 if equalsMimeTypeInfo(left, right) { 946 return true 947 } 948 } 949 } 950 951 return false 952 } 953 954 // check that all providers in the two lists are equals 955 func providersEquals(pi1, pi2 []*registrypb.ProviderInfo) bool { 956 if len(pi1) != len(pi2) { 957 return false 958 } 959 960 if len(pi1) < 1 && len(pi2) < 1 { 961 return true 962 } 963 964 for _, left := range pi1 { 965 for _, right := range pi2 { 966 if equalsProviderInfo(left, right) { 967 return true 968 } 969 } 970 } 971 972 return false 973 } 974 975 // This is to mock registering with the go-micro registry and at the same time the reference implementation 976 func registerWithMicroReg(ns string, p *registrypb.ProviderInfo) error { 977 o := oreg.Inmemory() 978 979 reg := oreg.GetRegistry(o) 980 981 serviceID := ns + ".api.app-provider" 982 983 node := &mreg.Node{ 984 Id: serviceID + "-" + uuid.New().String(), 985 Address: p.Address, 986 Metadata: make(map[string]string), 987 } 988 989 node.Metadata["registry"] = reg.String() 990 node.Metadata["server"] = "grpc" 991 node.Metadata["transport"] = "grpc" 992 node.Metadata["protocol"] = "grpc" 993 994 node.Metadata[ns+".app-provider.mime_type"] = joinMimeTypes(p.MimeTypes) 995 node.Metadata[ns+".app-provider.name"] = p.Name 996 node.Metadata[ns+".app-provider.description"] = p.Description 997 node.Metadata[ns+".app-provider.icon"] = p.Icon 998 999 node.Metadata[ns+".app-provider.allow_creation"] = registrypb.ProviderInfo_Capability_name[int32(p.Capability)] 1000 node.Metadata[ns+".app-provider.priority"] = getPriority(p) 1001 if p.DesktopOnly { 1002 node.Metadata[ns+".app-provider.desktop_only"] = "true" 1003 } 1004 1005 service := &mreg.Service{ 1006 Name: serviceID, 1007 //Version: version, 1008 Nodes: []*mreg.Node{node}, 1009 Endpoints: make([]*mreg.Endpoint, 0), 1010 } 1011 1012 rOpts := []mreg.RegisterOption{mreg.RegisterTTL(time.Minute)} 1013 if err := reg.Register(service, rOpts...); err != nil { 1014 return err 1015 } 1016 1017 return nil 1018 }