github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/resources_mongo_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state
     5  
     6  import (
     7  	"strings"
     8  
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	charmresource "gopkg.in/juju/charm.v6-unstable/resource"
    13  
    14  	"github.com/juju/juju/resource"
    15  	coretesting "github.com/juju/juju/testing"
    16  )
    17  
    18  type ResourcesMongoSuite struct {
    19  	testing.IsolationSuite
    20  }
    21  
    22  var _ = gc.Suite(&ResourcesMongoSuite{})
    23  
    24  func (s *ResourcesMongoSuite) TestResource2DocUploadFull(c *gc.C) {
    25  	content := "some data\n..."
    26  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
    27  	c.Assert(err, jc.ErrorIsNil)
    28  	now := coretesting.ZeroTime()
    29  
    30  	applicationID := "a-application"
    31  	docID := applicationResourceID("spam")
    32  	res := resource.Resource{
    33  		Resource: charmresource.Resource{
    34  			Meta: charmresource.Meta{
    35  				Name:        "spam",
    36  				Type:        charmresource.TypeFile,
    37  				Path:        "spam.tgz",
    38  				Description: "you need this!",
    39  			},
    40  			Origin:      charmresource.OriginUpload,
    41  			Revision:    0,
    42  			Fingerprint: fp,
    43  			Size:        int64(len(content)),
    44  		},
    45  		ID:            applicationID + "/spam",
    46  		PendingID:     "some-unique-ID",
    47  		ApplicationID: applicationID,
    48  		Username:      "a-user",
    49  		Timestamp:     now,
    50  	}
    51  	doc := resource2doc(docID, storedResource{
    52  		Resource:    res,
    53  		storagePath: "application-a-application/resources/spam",
    54  	})
    55  
    56  	c.Check(doc, jc.DeepEquals, &resourceDoc{
    57  		DocID:         docID,
    58  		ID:            res.ID,
    59  		PendingID:     "some-unique-ID",
    60  		ApplicationID: applicationID,
    61  
    62  		Name:        "spam",
    63  		Type:        "file",
    64  		Path:        "spam.tgz",
    65  		Description: "you need this!",
    66  
    67  		Origin:      "upload",
    68  		Revision:    0,
    69  		Fingerprint: fp.Bytes(),
    70  		Size:        int64(len(content)),
    71  
    72  		Username:  "a-user",
    73  		Timestamp: now,
    74  
    75  		StoragePath: "application-a-application/resources/spam",
    76  	})
    77  }
    78  
    79  func (s *ResourcesMongoSuite) TestResource2DocUploadBasic(c *gc.C) {
    80  	content := "some data\n..."
    81  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	now := coretesting.ZeroTime()
    84  
    85  	applicationID := "a-application"
    86  	docID := applicationResourceID("spam")
    87  	res := resource.Resource{
    88  		Resource: charmresource.Resource{
    89  			Meta: charmresource.Meta{
    90  				Name: "spam",
    91  				Type: charmresource.TypeFile,
    92  				Path: "spam.tgz",
    93  			},
    94  			Origin:      charmresource.OriginUpload,
    95  			Fingerprint: fp,
    96  			Size:        int64(len(content)),
    97  		},
    98  		ID:            applicationID + "/spam",
    99  		ApplicationID: applicationID,
   100  		Username:      "a-user",
   101  		Timestamp:     now,
   102  	}
   103  	doc := resource2doc(docID, storedResource{
   104  		Resource:    res,
   105  		storagePath: "application-a-application/resources/spam",
   106  	})
   107  
   108  	c.Check(doc, jc.DeepEquals, &resourceDoc{
   109  		DocID:         docID,
   110  		ID:            res.ID,
   111  		ApplicationID: applicationID,
   112  
   113  		Name: "spam",
   114  		Type: "file",
   115  		Path: "spam.tgz",
   116  
   117  		Origin:      "upload",
   118  		Fingerprint: fp.Bytes(),
   119  		Size:        int64(len(content)),
   120  
   121  		Username:  "a-user",
   122  		Timestamp: now,
   123  
   124  		StoragePath: "application-a-application/resources/spam",
   125  	})
   126  }
   127  
   128  func (s *ResourcesMongoSuite) TestResource2DocUploadPending(c *gc.C) {
   129  	content := "some data\n..."
   130  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   131  	c.Assert(err, jc.ErrorIsNil)
   132  	now := coretesting.ZeroTime()
   133  
   134  	applicationID := "a-application"
   135  	docID := pendingResourceID("spam", "some-unique-ID-001")
   136  	res := resource.Resource{
   137  		Resource: charmresource.Resource{
   138  			Meta: charmresource.Meta{
   139  				Name: "spam",
   140  				Type: charmresource.TypeFile,
   141  				Path: "spam.tgz",
   142  			},
   143  			Origin:      charmresource.OriginUpload,
   144  			Fingerprint: fp,
   145  			Size:        int64(len(content)),
   146  		},
   147  		ID:            applicationID + "/spam",
   148  		PendingID:     "some-unique-ID-001",
   149  		ApplicationID: applicationID,
   150  		Username:      "a-user",
   151  		Timestamp:     now,
   152  	}
   153  	doc := resource2doc(docID, storedResource{
   154  		Resource:    res,
   155  		storagePath: "application-a-application/resources/spam",
   156  	})
   157  
   158  	c.Check(doc, jc.DeepEquals, &resourceDoc{
   159  		DocID:         docID,
   160  		ID:            res.ID,
   161  		PendingID:     "some-unique-ID-001",
   162  		ApplicationID: applicationID,
   163  
   164  		Name: "spam",
   165  		Type: "file",
   166  		Path: "spam.tgz",
   167  
   168  		Origin:      "upload",
   169  		Fingerprint: fp.Bytes(),
   170  		Size:        int64(len(content)),
   171  
   172  		Username:  "a-user",
   173  		Timestamp: now,
   174  
   175  		StoragePath: "application-a-application/resources/spam",
   176  	})
   177  }
   178  
   179  func (s *ResourcesMongoSuite) TestDoc2Resource(c *gc.C) {
   180  	applicationID := "a-application"
   181  	docID := pendingResourceID("spam", "some-unique-ID-001")
   182  	content := "some data\n..."
   183  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   184  	c.Assert(err, jc.ErrorIsNil)
   185  	now := coretesting.NonZeroTime()
   186  
   187  	res, err := doc2resource(resourceDoc{
   188  		DocID:         docID,
   189  		ID:            "a-application/spam",
   190  		PendingID:     "some-unique-ID-001",
   191  		ApplicationID: applicationID,
   192  
   193  		Name: "spam",
   194  		Type: "file",
   195  		Path: "spam.tgz",
   196  
   197  		Origin:      "upload",
   198  		Fingerprint: fp.Bytes(),
   199  		Size:        int64(len(content)),
   200  
   201  		Username:  "a-user",
   202  		Timestamp: now,
   203  
   204  		StoragePath: "application-a-application/resources/spam-some-unique-ID-001",
   205  	})
   206  	c.Assert(err, jc.ErrorIsNil)
   207  
   208  	c.Check(res, jc.DeepEquals, storedResource{
   209  		Resource: resource.Resource{
   210  			Resource: charmresource.Resource{
   211  				Meta: charmresource.Meta{
   212  					Name: "spam",
   213  					Type: charmresource.TypeFile,
   214  					Path: "spam.tgz",
   215  				},
   216  				Origin:      charmresource.OriginUpload,
   217  				Fingerprint: fp,
   218  				Size:        int64(len(content)),
   219  			},
   220  			ID:            "a-application/spam",
   221  			PendingID:     "some-unique-ID-001",
   222  			ApplicationID: applicationID,
   223  			Username:      "a-user",
   224  			Timestamp:     now,
   225  		},
   226  		storagePath: "application-a-application/resources/spam-some-unique-ID-001",
   227  	})
   228  }
   229  
   230  func (s *ResourcesMongoSuite) TestDoc2BasicResourceUploadFull(c *gc.C) {
   231  	applicationID := "a-application"
   232  	docID := pendingResourceID("spam", "some-unique-ID-001")
   233  	content := "some data\n..."
   234  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   235  	c.Assert(err, jc.ErrorIsNil)
   236  	now := coretesting.NonZeroTime()
   237  
   238  	res, err := doc2basicResource(resourceDoc{
   239  		DocID:         docID,
   240  		ID:            "a-application/spam",
   241  		ApplicationID: applicationID,
   242  		PendingID:     "some-unique-ID-001",
   243  
   244  		Name:        "spam",
   245  		Type:        "file",
   246  		Path:        "spam.tgz",
   247  		Description: "you need this!",
   248  
   249  		Origin:      "upload",
   250  		Revision:    0,
   251  		Fingerprint: fp.Bytes(),
   252  		Size:        int64(len(content)),
   253  
   254  		Username:  "a-user",
   255  		Timestamp: now,
   256  
   257  		StoragePath: "application-a-application/resources/spam",
   258  	})
   259  	c.Assert(err, jc.ErrorIsNil)
   260  
   261  	c.Check(res, jc.DeepEquals, resource.Resource{
   262  		Resource: charmresource.Resource{
   263  			Meta: charmresource.Meta{
   264  				Name:        "spam",
   265  				Type:        charmresource.TypeFile,
   266  				Path:        "spam.tgz",
   267  				Description: "you need this!",
   268  			},
   269  			Origin:      charmresource.OriginUpload,
   270  			Revision:    0,
   271  			Fingerprint: fp,
   272  			Size:        int64(len(content)),
   273  		},
   274  		ID:            "a-application/spam",
   275  		PendingID:     "some-unique-ID-001",
   276  		ApplicationID: applicationID,
   277  		Username:      "a-user",
   278  		Timestamp:     now,
   279  	})
   280  }
   281  
   282  func (s *ResourcesMongoSuite) TestDoc2BasicResourceUploadBasic(c *gc.C) {
   283  	applicationID := "a-application"
   284  	docID := applicationResourceID("spam")
   285  	content := "some data\n..."
   286  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   287  	c.Assert(err, jc.ErrorIsNil)
   288  	now := coretesting.NonZeroTime()
   289  
   290  	res, err := doc2basicResource(resourceDoc{
   291  		DocID:         docID,
   292  		ID:            "a-application/spam",
   293  		ApplicationID: applicationID,
   294  
   295  		Name: "spam",
   296  		Type: "file",
   297  		Path: "spam.tgz",
   298  
   299  		Origin:      "upload",
   300  		Fingerprint: fp.Bytes(),
   301  		Size:        int64(len(content)),
   302  
   303  		Username:  "a-user",
   304  		Timestamp: now,
   305  
   306  		StoragePath: "application-a-application/resources/spam",
   307  	})
   308  	c.Assert(err, jc.ErrorIsNil)
   309  
   310  	c.Check(res, jc.DeepEquals, resource.Resource{
   311  		Resource: charmresource.Resource{
   312  			Meta: charmresource.Meta{
   313  				Name: "spam",
   314  				Type: charmresource.TypeFile,
   315  				Path: "spam.tgz",
   316  			},
   317  			Origin:      charmresource.OriginUpload,
   318  			Fingerprint: fp,
   319  			Size:        int64(len(content)),
   320  		},
   321  		ID:            "a-application/spam",
   322  		ApplicationID: applicationID,
   323  		Username:      "a-user",
   324  		Timestamp:     now,
   325  	})
   326  }
   327  
   328  func (s *ResourcesMongoSuite) TestResource2DocCharmstoreFull(c *gc.C) {
   329  	content := "some data\n..."
   330  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   331  	c.Assert(err, jc.ErrorIsNil)
   332  	now := coretesting.ZeroTime()
   333  
   334  	applicationID := "a-application"
   335  	docID := applicationResourceID("spam")
   336  	res := resource.Resource{
   337  		Resource: charmresource.Resource{
   338  			Meta: charmresource.Meta{
   339  				Name:        "spam",
   340  				Type:        charmresource.TypeFile,
   341  				Path:        "spam.tgz",
   342  				Description: "you need this!",
   343  			},
   344  			Origin:      charmresource.OriginStore,
   345  			Revision:    5,
   346  			Fingerprint: fp,
   347  			Size:        int64(len(content)),
   348  		},
   349  		ID:            "a-application/spam",
   350  		PendingID:     "some-unique-ID",
   351  		ApplicationID: applicationID,
   352  		Username:      "a-user",
   353  		Timestamp:     now,
   354  	}
   355  	doc := resource2doc(docID, storedResource{
   356  		Resource:    res,
   357  		storagePath: "application-a-application/resources/spam",
   358  	})
   359  
   360  	c.Check(doc, jc.DeepEquals, &resourceDoc{
   361  		DocID:     docID,
   362  		ID:        res.ID,
   363  		PendingID: "some-unique-ID",
   364  
   365  		ApplicationID: applicationID,
   366  
   367  		Name:        "spam",
   368  		Type:        "file",
   369  		Path:        "spam.tgz",
   370  		Description: "you need this!",
   371  
   372  		Origin:      "store",
   373  		Revision:    5,
   374  		Fingerprint: fp.Bytes(),
   375  		Size:        int64(len(content)),
   376  
   377  		Username:  "a-user",
   378  		Timestamp: now,
   379  
   380  		StoragePath: "application-a-application/resources/spam",
   381  	})
   382  }
   383  
   384  func (s *ResourcesMongoSuite) TestDoc2BasicResourceCharmstoreFull(c *gc.C) {
   385  	applicationID := "a-application"
   386  	docID := applicationResourceID("spam")
   387  	content := "some data\n..."
   388  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   389  	c.Assert(err, jc.ErrorIsNil)
   390  	now := coretesting.NonZeroTime()
   391  
   392  	res, err := doc2basicResource(resourceDoc{
   393  		DocID:     docID,
   394  		ID:        "a-application/spam",
   395  		PendingID: "some-unique-ID",
   396  
   397  		ApplicationID: applicationID,
   398  
   399  		Name:        "spam",
   400  		Type:        "file",
   401  		Path:        "spam.tgz",
   402  		Description: "you need this!",
   403  
   404  		Origin:      "store",
   405  		Revision:    5,
   406  		Fingerprint: fp.Bytes(),
   407  		Size:        int64(len(content)),
   408  
   409  		Username:  "a-user",
   410  		Timestamp: now,
   411  
   412  		StoragePath: "application-a-application/resources/spam",
   413  	})
   414  	c.Assert(err, jc.ErrorIsNil)
   415  
   416  	c.Check(res, jc.DeepEquals, resource.Resource{
   417  		Resource: charmresource.Resource{
   418  			Meta: charmresource.Meta{
   419  				Name:        "spam",
   420  				Type:        charmresource.TypeFile,
   421  				Path:        "spam.tgz",
   422  				Description: "you need this!",
   423  			},
   424  			Origin:      charmresource.OriginStore,
   425  			Revision:    5,
   426  			Fingerprint: fp,
   427  			Size:        int64(len(content)),
   428  		},
   429  		ID:            "a-application/spam",
   430  		PendingID:     "some-unique-ID",
   431  		ApplicationID: applicationID,
   432  		Username:      "a-user",
   433  		Timestamp:     now,
   434  	})
   435  }
   436  
   437  func (s *ResourcesMongoSuite) TestDoc2BasicResourcePlaceholder(c *gc.C) {
   438  	applicationID := "a-application"
   439  	docID := applicationResourceID("spam")
   440  	res, err := doc2basicResource(resourceDoc{
   441  		DocID:         docID,
   442  		ID:            "a-application/spam",
   443  		ApplicationID: applicationID,
   444  
   445  		Name: "spam",
   446  		Type: "file",
   447  		Path: "spam.tgz",
   448  
   449  		Origin: "upload",
   450  
   451  		StoragePath: "application-a-application/resources/spam",
   452  	})
   453  	c.Assert(err, jc.ErrorIsNil)
   454  
   455  	c.Check(res, jc.DeepEquals, resource.Resource{
   456  		Resource: charmresource.Resource{
   457  			Meta: charmresource.Meta{
   458  				Name: "spam",
   459  				Type: charmresource.TypeFile,
   460  				Path: "spam.tgz",
   461  			},
   462  			Origin: charmresource.OriginUpload,
   463  		},
   464  		ID:            "a-application/spam",
   465  		ApplicationID: applicationID,
   466  	})
   467  }
   468  
   469  func (s *ResourcesMongoSuite) TestResource2DocLocalPlaceholder(c *gc.C) {
   470  	applicationID := "a-application"
   471  	docID := applicationResourceID("spam")
   472  	res := resource.Resource{
   473  		Resource: charmresource.Resource{
   474  			Meta: charmresource.Meta{
   475  				Name: "spam",
   476  				Type: charmresource.TypeFile,
   477  				Path: "spam.tgz",
   478  			},
   479  			Origin: charmresource.OriginUpload,
   480  		},
   481  		ID:            "a-application/spam",
   482  		ApplicationID: applicationID,
   483  	}
   484  	doc := resource2doc(docID, storedResource{
   485  		Resource:    res,
   486  		storagePath: "application-a-application/resources/spam",
   487  	})
   488  
   489  	c.Check(doc, jc.DeepEquals, &resourceDoc{
   490  		DocID:         docID,
   491  		ID:            res.ID,
   492  		ApplicationID: applicationID,
   493  
   494  		Name: "spam",
   495  		Type: "file",
   496  		Path: "spam.tgz",
   497  
   498  		Origin: "upload",
   499  
   500  		StoragePath: "application-a-application/resources/spam",
   501  	})
   502  }
   503  
   504  func (s *ResourcesMongoSuite) TestCharmStoreResource2DocFull(c *gc.C) {
   505  	content := "some data\n..."
   506  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   507  	c.Assert(err, jc.ErrorIsNil)
   508  	now := coretesting.ZeroTime()
   509  
   510  	applicationID := "a-application"
   511  	id := applicationID + "/spam"
   512  	docID := applicationResourceID("spam") + "#charmstore"
   513  	res := charmresource.Resource{
   514  		Meta: charmresource.Meta{
   515  			Name:        "spam",
   516  			Type:        charmresource.TypeFile,
   517  			Path:        "spam.tgz",
   518  			Description: "you need this!",
   519  		},
   520  		Origin:      charmresource.OriginStore,
   521  		Revision:    3,
   522  		Fingerprint: fp,
   523  		Size:        int64(len(content)),
   524  	}
   525  	doc := charmStoreResource2Doc(docID, charmStoreResource{
   526  		Resource:      res,
   527  		id:            id,
   528  		applicationID: applicationID,
   529  		lastPolled:    now,
   530  	})
   531  
   532  	c.Check(doc, jc.DeepEquals, &resourceDoc{
   533  		DocID:         docID,
   534  		ID:            id,
   535  		ApplicationID: applicationID,
   536  
   537  		Name:        "spam",
   538  		Type:        "file",
   539  		Path:        "spam.tgz",
   540  		Description: "you need this!",
   541  
   542  		Origin:      "store",
   543  		Revision:    3,
   544  		Fingerprint: fp.Bytes(),
   545  		Size:        int64(len(content)),
   546  
   547  		LastPolled: now,
   548  	})
   549  }