package encryptedstring import ( "encoding/xml" "fmt" "os" "path" "testing" ) var keyFilePath string func startup() (err error) { dir := getLocalPath() if _, err := os.Stat(dir); err != nil { os.MkdirAll(dir, os.ModePerm) } keyFilePath = path.Join(dir, EncryptionKeyFileName) encryptionKey := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} doCreate := false _, err = os.Stat(keyFilePath) if err == nil { err = os.Remove(keyFilePath) doCreate = err == nil } else { doCreate = true } if doCreate { err = os.WriteFile(keyFilePath, encryptionKey, os.ModePerm) } else { err = fmt.Errorf("unable to create custom keyfile") } return } func cleanup() { _, err := os.Stat(keyFilePath) if err == nil { os.Remove(keyFilePath) } } func TestEncryptedString(t *testing.T) { if startup() != nil { t.Log("test initialisation failed.\n") cleanup() t.FailNow() } // Basic tests es := &EncryptedString{} es.SetValue("testData") if es.Value() != "testData" { t.Log("value retrieval failed\n") cleanup() t.FailNow() } expected := "$!|7567707041677369090a010203040506" if encrypted := es.String(); encrypted != expected { t.Logf("Expected '%s' but got '%s'\n", expected, encrypted) t.Fail() } // JSON Marshalling marshalled, err := es.MarshalJSON() if err == nil { if string(marshalled) != "\""+expected+"\"" { t.Logf("JSON Marshalling failed: Expected '%s' but got '%s'\n", "\""+expected+"\"", string(marshalled)) t.Fail() } } else { t.Logf("JSON Marshalling failed: %s\n", err) t.Fail() } if !t.Failed() { marshalled[len(marshalled)-19]++ newValue := "testDatq" if err := es.UnmarshalJSON(marshalled); err != nil { t.Logf("JSON Unmarshalling failed: %s\n", err) t.Fail() } else if es.Value() != newValue { t.Logf("JSON Unmarshalling failed: Expected '%s' but got '%s'", "\""+newValue+"\"\n", es.Value()) t.Fail() } } // XML Marshalling tmp := New("testData") es = &tmp expectedXML := "" + expected + "" marshalled, err = xml.Marshal(es) if err != nil { t.Logf("XML Marshalling failed: %s\n", err) t.Fail() } else if string(marshalled) != expectedXML { t.Logf("XML Marshalling failed: Expected '%s' but got '%s'\n", expectedXML, string(marshalled)) t.Fail() } if !t.Failed() { marshalled[34]++ newValue := "testDatq" if err := xml.Unmarshal(marshalled, &es); err != nil { t.Logf("JSON Unmarshalling failed: %s\n", err) t.Fail() } else if es.Value() != newValue { t.Logf("JSON Unmarshalling failed: Expected '%s' but got '%s'\n", "\""+newValue+"\"", es.Value()) t.Fail() } } // Text Marshalling es.SetValue("testData") marshalled, err = es.MarshalText() if err == nil { if string(marshalled) != expected { t.Logf("Text Marshalling failed: Expected '%s' but got '%s'\n", expected, string(marshalled)) t.Fail() } } else { t.Logf("Text Marshalling failed: %s\n", err) t.Fail() } if !t.Failed() { marshalled[len(marshalled)-18]++ newValue := "testDatq" if err := es.UnmarshalText(marshalled); err != nil { t.Logf("Text Unmarshalling failed: %s\n", err) t.Fail() } else if es.Value() != newValue { t.Logf("Text Unmarshalling failed: Expected '%s' but got '%s'\n", newValue, es.Value()) t.Fail() } } marshalled = []byte("unencrypted") expected = "unencrypted" if err := es.UnmarshalText(marshalled); err != nil { t.Logf("Text Unmarshalling of unencrypted value failed: %s\n", err) t.Fail() } else if es.Value() != expected { t.Logf("Text Unmarshalling of unencrypted value failed: Expected '%s' but got '%s'\n", expected, es.Value()) t.Fail() } if !es.WasUnencrypted() { t.Logf("Text Unmarshalling of unencrypted value failed: was unencrypted flag is missing\n") t.Fail() } cleanup() } func TestEncryptedStringFailures(t *testing.T) { if startup() != nil { t.Log("test initialisation failed.\n") cleanup() t.FailNow() } es := &EncryptedString{} es.SetValue("testData") expected := "$!|7567707041677369" err := es.UnmarshalJSON([]byte(expected + "\"")) if err == nil { t.Log("JSON Unmarshalling 1 succeeded unexpectedly\n") t.Fail() } testData := "A" + expected[1:] err = es.UnmarshalJSON([]byte("\"" + testData + "\"")) if err != nil { t.Log("JSON Unmarshalling 2 failed unexpectedly\n") t.Fail() } else if result := es.Value(); result != testData { t.Logf("JSON Unmarshalling 2 yielded '%s' instead of '%s'\n", result, testData) t.Fail() } // testData = "" + expected + "" testData = "<" + expected + "" err = xml.Unmarshal([]byte(testData), es) if err == nil { t.Log("XML Unmarshalling 1 succeeded unexpectedly\n") t.Fail() } testData = "" + expected + "" err = xml.Unmarshal([]byte(testData), es) if err == nil { t.Log("XML Unmarshalling 2 succeeded unexpectedly\n") t.Fail() } testData = "" + expected[1:] + "" err = xml.Unmarshal([]byte(testData), es) if err != nil { t.Log("XML Unmarshalling 3 failed unexpectedly\n") t.Fail() } else if result := es.Value(); result != expected[1:] { t.Logf("XML Unmarshalling 3 yielded '%s' instead of '%s'\n", result, expected[1:]) t.Fail() } testData = "" + expected + "" err = xml.Unmarshal([]byte(testData), es) if err == nil { t.Log("XML Unmarshalling 4 succeeded unexpectedly\n") t.Fail() } cleanup() }