|
|
@@ -0,0 +1,318 @@
|
|
|
+package oracle
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/opencost/opencost/core/pkg/log"
|
|
|
+ "github.com/opencost/opencost/core/pkg/util/json"
|
|
|
+ "github.com/opencost/opencost/pkg/cloud"
|
|
|
+)
|
|
|
+
|
|
|
+func TestUsageApiConfiguration_Validate(t *testing.T) {
|
|
|
+ testCases := map[string]struct {
|
|
|
+ config UsageApiConfiguration
|
|
|
+ expected error
|
|
|
+ }{
|
|
|
+ "valid config OCI Key": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: nil,
|
|
|
+ },
|
|
|
+ "invalid authorizer": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "",
|
|
|
+ PrivateKey: "",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: fmt.Errorf("UsageApiConfiguration: RawConfigProvider: missing key fingerprint"),
|
|
|
+ },
|
|
|
+ "missing authorizer": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ expected: fmt.Errorf("UsageApiConfiguration: missing Authorizer"),
|
|
|
+ },
|
|
|
+ "missing tenancyID": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: fmt.Errorf("UsageApiConfiguration: missing tenancyID"),
|
|
|
+ },
|
|
|
+ "missing region": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: fmt.Errorf("UsageApiConfiguration: missing region"),
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for name, testCase := range testCases {
|
|
|
+ t.Run(name, func(t *testing.T) {
|
|
|
+ actual := testCase.config.Validate()
|
|
|
+ actualString := "nil"
|
|
|
+ if actual != nil {
|
|
|
+ actualString = actual.Error()
|
|
|
+ }
|
|
|
+ expectedString := "nil"
|
|
|
+ if testCase.expected != nil {
|
|
|
+ expectedString = testCase.expected.Error()
|
|
|
+ }
|
|
|
+ if actualString != expectedString {
|
|
|
+ t.Errorf("errors do not match: Actual: '%s', Expected: '%s", actualString, expectedString)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestUsageApiConfiguration_Equals(t *testing.T) {
|
|
|
+ testCases := map[string]struct {
|
|
|
+ left UsageApiConfiguration
|
|
|
+ right cloud.Config
|
|
|
+ expected bool
|
|
|
+ }{
|
|
|
+ "matching config": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: true,
|
|
|
+ },
|
|
|
+ "different configurer": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint2",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: false,
|
|
|
+ },
|
|
|
+ "missing both configurer": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ expected: true,
|
|
|
+ },
|
|
|
+ "missing left configurer": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: false,
|
|
|
+ },
|
|
|
+ "missing right configurer": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ expected: false,
|
|
|
+ },
|
|
|
+ "different tenancyID": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID2",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID2",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: false,
|
|
|
+ },
|
|
|
+ "different region": {
|
|
|
+ left: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ right: &UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region2",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region2",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expected: false,
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for name, testCase := range testCases {
|
|
|
+ t.Run(name, func(t *testing.T) {
|
|
|
+ actual := testCase.left.Equals(testCase.right)
|
|
|
+ if actual != testCase.expected {
|
|
|
+ t.Errorf("incorrect result: Actual: '%t', Expected: '%t", actual, testCase.expected)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestUsageApiConfiguration_JSON(t *testing.T) {
|
|
|
+ testCases := map[string]struct {
|
|
|
+ config UsageApiConfiguration
|
|
|
+ }{
|
|
|
+ "Empty Config": {
|
|
|
+ config: UsageApiConfiguration{},
|
|
|
+ },
|
|
|
+ "Nil Authorizer": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: nil,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ "RawConfigProviderAuthorizer": {
|
|
|
+ config: UsageApiConfiguration{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ Region: "region",
|
|
|
+ Authorizer: &RawConfigProvider{
|
|
|
+ TenancyID: "tenancyID",
|
|
|
+ UserID: "userID",
|
|
|
+ Region: "region2",
|
|
|
+ Fingerprint: "fingerprint",
|
|
|
+ PrivateKey: "key",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for name, testCase := range testCases {
|
|
|
+ t.Run(name, func(t *testing.T) {
|
|
|
+
|
|
|
+ // test JSON Marshalling
|
|
|
+ configJSON, err := json.Marshal(testCase.config)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("failed to marshal configuration: %s", err.Error())
|
|
|
+ }
|
|
|
+ log.Info(string(configJSON))
|
|
|
+ unmarshalledConfig := &UsageApiConfiguration{}
|
|
|
+ err = json.Unmarshal(configJSON, unmarshalledConfig)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("failed to unmarshal configuration: %s", err.Error())
|
|
|
+ }
|
|
|
+ if !testCase.config.Equals(unmarshalledConfig) {
|
|
|
+ t.Error("config does not equal unmarshalled config")
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|