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: &registrypb.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: &registrypb.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  }